OmniAICreator/Qiita-1.07M huggingface dataset:
第11回オフラインリアルタイムどう書く C99 による実装

オフラインリアルタイムどう書く
http://atnd.org/events/38770
の、問題(ビットあみだくじ)
http://nabetani.sakura.ne.jp/hena/ord11bitamida/
の、C言語(C99) による実装

当日その場で書いたもの。
とはいえ、私は出題者なので公平じゃない。

他の言語などの解答例は
http://qiita.com/items/93cde1a6b7561426a3ac
から辿れます。

で。
こんな感じ。

```c:solver.c
// compiled with "clang -std=c99 -Wall solver.c"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

struct amida
{
  int m[5];
};

struct amida build_amida( char const * src  )
{
  struct amida a;
  for( int i=0 ; i<4 ; ++i ){
    a.m[i+1] = strtol( src+i*3, 0, 16 );
  }
  a.m[0]=-1; // Sentinel
  return a;
}

int previous_pos( int m, int i )
{
  _Bool left = m & ( 1<<(8-i));
  _Bool right = m & ( 1<<(7-i));
  if ( left && ! right ){
    for( ; m & ( 1<<(8-i)) ; --i );
    return i;
  }
  if ( right && ! left ){
    for( ; m & ( 1<<(7-i)) ; ++i );
    return i;
  }
  assert( right == left );
  return i;
}

int trace_amida( const int * m, int i, int d )
{
  if ( *m<0 ){
    return i;
  }
  return trace_amida( m-1, previous_pos( *m, i ), d-1 );
}

#define COUNT_OF( a )  (sizeof(a) / sizeof( *(a) ) )
#define LAST_OF( a ) ( (a) + COUNT_OF(a)-1 )

void solve( char const * src, char * r )
{
  struct amida a = build_amida( src );
  for( int i=0 ; i<=8 ; ++i ){
    r[i]=trace_amida( LAST_OF(a.m), i,3 )+'0';
  }
}

void test( char const * src, char const * expected )
{
  char actual[10]={0};
  solve( src, actual );
  _Bool ok = 0==strcmp( actual, expected );
  printf( "%s %s -> %s ( %s )\n",
    ok ? "ok" : "***NG***", 
    src, actual, expected );
}

int main()
{
/*0*/ test( "d6-7b-e1-9e", "740631825" );
/*1*/ test( "83-4c-20-10", "123805476" );
/*41*/ test( "6f-dd-ff-ff", "230685147" );
  return 0;
}
```

いつもどおり、テストデータの大半を省略。

今回は、下から順に、1つずつ処理、という方針で。

あみだくじが4段と決まっているので遠慮なく再帰を使った。
せっかくC言語なのでポインタを使ってみたら、やめどきを判断する材料を失ったので番兵を用意した。

処理を追いやすい感じになっているつもりなんだけど、どうだろう。
vagrantでawsのインスタンスを起動しようとしたときに、getaddrinfo: nodename nor servname provided, or not known (SocketError)と出る件


[naoya氏のblog](http://d.hatena.ne.jp/naoya/20130315/1363340698)を見ながら、vagrantでawsインスタンスの起動をしようとしたら、

```
vagrant up --provider=aws
```
した途端に

```
getaddrinfo: nodename nor servname provided, or not known (SocketError)
```
などと出てうまくいかなかったが、原因はVagrantfileのaws.regionを

```ruby:
aws.region = "ap-northeast-1a"
```
としていたことだった。
正しくはこう。

```ruby:
aws.region = "ap-northeast-1"
```

あと、vagrant upしたあと

```
Waiting for SSH to become available...
```

と表示されてから進まなくなった場合、sshの設定漏れの可能性がある
下記githubを参考に

```ruby:
  config.vm.provider :aws do |aws, override|
(略)
    override.ssh.username = "ubuntu"
    override.ssh.private_key_path = "PATH TO YOUR PRIVATE KEY"
  end
```

こんな感じに設定する


### 参考
- https://groups.google.com/forum/?fromgroups#!topic/vagrant-up/Awn2HaQeSck
- https://github.com/mitchellh/vagrant-aws
My screenrc


* 某所で「一番使わないキーはWindowsキー」とあったが、私はファンクションキーだと思ってる
* 大半の操作を左手で終わらせたい
* 集中すると時間を忘れるよね～

上記理由により・・・

* 窓移動はファンクションキーの１～９に割り当て
* コントロールはZキーを指定
* 右下に時計出しちゃえ

ってな感じの.screenrcです。
普通すぎるよね・・・こんなの。

```shell-session:.screenrc
escape ^z^z
deflogin off
startup_message off

# emulate .logout message
pow_detach_msg "Screen session of \$LOGNAME \$:cr:\$:nl:ended."

# no annoying audible bell, please
vbell off
defscrollback 10000
# Bottom Status line
#hardstatus off
hardstatus alwayslastline "%{=b bw}Load Status: %l [%h]%?%=[%A%C]"
# Multiple user access via screen
multiuser on
# Bind key assign for functionable key
bindkey -k k1 select 1
bindkey -k k2 select 2
bindkey -k k3 select 3
bindkey -k k4 select 4
bindkey -k k5 select 5
bindkey -k k6 select 6
bindkey -k k7 select 7
bindkey -k k8 select 8
bindkey -k k9 select 9

bind w windowlist -b
```

前から社内で「**screen使おうぜ！**」と言っても、誰も使いません・・・なぜだ？
こんなにも便利なのにナァ・・・
Capistranoについて調べてみたこと


Capistranoは、複数のリモートマシンでスクリプトを実行する、デプロイツール（管理ツールとしても使えるかも？）
Chefをちょっと勉強したので次はこっちかな、という程度の不純さで試してます。
まぁ、今の仕事で全く使わないであろうツールの１つですね。

結構いろんなサイトを参考にしました（途中で参照にいれてないやつ）
http://tech.aainc.co.jp/archives/3773
http://yakinikunotare.boo.jp/orebase2/capistrano
https://github.com/capistrano/capistrano

## 必要条件
 1. スクリプトの送信元にRuby、Capistranoのインストールが必要。
 2. 送信元からリモートマシンにSSHで接続できること。複数のリモートマシンがある場合、すべてのマシンに同じユーザ/パスワードで接続できる必要がある。

簡単に書くと下記のような感じ。
`送信元(ruby、capistrano)　→　リモートマシン達 (sshd ※)`
※同じユーザ/パスワード

## コマンド

### 基本的なコマンド
今のところ、使っているコマンドは下記の２つ

* `capify .`　ひな形の作成。下記のファイルが作成される

```
 l Capfile
 L config
　 ＋ deploy.rb
```
`Capfile`を読めばわかると思うが、中で`load config/deploy`が呼ばれている。
なので、別のrbファイルをconfigに記述して読み込んでも良いみたい。
設定ごとにrbファイル作っていいかもね。って下記サイトに書いてある。
http://shibayu36.hatenablog.com/entry/2013/02/15/113811

* `cap`　タスクの実行  
　ひな形の状態なら`deploy.rb`が実行される。

## deploy.rbの記述方法
下記のように記述していくようだ。

```deploy.rb
set :user, "rasenn"
set :password, "password"
set :use_sudo, true

role :web, "192.168.1.2" , "192.168.1.3"
role :db, "192.168.1.4"
role :db, "192.168.1.5" , :primary => true 

task :task_name, :roles => [:web], :only => {:ruby => true} do 
  run "#{sudo} command_with_sudo"
  run "command 1"
  run "command 2"
  upload("upload_file", "upload_path", :via => :sftp, :recursive => true)
end
```

## 実行方法
下記のコマンドで実行。引数は`deploy.rb`の`task`の第一引数。

```
cap  task_name
```

## deploy.rbの説明

#### `set`で変数(環境変数も？)をセットして、
#### `role`でデプロイするサーバーをセットして、
#### 実行する`task`を記述する。

`set`は第一引数(シンボル)が変数名、第二引数が値。
`role`は第一引数がマシンの役割、第二引数がサーバのアドレス。
`task`は第一引数はタスク名、`:roles`はタスクを実行するマシンの役割、`:only`は実行条件。タスク名以外は省略可能。


`run`はコマンドを文字列で渡せばいいらしい。
下記サイトをみてみると、メソッドの実行結果でコマンド文字列を返すようにすることもできるみたい。便利そう。
http://tk0miya.hatenablog.com/entry/2013/02/19/131453

`upload`はファイルをアップロードする設定、第一引数がローカルのアップロードファイル、第二引数がリモートのアップロードパス、`:via`はアップロード方法(`:scp`と`:sftp`があるらしい)、recursiveは第一引数のディレクトリ以下のすべてのファイルを転送先フォルダに転送する。

`task`内に`role`とかを入れることもOKみたい。
下記のサイトでは引数によって（testとproduction）でデプロイ先を変える、ということが例として上がっていた。便利。
http://shibayu36.hatenablog.com/entry/2013/02/15/113811

他にも`task`の順序がいろいろあるらしくて、下記の場合、他のタスクの前に実行される、とか出来るみたい。

```
task :default do  ~~ end
```
下記サイト参照
http://kenkennote.com/blog/2012/06/06/deploy-with-capistrano/


capistranoで設定できる設定値も上記のサイトに記述されています。




これを使うような仕事をしたいなー
とりあえず、今のところこんなところです。
もうちょっと調べたら追記します。


## ハマったところ

### sudo
sudo を使う場合、下記の設定を記述しなければならなかった。
[参考サイト](http://d.hatena.ne.jp/japanrock_pg/20111007/1318013112)

```
default_run_options[:pty]=true
```

### upload
アップロードで、SSHをパスワードなしでログインできるように、`~/.ssh/id_rsa.pub`をアップロードしようとしたら失敗した。
普通にSFTPで`cd ~`をしようとすると失敗するし、そりゃそうですよね。って感じ。
エラーも`initialize': expected a file to upload (ArgumentError)`ですし・・・
UIViewControllerに設置した複数のViewからタッチイベントを取る

StoryboardでViewController上に設置したViewとImageViewからそれぞれタッチイベントを取ります。

今回使ったViewControllerはこんな感じ。
赤い部分がUIViewが置いてあるところ。緑色の部分が、UIImageViewが置いてあるところ。
下のTableView部分は関係ないので気にしないでください。
![iOSシミュレータのスクリーンショット-2013.06.05-20.36.02.png](https://qiita-image-store.s3.amazonaws.com/0/6688/b26cfca9-386c-2f0e-3e40-42b0c0e66920.png)

さて、コードを書きます。
すごく簡単です。UIViewControllerに以下の内容でtouchesBegan:withEvent:をオーバーライド（コピペ）するだけ。

```objc:
// タッチイベントを取る
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    switch (touch.view.tag) {
        case 1:
            // タグが1のビュー
			NSLog(@"ImageViewに触った");
            break;
        default:
			// それ以外
			NSLog(@"Viewに触った");
            break;
    }
}
```

あとはタグの設定と、UIImageViewはタッチイベントを取ってくれないので、そこも直します。
Storyboardで該当のUIImageViewを選択したら、まずタグを1にして、次にInteractionのところにチェックを入れます。これでUIImageViewでもタッチイベントを取ってくれますYO。
![スクリーンショット 2013-06-05 20.36.48.png](https://qiita-image-store.s3.amazonaws.com/0/6688/09ad788f-7767-927b-586d-be345827b2fa.png)


シュミレーターでViewやImageViewをタッチしてみた。
ログはこんな感じ。
![スクリーンショット 2013-06-05 20.36.21.png](https://qiita-image-store.s3.amazonaws.com/0/6688/d9be0405-1442-ec5f-3f33-f71ddaedda90.png)
プロジェクト・バージョン違いのアプリをそれぞれandroidに上げる(eclipse)

プロジェクトのパッケージ名の違いで見分けるらしい。
フォルダ名を変えても上書きされます。
しっかり手順を踏まず、野良学習でやっているとこういうところがわからないｗ
時々忘れるのでメモ。


プロジェクト（右クリック）＞AndroidTools ＞rename Application Package

もしくは、
プロジェクト（右クリック）＞Android　ツール＞　アプリケーション・パッケージの名前変更


しかしながら、複雑に作っていくと
予期せぬエラーでリファクタリングできないことあり＞＜
using an event aggregator with backbone

わかりやすい

> [using an event aggregator with backbone](https://gist.github.com/derickbailey/1092444)


　　　　＿＿＿
　　 ,;f　　　　　ヽ 　　　　 　　　
　　i:　　 　　 　　 i 　　ありがたやありがたや
　　|　　　　　　　　|　　///;ﾄ,
　　|　　　　^　　^　)　////ﾞlﾞl; 　　
　　(.　　>ﾉ(､_, )ヽ､} l 　 .i .! | 　　
　 ,,∧ヽ　!-=ﾆ=- | │　 　| .|
／＼..＼＼｀ﾆﾆ´ !,　{　　 .ﾉ.ﾉ
／　 ＼ ＼￣￣￣../　　 / .|
CSSのid/class名のルールとそれにまつわるgetElementByIdとquerySelectorの動きの違い

## idとclassの名前の先頭に数字は使えない

CSSのid/classの名前を数字から始めた場合そのid/classに対して記述したスタイルは適用されません

```html:
<DOCTYPE html>
<html>
<head>
	<style>
	#0id{
		color : red;
	}
	.0class{
		color : blue;
	}
	<style>
</head>
<body>
	<div id="0id">0id</div>
	<div class="0class">0class</div>
</body>
</html>
```

どちらの要素もスタイルは適用されません

## 識別子としては有効

スタイルは適用されませんが、JavaScriptから要素を取得する際の識別子としては先頭が数字でも動作します

```html:
<script>
	console.log( document.getElementById( '0id' ) );
	console.log( document.getElementsByClassName( '0class' ) );
</script>
```

結果

```
> <p id="0id">0id</p>			// getElementByIdの結果
> [p.0class, item: function]	// getElementsByClassNameの結果
```

要素が取得できてます

## querySelectorだと…

```html:
<script>
	console.log( document.querySelector( '#0id' ) );
	console.log( document.querySelector( '.0class' ) );
</script>
```

結果

```
> Error: SyntaxError: DOM Exception 12
> Error: SyntaxError: DOM Exception 12
```

どちらもSyntaxErrorとなります。<br>
querySelectorの場合、先頭が数字のセレクタを渡すとエラーが出るようです。

## おわりに

「querySelector使えねーな！」ってことじゃなくて、id/class名の先頭に数字を使わないようにしようねという話です（当たり前なんですが)

なんでこんなことを書いたかというと、とあるノベルゲームのライブラリがid/classに先頭が数字の名前を振りまくってたからです。
JSで拡張機能的なのを書こうとしたらquerySelectorが使えなくてめんどくさかったです。

命名は計画的に。
Titanium：Facebookとの連携

+ tiapp.xmlのModuleにfacebookを追加

##ログイン-ログアウト ボタン

```
var win = Ti.UI.createWindow({backgroundColor: 'white'});
var fb = require('facebook');
fb.appid = FACEBOOK_APP_ID;
fb.permissions = ['publish_stream'];
fb.forceDialogAuth = true;
fb.addEventListener('login', function(e) {
    if (e.success) {
        alert('Logged in');
    }
});
fb.addEventListener('logout', function(e) {
    alert('Logged out');
});
    
// Add the button.  Note that it doesn't need a click event listener.
win.add(fb.createLoginButton({
    top : 50,
    style : fb.BUTTON_STYLE_WIDE
}));
win.open()
```

##情報の取得
自分のユーザネームを取得

```
fb.requestWithGraphPath(
    'me',
    {},
     "GET",
    function(e) {
         if (e.success) {
             var obj = JSON.parse(e.result);
             alert("Success: " + obj.name);
        }
    }
);
```

##ウォールへの投稿

```
fb.requestWithGraphPath(
    'me/feed',
    {
         message: "GraphAPIのテスト"
    },
    "POST",
    function(e) {
        if (e.success) {
           alert("Success" + e.result);
        }
    }
);
```
Rails4でactive_adminを使用

環境は以下の通りです。
Win7 32bit
Ruby 1.9.3p429
Rails 4.0.0.rc1

使用するGemは以下の通りの指定してください。

```rb:Gemfile
gem "jquery-rails", "2.3.0"
gem "formtastic", github: "justinfrench/formtastic"
gem "devise", "3.0.0.rc"
gem 'ransack', github: 'avit/ransack', branch: 'rails4-dependencies'
gem 'activeadmin', github: 'akashkamboj/active_admin', branch: 'rails4'
```

理由はそれぞれ
jquery-rails → 最近のバージョンではjquery-uiが削除された事により、Active_adminのjs内でエラーを吐くため。

> couldn't find file 'jquery-ui'


formtastic → Rails 4ではcheck_box_checked?が削除されたため。

> undefined method `check_box_checked?' 


devise → Strong_parametersが標準採用となり、attr_accessibleがdeprecateになったため。

> `attr_accessible` is extracted out of Rails into a gem. Please use new recommended protection model for params(strong_parameters) or add `protected_attributes` to your Gemfile to use old one.



となっています。
たぶん。

後はActive adminからattributeへアクセスするために、以下の様に修正。

```rb:config/initializers/active_admin.rb
ActiveAdmin.setup do |config|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end
ActiveAdmin::ResourceController.class_eval do
  # Allow ActiveAdmin admins to freely mass-assign when using strong_parameters
  def resource_params
    [(params[resource_request_name] || params[resource_instance_name]).try(:permit!) || {}]
  end
end
GLSLエラーの例と対処法


私の遭遇したエラーを列挙していきます
##  error C1068: too much data in type constructor
vec3なのに引数に４個も渡していたり,またはドットとカンマを間違えて書いてしまったり。した時に起きる。
✖vec3(0.0,0,0,0,0);
○vec3(0.0,0.0,0.0); or vec4(0.0,0.0,0.0,0.0)

## out can't be used with non-varying texCoord
outにはvarying修飾子をつけないとだめ。
## 一字一句間違えてないのにユニフォーム変数が取得できない！！？？
uniform vec3 cam;
のように宣言していても、main()の中で使用してなければ、取得できなくなる。
たとえ、main()の中で書いてあっても、最終的な出力にその変数が反映されていなければ、取得できなくなる。
コンパイラ賢すぎ？
## assignment of incompatible type
vec3とvec4をごっちゃにしてるとこうなる。明示的にvec4(vec3,1.0);という風に書くこと。
# Warning
## warning C7502: OpenGL does not allow type suffix 'f' on constant literals
0.0fはダメ。0.0と書く。

## warning C7503: OpenGL does not allow C-style casts
Cスタイルのキャストはダメ
ダメなコード

```cpp
int n=1;
float f=(int)n;
```

良いコード

```cpp
int n=1;
float f=int(n);
```
GLSLのエラーハンドリング

# 便利コード

```java:
public void GetProgramInfo(int _param){
	int[] ok = new int[1];
	GLES20.glGetProgramiv(mProgram,_param, ok,0);
    if(ok[0]==0){
    	Log.e(TAG,"error ");
    	Log.e(TAG,GLES20.glGetProgramInfoLog(mProgram));
    }
    
}
```

# glGetShaderiv

```cpp:
glGetShaderiv(GLuint shader,GLenum pname,GLint *params);
```

例

```cpp:
glGetShaderiv(shader,GL_SHADER_TYPE...);
```

戻り値はGL_VERTEX_SHADER,か GL_FRAGMENT_SHADER

* GL_SHADER_TYPE
* GL_DELETE_STATUS
* GL_COMPILE_STATUS....ちゃんとシェーダがコンパイルできたらparamsにはGL_TRUEが返る。失敗したらGL_FALSEが返る。
* GL_INFO_LOG_LENGTH
* GL_SHADER_SOURCE_LENGTH

# glGetProgramiv
* GL_DELETE_STATUS
* GL_LINK_STATUS
* GL_VALIDATE_STATUS
* GL_INFO_LOG_LENGTH
* GL_ATTACHED_SHADERS
* GL_ACTIVE_ATTRIBUTES
* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
* GL_ACTIVE_UNIFORMS
: GL_ACTIVE_UNIFORM_MAX_LENGTH : 現在アクティブなユニフォーム変数の名前の最大文字数。なんでこれを知る必要が？？？

# glGetShaderSource
# glGetShaderInfoLog
## シェーダがちゃんとコンパイルできたか確認する


```cpp:
void GetShaderInfoLog(GLuint shader)
{
	GLsizei bufSize;

	/* シェーダのコンパイル時のログの長さを取得する */
	glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &bufSize);

	if (bufSize > 1) {
		GLchar *infoLog = (GLchar *)malloc(bufSize);

		if (infoLog != NULL) {
			GLsizei length;

			/* シェーダのコンパイル時のログの内容を取得する */
			glGetShaderInfoLog(shader, bufSize, &length, infoLog);
			TRACE("InfoLog:\n%s\n\n", infoLog);
			free(infoLog);
		}
		else
			TRACE("Could not allocate InfoLog buffer.\n");
	}
}
```

```java:
 private int loadShader(int type, String shaderCode){
	   int[] compiled=new int[1];
	   int shader=GLES20.glCreateShader(type);
	   GLES20.glShaderSource(shader, shaderCode);
	   GLES20.glCompileShader(shader);
	   int[] compiled=new int[1];
		   GLES20.glGetShaderiv(shader,GLES20.GL_COMPILE_STATUS,compiled,0);
		   if(compiled[0]==0){//もしコンパイルに失敗していたら
			   Log.e(TAG,GLES20.glGetShaderInfoLog(shader));//何行目がどんなふうに間違ってるか吐き出す。
			   GLES20.glDeleteShader(shader);
			   return 0;
		   }
	   return shader;
   }
}
```


これを書くと、このように

> "warning C7502: OpenGL does not allow type suffix 'f' on constant literals
0(8) : warning C7503: OpenGL does not allow C-style casts
0(8) : warning C7503: OpenGL does not allow C-style casts
0(8) : warning C7503: OpenGL does not allow C-style casts
0(12) : warning C7011: implicit cast from "float" to "vec4"
0(13) : error C0000: syntax error, unexpected '}', expecting ',' or ';' at token "}"
0(4) : error C1068: too much data in type constructor"

何行目がエラーなのか教えてくれる。
【覚書】Makefileの自動生成 - autoconf等の使い方


いつも、使うツールと使う順番を忘れるのでメモ

### 必要となるファイル
```text
Makefile.am
configure.ac
```


### ツールの実行順

Makefile.amを用意する。

```bash
$ autoscan
```

ここで生成されたconfigure.scanを修正する。

```bash
$ aclocal
$ automake -a
$ autoheader
$ autoconf
$ ./configure
```

ここまでで、Makefileが生成されるので、あとはいつもの

```bash
make
make install
```

で実行ファイルがインストールされる。
拡縮(user-scalable)してるかどうかをJavaScriptで判定

```js:

var zoom = document.body.clientWidth / window.innerWidth;

alert(zoom);

alert(Math.round(zoom * 100) / 100);
```


## 参考（というかそのまま）
http://blog.fenrir-inc.com/jp/2011/12/web-zoomer.html
Facebook FQL を試す

# FacebookのFQLをさっくり試すメモ

## やること

* URLでクエリをなげていいね！数とか取得してみたい
* 基本の形 : https://api.facebook.com/method/fql.query?query=「FQL」
* 『&format=json』をつけるとJSONで返してくれる
* テーブル等一覧確認はこちら : http://developers.facebook.com/docs/reference/fql/


## 例文

* 名前がappleさんな人を探す : http://api.facebook.com/method/fql.query?query=select%20%20about,%20page_url,%20fan_count%20from%20page%20where%20name=%22apple%22&format=json
* Qiitaのコミュニティページの情報を取得 : http://api.facebook.com/method/fql.query?query=select%20%20about,%20page_url,%20fan_count%20from%20page%20where%20username=%22like.qiita%22&format=json


## 便利なツール

* URLエンコードの時につかいました : http://www.tagindex.com/cgi-lib/encode/url.cgi
* chromeでJSONを表示するときに便利なJSONView : https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc
* firefox用 : https://addons.mozilla.org/ja/firefox/addon/jsonview/

# 上記調べ終わった後にみつけた。。。

* 公式のGraph API Explorer : http://developers.facebook.com/tools/explorer/
$form_templateを継承するとハマるので注意しましょう

Ethnaでは$form_templateという便利な機能がありますが、このプロパティ自体を継承してしまうと親の$form_templateをつぶしてしまいます。

Ethna初心者がよく陥る罠なので気をつけましょう。


例えば親クラスで$form_templateを定義して、

```php:Sample_ActionForm.php
class Sample_ActionForm extends Ethna_ActionForm
{
    public $form_template = array(
        'mailaddress' => array(
            'name'      => 'メールアドレス',
            'required'  => true,
            'max'       => 255,
            'filter'    => FILTER_HW,
            'custom'    => 'checkMailaddress',
            'form_type' => FORM_TYPE_TEXT,
            'type'      => VAR_TYPE_STRING,
        ),
        'password' => array(
            'name'      => 'パスワード',
            'required'  => true,
            'max'       => 255,
            'filter'    => FILTER_HW,
            'form_type' => FORM_TYPE_TEXT,
            'type'      => VAR_TYPE_STRING,
        ),
    );
}
```

子クラスで

```php:Child_ActionForm.php
class Child_ActionForm extends Sample_ActionForm
{
     public $form_template = array(
        'mailaddress' => array(
            'required'  => false,
        ),
    );
}
```

このようなことをしてしまうと、
子クラスが親クラスの$form_templateを完全につぶしてしまうので、
親クラスの定義は一切引き継がれません。


この状態で孫クラスで、

```php:Hoge_ActionForm.php
class Hoge_ActionForm extends Child_ActionForm
{
     public $form = array(
        'mailaddress' => array(),
        'password' => array(
    );
}
```
と書いた場合、孫クラスはpasswordの定義を再利用することはできません。(mailaddressについてもほぼ何も定義してないも同然になってしまいます)
clang on CentOS6 VM

CentOS上で、clang をビルドしてみた。 VirtualBox VM を使用したが、メモリは1.5GB以上、
できれば、2.0GBぐらいは割り当てたほうが良い。

かなり大きなソフトウェアなので、ld がメモリを大量に食う。
rails_configでローカル環境のデータベース設定を上書きしたかった

# 前提
- [railsjedi/rails_config](https://github.com/railsjedi/rails_config)を使っている


# 設定

```database.yml
<%= Settings.database.to_hash.to_yaml.gsub("---\n", "").gsub(/:(.+):/, '\1:') %>
```

```config/settings.yml
...
database:
  development:
    adapter: sqlite3
    database: db/development.sqlite3
    pool: 5
    timeout: 5000
    reconnect: true
...
```


```config/settings.local.yml
...
database:
  development:
    adapter: mysql2
    encoding: utf8
    reconnect: true
    database: development
    pool: 5
    username: root
    password: foobar
    host: localhost
...
```


```Rakefile:Rakefile
...
RailsConfig.load_and_set_settings(
  Rails.root.join("config", "settings.yml").to_s,
  Rails.root.join("config", "settings.local.yml").to_s,
)
...
```

# 雑感
もっといい方法はないものか。特に`database.yml`のあたり。
Qiitaに要望：GoogleAnalyticsに対応してほしい

追記：コメントに色々要望とか書いてみたので他のQiitaユーザの意見も聞いてみたいです。

自分の設定画面で Google Analytics のアカウントID (UA-XXXXXX-X) 形式のIDを設定しておいたら、自分の投稿やプロフィールのページに Analytics のタグを埋めてくれる機能がほしい。
MacにPythonをインストールするときのメモ

MacにPythonをインストールする時のメモ

* homebrewはあらかじめインストールしておく。
* インストールにはpyenvを使う。
* MBP(Mid 2015) + OS X 10.11.6

```
# pyenvのインストール
brew install pyenv

# zlibエラーの回避
xcode-select --install

# インストール出来るPythonバージョンの確認
pyenv install -l

# python3系のインストール
pyenv install 3.5.2
pyenv rehash
pyenv global 3.5.2

# PATH設定
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```
Volleyでhttp headerを追加設定する


VolleyでBASIC認証の先のページにアクセスする必要があったのだけども、
HttpURLConnection.setRequestProperty()みたいなものが見つからずギギギとなった。

その後 Volleyで設定する方法を @h_narazaki 氏に教えてもらったのでメモっておきます。


```java::jsonObjReq.java
JsonObjectRequest json = new JsonObjectRequest(Method.GET,"http://your.domain.here/",null,
	new Listener<JSONObject>(){
		public void onResponse(JSONObject result) {
		}
	}, new Response.ErrorListener() {
		public void onErrorResponse(VolleyError error) {
		}
	}){
	@Override
		public Map<String, String> getHeaders() throws AuthFailureError {
		Map<String, String> headers = super.getHeaders();
		// Add BASIC AUTH HEADER
		Map<String, String> newHeaders = new HashMap<String, String>();
		newHeaders.putAll(headers);
		newHeaders.put("Authorization", "Basic HogeHogeFugeo======");
		return newHeaders;
	};
};
```
git cloneしたモノを自前のgitサーバで共有リポジトリにする（過去の履歴は消す）

#どっかからgit cloneしたファイルを自前のgitサーバに共有リポジトリとして作る方法

#####例えば

githubからなんかcloneしてくる。

```
$ git clone hoge.git
```

自分のモノ(プロジェクト)にする為に過去の履歴などのgitの情報を削除する。

```
$ sudo rm -rf .git .gitmodules
$ sudo rm -rf *.md
```

1度、ローカルリポジトリを作成

```
$ git init
$ git add *
```

で、こいつらを自前で用意した別の共有リポジトリにpush…と言うか新規に共有リポジトリを作る。

```
$ git init --bare --share
$ git push /new_huga
```


以上。
XAMPP + PhpStrom で WordPress プラグイン開発環境構築

XAMPP + PhpStorm で WordPress のプラグイン開発環境を作ったのでその構築手順についてまとめてみました。作ったプラグインの単体テストをするところまでできるようになりました。

1. [PhpStorm、XAMPP、WordPress インストール](http://hetarena.com/archives/2123)
1. [PhpStrom プロジェクトの作成](http://hetarena.com/archives/2138)
1. [Git 連携、デバッグ](http://hetarena.com/archives/2154)
1. [PHPUnit を使ったプラグインのテスト](http://hetarena.com/archives/2187)

初心者レベルですが、興味のある方はどうぞ。PhpStrom の雰囲気もわかると思います。
Prover9導入方法

入門自然言語処理にて、nltkで使用する定理証明器であるProver9のインストール方法でちょっと迷ったので、メモしておきます。

まずはDL

	$ wget http://www.cs.unm.edu/~mccune/mace4/download/LADR-2009-11A.tar.gz
そして解凍

    $ tar xvzf LADR-2009-11A.tar.gz 

名前をちょっと変えてあげて
	
	$ mv LADR-2009-11A prover9

	$ cd prover9/

インストール

	$ make all

なにやらこれを入力しろと言われるのでごにょごにょ

	$ make test1

	$ make test2

	$ make test3

最後にシンボリックリンクを張って完了

	$ sudo ln -s /home/vagrant/prover9/bin/prover9 /usr/local/bin/

無事にnltkで使用することが出来ました。

```:sample.py
# -*- coding: utf-8 -*-
#from __future__ import division
import nltk,re

lp = nltk.LogicParser()
SnF = lp.parse('SnF')
NotFnS = lp.parse('-FnS')
R = lp.parse('SnF -> -FnS')
prover=nltk.Prover9()
print prover.prove(NotFnS,[SnF,R])
```
Redisでセリーグの順位表を作ってみる


[Redis](http://redis.io/ "Redis")使ってますか？
今日はzrankを使わないでセリーグ順位表を作ってみましょう。

例として、下のような順位表があるとします。

```
Team     Rank 勝 負 分
Tigers   1    5  0 0
Dragons  2    4  1 0
Swallows 3    3  2 0
Giants   4    2  3 0
Carp     5    1  4 0
BayStars 6    0  5 0
```

順位に関してはなんとなくな個人の趣味で決めてますｗ
((5位力のカープと最下位ベイスターズ以外は適当に決めました。))

上の順位表をデータとしてRedisにセットしましょう。


```
HMSET Tigers Win 5 Lose 0 draw 0
HMSET Dragons Win 4 Lose 1 draw 0
HMSET Swallows Win 3 Lose 2 draw 0
HMSET Giants Win 2 Lose 3 draw 0
HMSET Carp Win 1 Lose 4 draw 0
HMSET BayStars Win 0 Lose 5 draw 0
SADD central Tigers Dragons Swallows Giants Carp BayStars
```

上の内容をdata.lstとして保存して下のコマンドを実行します。

```
% perl -pe 's/\n$/\r\n/g' data.lst |redis-cli --pipe 
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 7
```

改行コードをCR+LFにしてパイプラインで流しこんでます。
データの準備はこれで完了です。

あとは、Redisの操作です。
ここからは [SORT](http://redis.io/commands/sort "SORT – Redis") を駆使していきます。

```
% redis-cli

# 勝ち数順に並び替え
redis 127.0.0.1:6379> SORT central BY "*->Win"  DESC
1) "Tigers"
2) "Dragons"
3) "Swallows"
4) "Giants"
5) "Carp"
6) "BayStars"
```
セット型のcentralの要素を見ながら同名のハッシュ型の値を参照してKey名Winの値を基準に並べ替えています。

これで大体のことは出来ました。あとはオマケです。

```
# 勝ち数順に並び替え + チーム名と勝ち数を取得
redis 127.0.0.1:6379> SORT central BY "*->Win"  GET # GET "*->Win" DESC
 1) "Tigers"
 2) "5"
 3) "Dragons"
 4) "4"
 5) "Swallows"
 6) "3"
 7) "Giants"
 8) "2"
 9) "Carp"
10) "1"
11) "BayStars"
12) "0"
```

```
# 勝ち数順に並び替え + 勝ち数と負け数を取得
redis 127.0.0.1:6379> SORT central BY "*->Win" GET "*->Win" GET "*->Lose" DESC
 1) "5"
 2) "0"
 3) "4"
 4) "1"
 5) "3"
 6) "2"
 7) "2"
 8) "3"
 9) "1"
10) "4"
11) "0"
12) "5"
```


上位3チームだけ必要な場合はLIMIT句を使うことで実現出来ます。

```
# 勝ち数順に並び替え + チーム名と勝ち数を上位3チームまで取得
redis 127.0.0.1:6379> SORT central BY "*->Win" LIMIT 0 3 GET # GET "*->Win" GET "*->Lose" DESC
1) "Tigers"
2) "5"
3) "0"
4) "Dragons"
5) "4"
6) "1"
7) "Swallows"
8) "3"
9) "2"

```

SORTコマンドってこうやってみていくとSQLっぽいですね。


このランキングの作り方だとzrankで作るよりも柔軟にランキングが作れることが魅力です。
欠点は6チーム中何位みたいなランキングを作ることは難しいです。
できなくも無いですがすべての要素をソートしてどこにあるか確定させる必要があるので要素数が多くなるとパフォーマンスの問題が発生が起こります。

要素数があまり大きくなく(多分、n<10000)、上位100位ぐらいまで表示させたいならこの方法でも十分なパフォーマンスが出せるでしょう。

こんな感じでSORT + HASH型 + SET型を組み合わせれば ソート済みSET型を使わなくても簡単なランキングが作れるという話でした〜。
jQueryのval()で値を変更してもchangeイベントは発火しない

val()で値を変更してもchangeイベントは発火しない

```js:
$('#hoge-form').find('input[type="text"]').val('12345');
```

値を変更してchangeイベントを発火させたい場合はchange()をつかう

```js:
$('#hoge-form').find('input[type="text"]').val('12345').change();
```


> [.val() doesn't trigger .change() in jquery - Stack Overflow](http://stackoverflow.com/questions/3179385/val-doesnt-trigger-change-in-jquery)
Githubへのプッシュをハンドルしたい!

サーバサイドの人には常識かもですが、自分はしらなかったのでメモ

Githubのプロジェクトページ-
>Settings
->Options
->ServiceHooks
->WebHook URLs
に、pushがあったときに動かしたいサービスのURLを登録。

![githubservicehooks.png](https://qiita-image-store.s3.amazonaws.com/0/8904/fe420097-14f8-455c-6c34-0a4f5e637d3f.png)


有名なサービスには専用のHookがあるようです。
Jenkinsはもちろんのこと、
Twitter,Yammer,Boxcarなんてのもあり、全部で136サービスに対応してます。

これを使えばいろいろと面白いことができそうですね！
ムームードメインからValueDomainへドメイン移管した後、IPの変更が反映されなくて困った話。

# 経緯
あるドメイン（eample.netとします）をムームードメインからValueDomainへ移管しました。元々友人の取ってくれたドメインを僕の所で貰おうという話です。移管作業自体は完了して、ValueDomain側にドメイン操作のメニューができました。

ValueDomainの設定画面から抜粋
eample.net 
○状態:Completed 
コメント:
FIN) 2013-mm-dd 06:31:01 正常に移管されました。

ただ、実際にDNSを操作してもそれがネットの世界に反映されません（今回はドメインの指し先のサーバを変えたかったのです）。

nslookupで見ると下記のようになりました。

```bash:
$ nslookup eample.net
Server: 192.168.0.1
Address: 192.168.0.1#53
Non-authoritative answer:
Name: eample.net
Address: 49.212.xx.yy #このアドレスは今までのサーバアドレス。これじゃない。
```

ValueDomainのネームサーバを指定してみると、僕の指したいサーバを指していました。

```bash:
$ nslookup eample.net ns1.value-domain.com
Server: ns1.value-domain.com
Address: 119.245.243.94#53
Name: eample.net
Address: 59.106.xx.yy #これが今回有効にしたいアドレス
```

whoisでも友人の情報と共に、ムームードメインのnsを指している状態です。


自分よりは詳しい人に相談した所、もう少し情報を集めて教えてくれました。tracerouteは名前は知っていたのですが今まで使った事は無かったです。勉強になりました。digにいたっては名前すら知らないという始末。やはりこの辺は知識が足らないですね。

traceroute

```bash:
$ traceroute eample.net
traceroute to eample.net (49.212.xx.yy), 64 hops max, 52 byte packets
1 192.168.1.1 (192.168.1.1) 4.047 ms 3.360 ms 4.370 ms
<snip>
13 aaa.bbb.xxx.ne.jp (59.106.xx.yy) 119.095 ms 58.941 ms 110.004 ms
14 zzz.xxx.ne.jp (49.212.xx.yy) 123.081 ms 98.021 ms 64.374 ms
```

dig

```bash:
$ dig eample.net SOA
<snip>
;; ANSWER SECTION:
eample.net. 3600 IN SOA eample.net. postmaster.eample.net. 1343921891 3600 1800 604800 3600
<snip>
$ dig @ns1.value-domain.com eample.net SOA
<snip>
;; ANSWER SECTION:
eample.net. 2560 IN SOA ns1.value-domain.com. hostmaster.eample.net. 1370139307 16384 2048 1048576 2560
```

今までの情報からわかる事は「確かにValueDomainのnsにもIPが登録されているけれど、世界から見たらムームードメインの情報が生きている」ということでした。

# 解決
ネームサーバ情報の書き換えを怠っていた為なようです。

以下のところで3-2を僕はやっていなかったのです。今までValueDomainでドメイン取るとここは勝手にValueDomainのDNSで埋まっていたので意識した事が無かったのでした。
この関連のメニューには友人のwhois情報が全部キッチリ入っていました。情報は全てValueDomain側にあったんですね。完全な見落としです。ネームサーバの情報、Whoisの情報を書き直して事なきを得ました。

https://www.value-domain.com/howto/?action=modns&noheader=1

また一つ勉強になりました。
Node.jsでブラウザとの通信部分をある程度自動で作れるRestrant.jsというライブラリを書いています。

とりあえず、そういうの好きなひともいるかも知れないので書いておきます。
同じ趣味の人と話が出来たら楽しそうだからです。

なるべく自動的に作られる部分を増やしたいと思う方なので、以前からコントローラのスタブをブラウザのJSから自動的に作る自分専用ライブラリを書いていました（https://code.google.com/p/restrant-j/）。

最近はnode.jsを使うようになったので、やっているうちにやっぱり自動生成したくなってしまいました。それで同じようにコントローラのスタブを作成するモノをまず書きました。上記のクローンを作ったのですね。

Backbone.jsを触るようにもなったので、これのsyncと相性の良いサーバをサクッと作れないものかと思い始めました。そこでRestfulな入出力部分が簡単に書けるようにしました。

ここまできたらMongooseのSchemaからBackbone.jsのところまで一気にやれないか、というのを今は妄想しています。でも、結局ロジックが乗ってくるのでSchema書いただけでは終わらないですよね。わかっているんです。わかっているんですがやりたくなってしまうのです。でも、最小限の差分の部分のロジックだけを書けばあとはよしなにやってくれるのが理想です。

あれ？ここはこういう事を書いて良い場所だったんだっけ？ま、いっか。

https://github.com/ms2sato/Restrant.js
動きが変なとこがあったり、まだまだごっそり弄るかもしれませんが、とりあえず。
python subprocess wrapper class

バージョン 2.6 で撤廃: commands モジュールは Python 3.0 で削除されました。 
代わりに subprocess モジュールを使ってください。

commandsとお別れするためSubprocessをつかってみる。
＊シェルインジェクションされないようにする。
＊ ワンライナー好きな鯖管が直観的に使えるようにする。
＊イメージはsqlalchemyのクエリのfilterような感じでPIPEさせる。

```python:shell.py
#!/usr/bin/python

import sys
import shlex
from   subprocess import Popen, PIPE, STDOUT

__version__ = '0.0.1'

#----------------------------------------------------------
# SHELL CLASS
#----------------------------------------------------------
class Shell(object):

    def __init__(self):

        self.p  = None

    def cmd(self, cmd):

        p_args = {'stdin'     : None,
                  'stdout'    : PIPE,
                  'stderr'    : STDOUT,
                  'shell'     : False,}

        return self._execute(cmd, p_args)

    def pipe(self, cmd):

        p_args = {'stdin'     : self.p.stdout,
                  'stdout'    : PIPE,
                  'stderr'    : STDOUT,
                  'shell'     : False,}

        return self._execute(cmd, p_args)

    def _execute(self, cmd, p_args):

        try :
            self.p = Popen(shlex.split(cmd), **p_args)
            return self

        except :
            print 'Command Not Found: %s' % (cmd)
            sys.exit()

    def commit(self):

        result = self.p.communicate()[0]
        status = self.p.returncode

        return (status, result)

#----------------------------------------------------------
# TEST
#----------------------------------------------------------
def test():
    '''
    tac ./test.txt | sort | uniq -c

    '''
    shell= Shell()

    #--- CASE 1
    (return_code, stdout) = shell.cmd('tac ./test.txt').pipe('sort').pipe('uniq').commit()
    print 'RETURN_CODE: %s  \nSTDOUT: \n%s' % (return_code, stdout)

    #--- CASE 2
    s = shell.cmd('tac ./test.txt')
    s.pipe('sort')
    s.pipe('uniq')
    (return_code, stdout) = s.commit()
    print 'RETURN_CODE: %s, \nSTDOUT: \n%s' % (return_code, stdout)

if __name__ == '__main__':test()
```

```test.txt
1
2
3
4
5
6
7
8
9
0
```

結果

```
RETURN_CODE: 0
STDOUT:
0
1
2
3
4
5
6
7
8
9

RETURN_CODE: 0,
STDOUT:
0
1
2
3
4
5
6
7
8
9
```

結論

方向性は間違えてない気がするがエラー処理がいろいろとおかしい。
そのうちに見直ししてみよう。
Git でコミット数の多い順にコミッター一覧を表示する

#git shortlog --summary -n

githubのコントリビューターズページを見てニヤニヤしてる人、エゴサーチ力が足りません。

参考出力 

```text:
  6088  Matthew Weier O'Phinney
  1222  thomas
   716  Ralph Schindler
   680  Maks3w
   645  Evan Coury
   534  yoshida@zend.co.jp
   490  mikaelkael
   397  Marc Bennewitz
   368  matthew
   323  takagi
   308  prolic
   244  Rob Allen
   199  padraic
   191  Enrico Zimuel
   185  Ben Scholzen
   173  blanchonvincent
   142  Abdul Malik Ikhsan
   137  ralph
   133  Intiilapa
   133  Marco Pivetta
   123  sasezaki
   121  Christopher Martin
   121  Mike Willbanks
   116  Michaël Gallego
   102  Victor Farazdagi
```
↑ と https://github.com/zendframework/zf2/graphs/contributors
を比較してみよう
Deviseで使用するmodelのインスタンスをキャッシュする

ログを見てるとDeviseのユーザーがログイン状態にあるかどうかのチェックで毎回SQLをはいているので、この部分をキャッシュできないかな？とDeviseとWardenのコードを追ってみました。

https://github.com/plataformatec/devise
https://github.com/hassox/warden

（ここではUserモデルがDeviseを使用してるとします。）
かなり省略しますが、最終的にはwarden_compat.rb内の deserializeが呼ばれ

``` rb: 
      klass = ActiveSupport::Inflector.constantize(klass_name)
      if klass.respond_to? :serialize_from_session
        klass.serialize_from_session(*args)
      else
        Rails.logger.warn "[Devise] Stored serialized class #{klass_name} seems not to be Devise enabled anymore. Did you do that on purpose?"
        nil
      end
```
そこでserialize_from_sessionを呼んでいます。
devise内のauthenticatable.rbを見ると

``` rb:authenticatable.rb
    def serialize_from_session(key, salt)
        record = to_adapter.get(key)
        record if record && record.authenticatable_salt == salt
    end
``` 

どうやらここでUserデータを読み込んでいて、このモジュール自体はUserモデルでインクルードしているので、この部分をUserモデル上でオーバーライドすればできそうです。

``` rb:
  def self.serialize_from_session(key, salt)
    Rails.cache.fetch("#{User.name}_#{key[0]}") { 
      record = to_adapter.get(key)
      record if record && record.authenticatable_salt == salt
    }
  end
``` 

もちろん適切なキャッシュのクリアは必要ですが、こんな感じでUserのデータをキャッシュできます。
PHPでand, or 演算子が使われてないか検索するワンライナー

```text:
php -r 'foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($argv[1])) as $f) { if($f->isFIle() && substr($f, -4) == ".php") { foreach(token_get_all(file_get_contents($f)) as $t) {if(is_array($t) && ($t[0] == 263 or $t[0] == 265)){ echo $f, PHP_EOL;}}}}' .
```

windowsユーザはシングルクオートとダブルクオートは逆にしてね

<br />
<br />
<br />


おまけ：該当行表示版

```text:
find ./ -name "*.php" -exec php -r 'foreach(token_get_all(file_get_contents($argv[1])) as $t) { if (is_array($t) && in_array($t[0], [T_LOGICAL_OR, T_LOGICAL_AND])) {echo $t[2], "\t", $argv[1], PHP_EOL, file($argv[1])[$t[2] -1];}};' {} \;
```

実行結果

```text:
76      ./library/Zend/Filter/File/Decrypt.php
        if (file_exists($this->filename) and !is_writable($this->filename)) {
76      ./library/Zend/Filter/File/Encrypt.php
        if (file_exists($this->filename) and !is_writable($this->filename)) {
117     ./library/Zend/Filter/Encrypt/Openssl.php
            if (is_file($key) and is_readable($key)) {
```
UINavigationBarの戻るボタン等をカスタマイズする

[UIBarButtonItem appearance]を使うことで、UINavigationBarの戻るボタン等をアプリ内で一括して変更することができます

参考
[見た目をカスタマイズするUIAppearance](http://ameblo.jp/kendofujiwaradx/entry-11389221209.html)

```objc:
// ノーマル
UIImage *imageNormal = [[UIImage imageNamed:@"normal"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 6)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:imageNormal forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

// ハイライト
UIImage *imageHighlight = [[UIImage imageNamed:@"highlight"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 6)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:imageHighlight forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
```
チーム内のGitLabに登録したGemをcapistranoで利用するときにはまったこと

当たり前のことかもしれないけど、gitにもRailsにもなれてない自分は以下のエラーで困ったのでメモ。

```
Git error: command `git clone 'git@hogehoge:huga.git' …
```
Gemfileは以下でOK

```ruby:Gemfile
gem 'huga',:git => 'git@hogehoge:huga.git'
```
capistranoでデプロイするユーザーの公開鍵をGitLabの該当レポジトリに登録しておき、以下のようにデプロイ先の環境でknown_hostsの生成問い合わせをすませておけばデプロイ中に止まらなくなります。

```
$ ssh -T git@hostname
```

※コメントでご指摘通り、接続確認だけなので、sshでの確認に修正しました。
UITableViewのCellを選択してチェックをつけて、

①UITableViewのCellを選択してチェックをつけて、
②それ以外のセルはチェックを外して、
③前の画面に戻る

というピンポイントな内容の実装について。
セルを選択した時に実行されるメソッドtableView: didSelectRowAtIndexPath:に書いていきます。

```objc:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
	// テーブルを更新
	[self.tableView reloadData];
	
	// ②選択したセル以外のすべてのチェックを取る
	// 今回はセクションは「０」（一番初めのセクション）とします。
	for (NSInteger index=0; index<[self.tableView numberOfRowsInSection:0]; index++) {
		UITableViewCell *cell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0]];
		cell.accessoryType = UITableViewCellAccessoryNone;
		// ①選択したセルだけチェックする
		if (indexPath.row == index) {
			cell.accessoryType = UITableViewCellAccessoryCheckmark;
		}
	}
	
	// ③前の画面に戻る
	[self.navigationController popViewControllerAnimated:YES];
}
```

各セクションのセルの数は[self.tableView numberOfRowsInSection:【セクション】]
って感じで取れます。（上記forの部分）
Chefのライブラリーを管理するBerkshelfを使ってみる


chefのレポジトリーはtest-chefです。
Gemfileをtest-chef/に作成

```ruby:Gemfile
source :rubygems 
gem 'berkshelf'
gem 'knife-solo'
```

Berkshelfの設定ファイルであるBerksfileを作成する。
ダウンロードできるcookbookは[http://community.opscode.com/](http://community.opscode.com/)で検索出来ます。

```ruby:Berksfile
site :opscode 
cookbook 'yum'
```

```bash
$ bundle install
$ berks --path cookbooks
```

___


```vim:nodes/melody.json
{
  "run_list":[
    "yum::epel"
  ]
}
```

入門Chef Soloに書いたあるように
recipe[yum]
でかいてもうまく行かなかった。
入門Chef Soloと環境が違うのか、上記のように書くとうまく行った。
mysql コマンドのパスワード入力を省略する

~/.my.cnf に次のように記述する。パーミションは 600。

```text:~/.my.cnf
[client]
password = my_password
```

`mysql -u username dbname` で接続できる。

参考ページ
[End-User Guidelines for Password Security](http://dev.mysql.com/doc/refman/5.5/en/password-security-user.html)
【メモ】redisをphpで使うまで


```bash
$ sudo su
$ cd /usr/local/src
$ wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz
$ tar xzf redis-2.6.12.tar.gz
$ cd redis-2.6.12
$ make;make install
$ ln -s /usr/local/src/redis-2.6.12 /usr/local/redis
$ sudo mkdir -pv /var/data/redis
$ sudo chown -R root:wheel /var/data/redis
```

もしmake段階で、gccが無くerrorが出た場合

```bash
$ sudo yum install gcc
$ make distclean
$ make;make install
```

```/usr/local/redis/redis.conf
-dir ./
+dir /var/data/redis/
```


### PHP用ライブラリ

#### phpredisインストール

```bash
$ sudo su
$ cd /usr/local/src
$ git clone git://github.com/nicolasff/phpredis.git
$ cd phpredis/
$ phpize
$ ./configure
$ make;make install
```

-rwxr-xr-x 1 root root 845018 May  1 02:05 /usr/lib64/php/modules/redis.so


もしserializeを効率よく使える様にするなら

Memcached 拡張内でおこなわれるシリアライズ処理の最適化のために igbinary 拡張を導入します。

git clone git://github.com/igbinary/igbinary.git
cd igbinary/
phpize
./configure CFLAGS="-O2 -g" --enable-igbinary
make;make install

-rwxr-xr-x 1 root root 176964 May  1 02:17 /usr/lib64/php/modules/igbinary.so

```bash
echo "extension=igbinary.so" > /etc/php.d/igbinary.ini
```

cd ../phprize
./configure --enable-redis-igbinary
make;make install
-rwxr-xr-x 1 root root 845858 May  1 02:21 /usr/lib64/php/modules/redis.so

#### php.ini追加

```bash
echo "extension=redis.so" > /etc/php.d/redis.ini
```

#### redisの確認

```bash
php -m | grep redis
```


#### ドキュメント

https://github.com/nicolasff/phpredis/blob/master/README.markdown

"redisクライアント一覧":http://redis.io/clients
AWSに導入する場合:http://dev.classmethod.jp/server-side/in-memory-kvs-redis/
[iOS]Revealで快適なGUIデバッグ

## Revealってなに？
iOS用のRuntime inspector。
要はSafariのWeb Inspectorのアプリ版のようなもの。
通常の2D表示だけでなく、3D表示も出来て多段レイヤーの重なり方も表示してくれる超スグレモノ。

Reveal
http://revealapp.com/

## インストール
- Revealを起動して、[Help]-[Show Reveal Library in Finder]を選択
- [Reveal.framework]のディレクトリをXcodeの任意プロジェクトにドラッグして追加
- Xcodeプロジェクト内で[CFNetwork.framework]と[QuartzCore.framework]を追加
- XcodeプロジェクトのBuild Settings -> Linking -> Other Linker Flags に「-ObjC」を追加

※CocoaPodsは2013-06-04現在未対応。近いうちに対応予定らしい。

![スクリーンショット_2013_06_04_18_28.png](https://qiita-image-store.s3.amazonaws.com/0/20074/1e12bbda-d2da-a22f-523d-43eaa3358f6f.png)

## 実行
- Xcode上からアプリを[Run]
- Reveal上部のプルダウンから起動中のアプリを選択

![スクリーンショット_2013_06_04_17_51.png](https://qiita-image-store.s3.amazonaws.com/0/20074/e145c036-4b8c-56a6-ba63-eb68b655e0be.png)
これだけ。
今までNSLogデバッグしていたような箇所もGUIで弄くり回せるので、超捗る。

Web Inspectorと同様に、動的にラベルの文字列や高さなども変えられる。
しかもデバッグしてる実機端末上にもちゃんと反映される(！)
![スクリーンショット_2013_06_04_17_54-3.png](https://qiita-image-store.s3.amazonaws.com/0/20074/5340ecef-87f0-568f-48be-0444af1fe177.png)

今までNSLogデバッグしていたような箇所もGUIで弄くり回せるので、超捗る。
Xcode本体に取り込んでくれないかなあ。
AWS SDK for PHPで"Failed to determine HOME directory after trying "sh: line 0: cd: /root: Permission denied"の対処法

# 原因
AWS SDK for PHPは、config.inc.php というファイルを自動探索してくれる(ちょっとおせっかいな)機能があります。

ところが環境変数HOMEが/rootなどになっていると表題のエラーが出ます。

実は、/usr/share/pear/AWSSDKforPHP/sdk.class.phpの1484行目あたりで、
下記のような外部コマンドが発行されているのです。

```php:sdk.class.php
exec('(cd ~ && pwd) 
```

# 解決方法
下記のいずれか

* Apache設定ファイルで`SetEnv`でHOMEを設定する
* `$_ENV['HOME'] = '/home/dqneo';`のようにPHPスクリプト内で値をセットする
*  `define('AWS_DISABLE_CONFIG_AUTO_DISCOVERY', true);` として自動探索させない
リージョンがアクティブかどうかによって処理を分ける関数

リージョンがアクティブかどうかによって処理を分ける場合は、(region-active-p)を使います。
リージョンの開始位置は(region-beginning)、終了位置は(region-end)で取得できます。
例えば、次のように書きます。

```el:
(defun my/kill-region ()
  "リージョンがアクティブならkill-region, そうでないならバッファ全体をkill."
  (interactive)
  (if (region-active-p)
      (kill-region (region-beginning) (region-end))
    (kill-region (point-min) (point-max))))
```

## うまく動かなかったところ
(interactive "r")な関数にすると、引数でリージョンの開始位置と終了位置を取得できます。

```el:
(defun my/kill-region-not-working (&optional beg end)
  (interactive "r")
  (if (region-active-p)
      (kill-region beg end)
    (kill-region (point-min) (point-max))))
```

しかし、新たに開いたバッファでまだマークをセットしていない(C-SPCを押してない等)ときに実行すると、
`The mark is not set now, so there is no region`とエコーエリアに出てうまく動きませんでした。

リージョンがアクティブかどうかによって処理を分ける場合は、(interactive)な関数にして、
(region-active-p)で判定し、(region-beginning)と(region-end)を使ってリージョンを指定するのが良さそうです。
Windows で node.js を使う

# Windows で node.js を使う

## 参考

- http://qiita.com/items/30e7cbb673472c43b66f

## 環境

Windows 7 x64

- Git (http://git-scm.com/download/)

Windows 版をそのままインストールすればいい。
PATH が通っていなければ、環境変数に GIT_HOME=C:\Program Files (x86)\Git\cmd を追加して、
SET PATH=%PATH%;%GIT_HOME% 辺りを追加

```
SETX /M GIT_HOME "C:\Program Files (x86)\Git\cmd"
SETX /M PATH %GIT_HOME%;%PATH%
```

- Python (http://www.python.org/download/)

2.7 にしておく。
PATH が通っていなければ、環境変数に PYTHON_HOME=C:\software\Python27 を追加して、
SET PATH=%PATH%;%PYTHON_HOME% 辺りを追加

```
SETX /M PYTHON_HOME "C:\software\Python27"
SETX /M PATH %PYTHON_HOME%;%PATH%
```

- ホームフォルダ

何かとホームフォルダを固定しておきたいので、以下を設定しておく。
環境変数 HOME を追加

```
SETX /M HOME "D:\home"
```

## インストール

コマンドラインから

```
git clone git://github.com/hakobera/nvmw.git %HOME%\.nvmw

SETX /M NVMW_HOME "D:\home\.nvmw\"
```

これでコマンドラインから nvmw　コマンドが使えるようになる。
でも、なんとなく nvm コマンドが使いたいので、

%HOME%\.nvmw\nvm.bat を追加

```%HOME%\.nvmw\nvm.bat
@ECHO OFF
nvmw %*
```
RubyGems Cross Compilation on Ubuntu 12.04

# Setup

```sh
# should use mingw32 packages, not gcc-mingw32
% sudo apt-get install mingw32-runtime mingw32 mingw32-binutils libssl-dev

% git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
% git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
% echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
% echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
% exec $SHELL -l
```

## Install 2.0.0-p451 to rake-compiler

```sh
% CC=/usr/bin/i586-mingw32msvc-gcc rake-compiler cross-ruby VERSION=2.0.0-p451
```

## Install 1.9.3-p545 to rake-compiler

```sh
% CC=/usr/bin/i586-mingw32msvc-gcc rake-compiler cross-ruby VERSION=1.9.3-p545
```

## Install 1.8.7-p375 for rake-compilation

Require for cross compilation because 1.9.x or later can't do cross compilation.
See: https://github.com/luislavena/rake-compiler/issues/59

```sh
% rbenv install 1.8.7-p375
% rbenv shell 1.8.7-p375
% gem install bundler
```

### NOTE

If you use another Ruby version like 1.9.3, you will get following error:

```text
/home/repeatedly/cool.io/tmp/i386-mingw32/iobuffer_ext/2.0.0/rbconfig.rb:7:in `<module:RbConfig>': ruby lib version (2.0.0) doesn't match executable version (1.9.3) (RuntimeError)
```

# Cool.io example

## Rakefile

See cool.io: https://github.com/tarcieri/cool.io/blob/master/Rakefile#L23

## Build

```sh
% cd /path/to/cool.io
$ rbenv shell 1.8.7-p375
% bundle install
% rake cross native gem RUBY_CC_VERSION=1.9.3:2.0.0

% ls pkg/
cool.io-1.2.0-x86-mingw32  cool.io-1.2.0-x86-mingw32.gem  cool.io-1.2.0-x86-mswin32-60  cool.io-1.2.0-x86-mswin32-60.gem  cool.io-1.2.0.gem
```
マウス・タッチ操作に対応したカルーセルを作れるJSライブラリ

http://nolib.jp/roller.html

入れ子で組んだブロック要素のidを渡すと動作部分のJavaScriptと、メソッドやコールバックを提供します。動作を細かくカスタマイズできるのが特徴です。
C++でマージソートを書いてみた

```cpp:
void merge(int n[], int left, int mid, int right)
{
	int num = right - left;
	int *tmp = new int[num];
	
	int iw = 0;
	int il = left;
	int ir = mid;
	
	while (il < mid && ir < right)
	{
		if (n[il] <= n[ir])
		{
			tmp[iw++] = n[il++];
		} else {
			tmp[iw++] = n[ir++];
		}
	}
	
	while (il < mid) tmp[iw++] = n[il++];
	while (ir < right) tmp[iw++] = n[ir++];
	
	for (int i=0; i<num; i++) n[left + i] = tmp[i];
	
	delete[] tmp;
}


void merge_sort_sub(int n[], int left, int right)
{
	if (right - left <= 1) return;
	
	int mid = left + (right - left) / 2;
	merge_sort_sub(n, left, mid);
	merge_sort_sub(n, mid, right);
	
	merge(n, left, mid, right);
}


void merge_sort(int n[], int len)
{
	merge_sort_sub(n, 0, len);
}
```
homebrewでインストールしたphpのphpunitをインストール

* リポジトリを追加

sudo pear channel-discover pear.phpunit.de
sudo pear channel-discover pear.symfony.com

* phpunitインストール

sudo pear install phpunit/PHPUnit

```zsh:
% phpunit
zsh: command not found: phpunit
```
なぜか通らない。

* phpunitの居場所を探す 


```zsh:
% sudo find / -name phpunit
/usr/local/Cellar/php54/5.4.15/bin/phpunit
```

http://michaelheap.com/installing-phpunit-under-php-5-4-from-homebrew/
等見てみて、phpをバージョンアップしたとき面倒くさそうとか思ったけど、とりあえず.zshrcに追加した。

```zsh:
vi ~/.zshrc
export PATH="$(brew --prefix)/bin:/usr/local/Cellar/php54/5.4.15/bin:$PATH"
```

```zsh:
% phpunit --version
PHPUnit 3.7.21 by Sebastian Bergmann.
```

通った。
Dropzone.jsを使ってドラッグ&ドロップでファイルをAjaxアップロード

とりあえず、↓が本家サイト。
http://www.dropzonejs.com/

何が出来るかというとWebページに画像のような枠を貼り付けて、

そこにファイルをドラッグ&ドラッグするとファイルがアップロードできる。

しかも、Ajaxアップロードなのでページのリロードはされない。

サーバー側には通常のアップロード処理を書いたスクリプトを置いておき、

JavaScript側でURLだけ指定すればいい。
Qiitaに要望：Code記法の装飾に2chとかっていうタイプが欲しい

半分冗談、半分本気。

MarkdownのCode記法で ```` ```2ch ```` とか書いたらスレの体裁をキレイに整えてくれる機能とかあると嬉しいな～、などと以下の投稿でスレ引用をしながら思った(^^;

http://qiita.com/items/f90810b9ea823b6556a8
http://qiita.com/items/87b521e4e9e919caec55
ModularStyleのSinatraをPassengerで公開

Sinatraの書き方にはClassic StyleとModular Styleという2種類があります。

* Classic Style

```rb:
require 'sinatra'

get '/' do
  "Hello World!"
end
```

* Modular Style

```rb:
require 'sinatra/base'

class App < Sinatra::Base

  get '/' do
    'Hello world!'
  end
end
```

Passengerで公開する場合、Classic Styleはドキュメントが結構あったのですが、Modular Styleの場合はあまり資料がなかったのでまとめました。(公式のドキュメントもよく見ると書いてあるのですが、わかりづらい)
PassengerがApacheで有効になっていることが前提です。

作成するのは以下のファイルです。

```
root/
├── app.rb
├── config.ru
├── public/(空でOK)
└── tmp/(空でOK)
```

config.ruには以下のように記述します。

```rb:
require File.expand_path(File.dirname(__FILE__)) + '/app'
run App
```

ファイル更新があるたびにアプリケーションの再読み込みを行う必要があれば、``tmp/``に``always_restart.txt``をいれてください。

あとは、Apacheの設定でDocumentRootをpublicにすればOKです。

``` 
<VirtualHost *:80>
	ServerName app.local
	DocumentRoot "/path/to/public"
	<Directory "/path/to/public">
		Order allow,deny
		Allow from 127.0.0.1
	</Directory>
</VirtualHost>
```

これで、``http://app.local``からSinatraアプリケーションにアクセスできます。


ちなみに、Classic Styleのときは、config.ruの中身が

```rb:
require File.expand_path(File.dirname(__FILE__)) + '/app'
run Sinatra::Application
```

となります。
Exception Notificationはデフォルトでいくつかの例外を無視する

[Exception Notification](https://github.com/smartinez87/exception_notification) はデフォルトでいくつかの例外を無視する


````````````ruby:exception_notification-3.0.1/lib/exception_notifier.rb
  5 class ExceptionNotifier
  6
  7   def self.default_ignore_exceptions
  8     [].tap do |exceptions|
  9       exceptions << 'ActiveRecord::RecordNotFound'
 10       exceptions << 'AbstractController::ActionNotFound'
 11       exceptions << 'ActionController::RoutingError'
 12     end
 13   end
`````````````

自分でカスタマイズすることも出来る

``````ruby
Whatever::Application.config.middleware.use ExceptionNotifier,
  :ignore_exceptions => ['ActionView::TemplateError'] + ExceptionNotifier.default_ignore_exceptions,
  :email => {
    :email_prefix         => "[Whatever] ",
    :sender_address       => %{"notifier" <notifier@example.com>},
    :exception_recipients => %w{exceptions@example.com}
  }
``````````

http://smartinez87.github.io/exception_notification/
Emacs で半角カタカナを全角カタカナに置換したい

# Emacs で半角カタカナを全角カタカナに置換したい

Emacs には半角全角を置換するコマンドが用意されている。

```
M-x japanese-hankaku-region
M-x japanese-zenkaku-region
```

しかし、この場合だとアルファベット(英字)まで変換されてしまう。

## アルファベット(英字)は置換したくなくて、半角カタカナだけ置換したい

アルファベットまで置換したくないときは次のコマンドを実行。

```
C-u M-x japanese-zenkaku-region
```