OmniAICreator/Qiita-1.07M huggingface dataset:
シェルの変数展開

こちらも blog からの転載。

シェルスクリプトを作成する際にシェル変数に値を代入したり参照したりする事は頻繁に発生するが、 シェル変数の展開にも便利な使い方がある。
*basename* (1) や *dirname* (1) と同様な動作がシェルの組込みとして利用できるので資源の節約にもつながり、 上手に利用すると可読性の高いスクリプトが作成できる。

## 機能一覧

|記述                  |機能               |
|:--------------------|--------------------
|${parameter:-word} |デフォルト値への置換
|${parameter:=word} | デフォルト値の代入
|${parameter:?[word]} | 値の検査とエラー
|${parameter:+word}	 | 代替値の使用
|${#parameter} | 文字列長の取得
|${parameter%word}	| 最短後置パターンの削除
|${parameter%%word} |	 最長後置パターンの削除
|${parameter#word}	| 最短前置パターンの削除
|${parameter##word} |	 最長前置パターンの削除

## 実例

### デフォルト値への置換

**${parameter:-word}**

${parameter} が NULL の場合 word に置換される。 

```sh:sample
$ echo ${foo}

$ echo ${foo:-FOO}
FOO
$ echo ${foo}

$ foo=BAR
$ echo ${foo:-FOO}
BAR

```

### デフォルト値の代入

**${parameter:=word}**

${parameter} が NULL の場合 word に置換され、 かつ parameter に代入される。

```sh:sample
$ echo ${foo}

$ echo ${foo:=FOO}
FOO
$ echo ${foo}
FOO
$ echo ${foo:=BAR}
FOO

```

### 値の検査とエラー

**${parameter:?[word]}**

${parameter} が NULL の場合 word が指定されていればその値を、 指定されていない場合はデフォルトの値を表示し、 非対話実行されているシェルをエラー終了させる。

```sh:sample
$ echo ${foo}

$ echo ${foo:?value not set}
value not set

```

### 代替値の使用

**${parameter:+word}**

${parameter} が NULL 以外の場合 word に置換される

```sh:sample
$ echo ${foo:+FOO}

$ echo ${foo}

$ foo=BAR
$ echo ${foo}
BAR
$ echo ${foo:+FOO}
FOO

```

###	文字列長の取得

**${#parameter}**

${parameter} の文字列としての長さに置換される

```sh:sample
$ echo ${foo}

$ echo ${#foo}
0
$ foo=FOO
$ echo ${foo}
FOO
$ echo ${#foo}
3

```

### 最短後置パターンの削除

**${parameter%word}**

${parameter} の右から word で示されるパターンの最短部分を削除する

```sh:sample
$ foo=/foo/bar/baz
$ echo ${foo%/*}
/foo/bar
$ foo=foo.c
$ echo ${foo%.*}
foo
$ foo=foo
$ echo ${foo%.*}
foo

```

### 最長後置パターンの削除

**${parameter%%word}**

${parameter} の右から word で示されるパターンの最長部分を削除する

```sh:sample
$ foo=foo.example.com
$ echo ${foo%%.*}
foo
$ foo=http://www.example.com:8888/
$ echo ${foo%%:*}
http
$ foo=foo
$ echo ${foo%%.*}
foo

```

### 最短前置パターンの削除

**${parameter#word}**

${parameter} の左から word で示されるパターンの最短部分を削除する

```sh:sample
$ foo=foo.c
$ echo ${foo#*.}
c
$ foo=foo.example.com
$ echo ${foo#*.}
example.com
$ foo=foo
$ echo ${foo#*.}
foo

```

### 最長前置パターンの削除

**${parameter##word}**

${parameter} の左から word で示されるパターンの最長部分を削除する

```sh:sample
$ foo=foo.example.com
$ echo ${foo##*.}
com
$ foo=/foo/bar/baz
$ echo ${foo##*/}
baz
$ foo=foo
$ echo ${foo##*.}
foo

```
fablap(2013年2月で配信終了したアプリ)の構成メモ


畳むことになってしまい、大変残念なので記念にメモ
もともとはNTTレゾナントが主催する[challengers](http://challengers.jp/)
というビジネスコンテストで入賞したのがきっかけで、このアプリを作ることになった。
仲間と作ったので、思い入れも多分にある。

# 使用言語
## iOS側
#### Objective-C
ネイティブアプリという要件だったので。

## サーバ側
#### Python 2.7.3
直近のプロジェクトで使っていたこともあり、ノウハウが蓄積されていたのでPythonを使うことにした。

# 使用ミドルウェア
## iOS側
#### [sqlite](http://www.sqlite.org/)
ユーザの画像情報やfab(お気に入り)した情報を保存するために利用していた。

## サーバ側
#### [AWS DynamoDB](http://aws.amazon.com/jp/dynamodb/)
今回のようなfabしたり、されたりするアプリは複雑なデータベース操作をする必要がない。
データの出し入れが素早く行え、かつメンテナンスフリーなAWS DynamoDBは今回の開発にはもってこいだと思い採用した。

実際、予想通り応答性もよくトラブルも無かった。

#### [twisted](http://twistedmatrix.com/trac/)
apnsへpush通知を行う為に使用した。
ちなみに[Instagram のスケール正攻法](http://surgo.jp/2012/04/instagram.html)を参考にした

#### [apache 2.4.3](http://httpd.apache.org/)
使い慣れていたので。ただそれだけ。

# 使用フレームワーク及びライブラリ
## iOS側
#### [nimbus kit](http://nimbuskit.info/)
画像の非同期取得とカスタムしたツールバーにバッチを表示させるために使用している。

#### [AFNetworking](https://github.com/AFNetworking/AFNetworking)
直接は利用していないが、nimbuskitを使うためには必須。

#### [Reachability](https://github.com/tonymillion/Reachability)
端末の通信状況を監視するために利用している。
実際監視せずにアプリを申請したらリジェクトされたw

#### [fmdb](https://github.com/ccgus/fmdb)
SQLiteとのやりとりで使用した。

#### [Facebook SDK ver3.0.7](https://developers.facebook.com/docs/getting-started/getting-started-with-the-ios-sdk/jp/)
このアプリはFacebook認証が必須。
最初はバージョン3.1系のSDKを使っていたのだが、ユーザ使用している端末がiOS6の場合、認証の挙動が以前(Facebookアプリを呼び出してからの認証)と違うため、ユーザが認証を拒否することが多かった為、3.0.7にダウングレードしたという経緯がある。

## サーバ側
#### [Django 1.4.X](https://www.djangoproject.com/)
使い慣れている上、DyanamoDBを利用するためのライブラリが揃っていたため、使用した。

#### [django-storages](http://django-storages.readthedocs.org/en/latest/index.html)
ユーザの画像をAmazonS3へ送信する為に使用した。
ほんの数行プログラムを追加するだけで、簡単にS3へ送信することが出来る。

#### [boto](https://github.com/boto/boto)
DynamoDBとのやりとりで使用。
その他の用途としては、サーバの設定情報を全部boto.cfgに書いていた。これがとても便利。

#### [bpmappers](http://bpmappers.readthedocs.org/en/latest/index.html)
端末とサーバ間でやり取りするデータの差異をbpmappersで埋め合わせていた。

#### [Dynamodb-mapper](http://dynamodb-mapper.readthedocs.org/en/latest/index.html)
Dynamodbを操作する際、このORマッパーを利用していた。
botoで直接操作するより楽。

#### [DynamoDB-Mock](http://ddbmock.readthedocs.org/en/latest/pages/getting_started.html)
その名の通り、Dynamodbのモック。
単体テストでDynamodb代わりに使用していた。

#### [django-dynamodb-sessions](https://github.com/gtaylor/django-dynamodb-sessions)
Djangoのセッション機能はDynamodbをサポートしていないため、このライブラリを利用する必要がある。

#### [pyapns](https://github.com/samuraisam/pyapns)
apnsへpush通知を送信する為に使用していた。

#### [facebook-sdk](https://github.com/pythonforfacebook/facebook-sdk/)
FQLを発行する為に使用した。

# その他
サーバ構成は[AWS CloudFormation](http://aws.amazon.com/jp/cloudformation/)を使って自動構築するようにしていた。
作成する要素は

* ELB×1
* autoscaling
* apiサーバ×1
* DynamoDB×13テーブル

といった感じのシンプルな内容。
Imagick で画像の diff をとる（CMYK）


RGB はどうか知りませんが、CMYK で書き出された画像の diff をとりたいと思っていろいろ調べたり、試したりしております。
下記記事もアイディアを得るのに大変参考にさせていただいたのですが、ふつうに difference をとっただけでは微細な変化をキャッチすることができません。
（画像全体を少し明るくしたなどの変化）

そこで工夫して出した結論をドキュメンテーション。

参考：
http://blog.mirakui.com/entry/20110326/1301111196

## 問題
コントラストや明るさを微妙に変えただけの画像比較だと、COMPOSITE_DIFFERENCE では真っ黒の画像としてしか見えない。

これは黒のコントラストをちゃんと表示できないパソコンの方に落ち度があるのかもしれないが、ほとんど視認できない。

## 工夫
imagick::negateImage() 関数を利用し、色を反転させると真っ黒画像よりもだいぶ見やすくなる。（真っ白の中に汚れが見えるようになる。医療とかと同じですね）
関数の説明　http://www.php.net/manual/ja/imagick.negateimage.php

さらにだめ押しで COMPOSITE_MULTIPLY オプションを利用して、自分自身と乗算させる。これにより、差が強調される。
したがって、この COMPOSITE_MULTIPLY の操作を何回かやればより微細な変化を強調して把握することが可能になる。

### 関数の定義部
``` php
<?php
function image_diff($path1, $path2, $path3){
	$image1 = new Imagick($path1);
	$image1->setImageColorspace(imagick::COLORSPACE_CMYK);//カラースペースをCMYKに設定
	$image2 = new Imagick($path2);
	$image2->setImageColorspace(imagick::COLORSPACE_CMYK);//同じくCMYKに設定
	$image1->compositeImage($image2, imagick::COMPOSITE_DIFFERENCE, 0, 0 );//二者の差分をとる
	$image1->negateImage(0);//差分画像の色を反転させる
	$image1->compositeImage($image1, imagick::COMPOSITE_MULTIPLY, 0, 0 );//差分画像を自乗して、変化を際立たせる
	$image1->writeImage($path3);//diff画像を書き出す
}
?>
```

### 呼び出し部

```php
<?php
$path1 = "aaa.jpg";//比較したい画像a
$path2 = "bbb.jpg";//比較したい画像b
$path3 = "diff.jpg";//出力先の画像diff

image_diff($path1, $path2, $path3);//関数を実行する

//以下は表示部
?>

<div class="pull-left original">
	<img src="<?=$path1?>">
</div>
<div class="pull-left original">
	<img src="<?=$path2?>">
</div>
<div class="pull-left pics">
	<img src="<?=$path3?>">
</div>
	
```
第8回オフラインリアルタイムどう書く。ruby による実装例。


問題 : http://nabetani.sakura.ne.jp/hena/ord8biboma/
解答リンク集 : http://qiita.com/items/709d61dff282cff7a890


最初に書いた実装。

```ruby
#coding:utf-8

def solve( src )
  w,b = src.split( "/" ).map{ |i| i.to_i(16) }
  r=b;
  field = (0xffff_ffff)&~3
  [
    [1, ("111110"*5+"00").to_i(2) ],
    [-1, ("011111"*5+"00").to_i(2) ],
    [6, -1],
    [-6, -1 ]
  ].each do |shi, mask|
    fire=b
    while fire!=0 do
      r |= (fire & field )
      fire = ( ( fire & mask ) >> shi ) & ~w & field
    end
  end
  "%08x" % r
end

DATA.each do |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  puts "%s->%s ( %s ) : %s" % [
    src,
    actual,
    expected,
    actual==expected ? "ok" : "***NG***"
  ]
  raise line unless actual == expected
end

__END__
0 802b1200/01400c20 53c40cfc  
29  0c901d38/72602200 f36da280  
```

例によってテストデータの大半は省略。

ビット演算で解決するとこんな感じ、という例。
`("111110"*5+"00").to_i(2) ` の辺りは一見不要に見えるかもしれないが、これらがないと、左端に達した爆風が右端から現れたりする。

ruby のバージョンは 1.9.3 と 2.0.0。どちらでも動く。1.8.x は試していない。
オフラインリアルタイムどう書く第8回の問題をRubyで解く

問題はこちら。
http://nabetani.sakura.ne.jp/hena/ord8biboma/

```ruby
def solve(q)
  wall,bomb = q.split('/').map{|e|
    e.split('').map{|_| ('000'+_.to_i(16).to_s(2))[-4..-1]}
               .join
               .scan(/....../)
               .map{|_| _.split('').map(&:to_i)}
  }

  ans = []
  5.times{ans << Array.new(6,0)}
  bomb.each_with_index do |row, y|
    row.each_with_index do |b, x|
      next if b == 0
      x.downto(0){|xd| break if wall[y][xd] == 1; ans[y][xd] = 1}
      x.upto(5){|xd| break if wall[y][xd] == 1; ans[y][xd] = 1}
      y.downto(0){|yd| break if wall[yd][x] == 1; ans[yd][x] = 1}
      y.upto(4){|yd| break if wall[yd][x] == 1; ans[yd][x] = 1}
    end
  end
  (ans.flatten.map(&:to_s).join+'00').scan(/..../).map{|_| _.to_i(2).to_s(16)}.join
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? 'o' : 'x'
end

__END__
0	802b1200/01400c20	53c40cfc
1	28301068/84080504	d64fef94
2	100a4010/80010004	e241850c
3	81020400/000000fc	0e3cfbfc
```
eachにまつわるエトセトラ

そういえば、for-inとforEachって、どれくらいパフォーマンス違うんだろ、と思って、ベンチとってみた。

```bench.js
var argv = process.argv.map(function (val) {
 return val;
});
argv.shift(); // == process.execPath が値になる
argv.shift(); // node用スクリプトのPath が値になる
var startupOptions = (function( opts ) {
  var rslt={};
  opts.forEach(function( val ){
    // hoge=hoge という書式だけを取り出してオプション扱いにする。
    if( /^([\w\d]+)=(.*)$/.test( val ) ){
      var k = RegExp.$1;
      var v = RegExp.$2;
      rslt[k] = v;
    }
  });
  return rslt;
})( argv );
//console.log( startupOptions );


// ここから

var tgt = {};
var obj = {};
for (var i = 0; i < startupOptions.count; i++) {
  if (startupOptions.double) {
    obj["foo_" + i] = "bar_" + (i * i);
  }
  else {
    obj["foo_" + i] = "bar_" + i;
  }
}

var d = new Date;
var k;
for (k in obj) {
  tgt[k] = obj[k];
}

console.log("for end", (new Date) - d);

tgt = {};
d = new Date;
Object.keys(obj).forEach(function(k) {
  tgt[k] = obj[k];
});

console.log("forEach end", (new Date) - d);
```

```
% node bench.js count=1000000 double=1
for end 1050
forEach end 1271
```

```
% node bench.js count=1000000
for end 1472
forEach end 1176
```

ふしぎーーーー
なお、double=1を入れた場合、70万回くらいまではforEachの方が速いのですが、80万回を超えるくらいからfor-inの方が早くなります。

因みに

```
% node -v
v0.8.15
```

なので、ちょっと古いですが。。。
第8回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/36783 )を行いました。

問題は「ビットボンバーマン」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord8biboma/
です。

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

※ 問題は先週のうちにできていたので、先日からボンバーマンが話題になっているのは偶然の一致です。
Hashのこんな使い方


RubyのHash、僕が知らなかっただけかもしれないですが、便利な使い方を発見。

## initializeでブロックを渡す
ブロックを渡すと、 `[]` でアクセスした時にそのブロックが評価されるようになります。
使用例：

```ruby
require 'uri'
uri = Hash.new do |hash, key|
  puts 'evaluated'
  hash[key] = URI.parse(key) rescue nil
end

host = uri['http://google.com'].host
#=> evaluated
puts host
#=> google.com

host = uri['http://google.com'].host
#=>何も出力されない
puts host
#=> google.com

p uri
#=> {"http://google.com"=>#<URI::HTTP:0x0000010718edb0 URL:http://google.com>}
```

`key` に対するアクセスに対して、自身にその `key` がセットされていなければブロックを評価、ブロックには自身の `hash` も渡されるので、 `hash` にsetすることもできる。

コレ結構便利で、例えばDBへの処理を、同じクエリに対して複数行わないように結果をキャッシュするといった時、

```ruby
require 'mysql2'

client = Mysql2::Client.new

db = Hash.new do |data, sql|
  data[sql] = client.query(sql).to_a
end

# example
# 一回目はクエリが走る
user = db['SELECT * from users where id = 1']

# 二回めはクエリが走らない
user = db['SELECT * from users where id = 1']
```
みたいなことが可能です。

もう1年くらいrubyやってるのに知らなかった…
grep の便利な小技


gnu 拡張ではない普通の grep(1) は引数で指定したファイルが1個の場合、結果にファイル名を付加しない。

```sh:sample
$ ls
a
$ grep foo *
foo

```

これだけなら不便ではないのだが、find(1) と組み合わせた場合に
ファイル名が判らなくなってしまう

```sh:sample
$ ls
a
$ find . -type f -exec grep foo {} \;
foo

```

これではマッチしたファイル名が判らない。
そ様な場合は grep の引数に /dev/null を指定すると良い

```sh:sample
$ ls
a
$ find . -type f -exec grep foo /dev/null {} \;
./a:foo

```

/dev/null を指定した事で複数のファイルが指定された事になり、
/dev/null はどんな grep の検索文字にもマッチしないので、
出力される結果に影響は与えない。
fluentd (+ output mongodb) install & setup

ruby, rubygems, mongodbのセットアップは省略。

Ubuntu 12.04ですが他の環境でも基本的には変わらないと思われます。

# Install

`sudo gem install fluentd`
`sudo fluent-gem install fluent-plugin-mongo`

# Config

設定ファイルの生成
`fluentd --setup ./fluent`

`vim fluent/fluent.conf`

末尾などにコピペで追記する

```xml:fluent.conf
...
<match sample.**>
  type mongo
  host localhost
  database fluentd
  collection sample
<match sample.**>
...
```

# Start

フォアグラウンドで起動
`fluentd -c ./fluent/fluent.conf -vv`

止める時はctrl+cで

# Check

別のターミナルから
`echo '{"json":"message"}' | fluent-cat sample.test`
`echo '{"json":"message 123"}' | fluent-cat sample.test`
`echo '{"json":"message text"}' | fluent-cat sample.test`

さらに別のターミナルから
`mongo`
でmongoshellを起動
`db.sample.find({}).sort({$natural:-1})`
で挿入されたログが見れる

# TODO

- マシンの起動時に立ち上がるように設定
  - 実際の運用においてはfluentdのstable版をrmp/debパッケージ化したtd-agentを使ったほうが良い
- apache, ruby, python, node.jsなどのログをmongodbに貯めてみる
- 異常検知のプラグインを試したい
ブラウザでPython：Brythonのすすめ

まずは、[Brythonのサイト](http://www.brython.info/index_en.html)を見てください。
時計が動いていますが、これは Python で書かれています。「ソースの表示」で確認してください。

つまり、javascriptの代わりにPythonが使えます。
実際に自分のサイトで動かすのに必要な作業は、以下の通りです。ファイルの置き場所は、IISを例にしています。

* [ダウンロード先](https://code.google.com/p/brython/downloads/list)からファイルをダウンロードしてください。
* ダウンロードしたファイルを C:\inetpub\wwwroot\libs フォルダに解凍して配置してください。ただし、brython.js は、C:\inetpub\wwwroot フォルダに配置してください。
* HTMLで、head タグ内に下記のように scriptタグを入れます。
* HTMLで、body タグ内に下記のように onloadを記述します。
* HTMLで、script タグ内で type を text/python にして、Pythonを記述します。

以上です。Let's try Brython!

```html:hello.html
<html><head><script src="/brython.js"></script></head>
<body onload="brython()">
<script type="text/python">
def echo():
    alert("hello %s !" % doc["zone"].value)
</script>
<p>Your name is : <input id="zone"><button onclick="echo()">clic !</button>
</p></body></html>
```
[hello.html](http://www.brython.info/gallery/hello.html)
Log.jsをforkしてログに色付けて出すようにしてnpm publishした

カラーにしたい、ということでオプションを追加した[pull requestがLog.jsの方にある](https://github.com/visionmedia/log.js/pull/15)んだけど、待てなかったし色付けたやつ出すか、ということで作ってnpm publishした。

``` shell
npm install log-color 
```

でインストールできる。
使い方は本家Log.jsと変わらない。

``` js
var Log = require('log-color')
  , log = new Log('debug');

  log.debug('debug message.');
```

色指定したい場合だけ以下のようにやる。

``` js
var Log = require('log-color')
  , log = new Log({ level: 'debug', color: true });

  log.debug('debug message.');
```

仮引数の数が変更とかだるいし、なるべく同じ形で使えるようにしたかった。

色がない
![色がない](https://dl.dropbox.com/u/614755/qiita/log-color/no-color.png)

色がある！
![色がある](https://dl.dropbox.com/u/614755/qiita/log-color/color.png)

npmの名前空間を汚染してしまった。
Firefoxの開発ツールバーを使ってスクリーンショットを撮る

アドオンを使わずにスクリーンショットを撮ることができます。

* Shift+F2で開発ツールバーを開く
* プロンプトに```screenshot```と入力してEnter

以上でダウンロードフォルダに```Screen Shot 2013-03-01 at 17.49.17.png```のようなファイル名で保存されます。

ファイル名を指定したい場合：
```screenshot filename```

5秒後にスクリーンショットを撮りたい場合：
```screenshot --delay 5```

cssセレクタで指定した箇所だけ撮りたい場合：
```screenshot --selector #catch-copy```

その他のオプションを調べる：
```help screenshot```
コマンドラインで cp や mv する時

コマンドラインで cp や mv を実行する時にコピーや移動する先がディレクトリの場合は、明示的に '/' を付けるように習慣づけると良い。

ファイル `foo` をディレクトリ `dst` に移動する場合
`$ cp foo dst` と実行すれば移動できるが、
`dst` を `dsy` と typo した時にファイル `dsy` が存在した場合 、
ファイル `foo` でファイル`dsy` を上書きしてしまう。

`$ cp foo dsy/` と実行した場合は、
ディレクトリ `dsy` がなければエラーとなるので実害はない。

勿論ディレクトリ `dsy` が存在していて且つファイル `dsy/foo` が存在していれば
上書きしてしまうから完璧に問題を防止できる訳ではないのだが、
何もしないよりは全然良いだろう。
AIR for Android でプッシュ通知用アイコンがAIRデフォルト画像になるマジ勘弁系ポルターガイストを直す


AIR3.6で確認。

端末によって、プッシュ時に表示されるアイコンがAIRデフォルト画像になる場合がある。
↓こいつがプッシュ通知エリアなどに出てきてしまう。マジ勘弁。

![air](http://cortizone.googlecode.com/hg-history/7dcb843c4ec889b17c5c458ffe7037c61a7f7808/maven-repositories/com/adobe/flex/compiler/adt/4.6.0.23201/android/lib/resources/captive_runtime/res/drawable/air_72px_mobile_eula.png "air")


apkの中を見ると

``` text
.//res/drawable/air_72px_mobile_eula.png
.//res/drawable/mp_warning_32x32_n.png
.//res/drawable-hdpi/icon.png
.//res/drawable-ldpi/icon.png
.//res/drawable-mdpi/icon.png
```

この res/drawable/air_72px_mobile_eula.png というファイルが原因。

#AIR SDKの中の画像を直接上書きしてからapkを書き出す
という強引なやり方で解決。

```
path/to/AIR_SDK/lib/android/lib/resources/captive_runtime/res/drawable/air_72px_mobile_eula.png
```

この周辺の画像を上書きしちゃう。そしたらOK。
シェルスクリプトで便利な小技

こちらも自分の blog からの転載

シェルスクリプトを作成する時に知っておくと便利な小技たち

* `exec > ファイル`

以降の標準出力を全て ファイル に出力するので この設定をしておくと簡単な実行ログが取得出来る。
同様に `exec 2> ファイル` とすると 標準エラー出力が全て ファイル に出力されるので エラーログが取得できる。
当然 `exec > ファイル 2>&1` とすれば 標準出力も標準エラー出力も取得できる。
ファイル に /dev/null を指定すれば スクリプト実行中の出力は全て抑止されるので、cron (8) から実行される場合などでは便利な場合もある。

```sh:samble
#!/bin/sh

exec 2> ${TMP:-/tmp}/myname.log

```                

* `set -e`

スクリプト実行時に制御文以外でエラーが発生した場合に スクリプトを終了させる。
スクリプト中で実行すべきコマンドを typo した場合などで、 以降の処理が実行されると困る場合などに特に役立つ。

```sh:sample
#!/bin/sh

echo "call myfunc ..."
mtfunc                                          # 関数名を typo している
echo "end myfunc ..."

```                

この様なコードの場合 set -e されていると、 mtfunc がエラーになった時点でスクリプトが エラー終了するので以降の処理が実行されない。
当然 `if`、`while` 、`&&`、 `||` などでコマンドの結果が評価される場合は エラーにはならない。 

* `set -u`

スクリプト中で値が設定されていない変数を参照した場合に エラーメッセージを表示してスクリプトを終了させる。
シェル変数や環境変数を typo した場合など、 変数に値が設定されていない事で発生する問題が回避できる。

```sh:sample
#!/bin/sh
tempdir=/var/tmp/
mynam=myname

rm -rf ${tmpdir}/${myname}                      # 変数名を typo している

```                

この様なコードの場合、 変数名 `${tempdir}` と `${mynam}` を それぞれ typo しているので、 結果として rm -rf / に展開されてしまうが、 set -u されていると実行が防げる。
 
* `set -n`

こちらはどちらかと言うとスクリプトの開発時に有効な設定で、 コマンドは実行されないのでスクリプトの文法チェックに最適。 

* `set -x`

こちらも開発時に有効な設定で、 コマンドが実行される前にコマンドを stderr に出力する。
上の exec と組み合わせると 詳細な実行ログが取得できるのでデバッグに便利

```sh:sample
#!/bin/sh

exec 2> ${TMP:-/tmp}/debug.log
set -x

```
virtualbox(centos)にphpenvで入れたphpにPECL::memcachedをインストールする方法メモ


phpenvで入れたphpにpeclのmemcachedをインストールするメモ

## 環境

* centos6.3（ゲストOS）
* macosx10.8(ホストOS)

## 事前準備に必要なもの
* phpenvの環境 ※作っていない場合はpecl installとかでサクッとインストールしてください。
* remiのリポジトリが必要です。入れていない場合は[外部リポジトリの追加（remi,epel）](http://qiita.com/items/662e41376efa97251575)を参考にして入れてみてください。



## 必要なものをインストールする
最新のバージョンのPECL::memcached 2.1.0の場合はデフォルトのcentosのリポジトリのlibmemcachedだとエラーになったのでremiから取ってくる。

```shell
yum install memcached memcached-devel
yum install libmemcached libmemcached-devel enablerepo=remi
```

## peclからmemcachedを取得する

```shell：/tmp
cd /tmp
wget http://pecl.php.net/get/memcached-2.1.0.tgz
tar zxvf memcached-2.1.0.tgz 
cd memcached-2.1.0
```

## phpizeでコンパイル

いつもどおり

```shell：/tmp/memcached-2.1.0
cd /tmp/memcached-2.1.0
phpize
./configure
make
make test
make install
```

## memcachedのサービスの起動(自動起動)

```shell
/etc/init.d/memcached start
chkconfig memcached on
```


## nginx or httpd の再起動

php-fpmならそっちも再起動したほうがいいかも

```shell
#nginxの場合
/etc/init.d/nginx stop
/etc/init.d/nginx start
#httpdの場合
/etc/init.d/httpd stop
/etc/init.d/httpd start
```

phpinfo()とかで見る
以上
Homebrewでインストールしたruby-buildのアップグレードの仕方


rbenvで ruby-2.0.0-p0 をインストールしたいんだけど、ruby-buildが古いと 2.0.0-p0 が選択肢に出てこない。そんなときは ruby-build をアップグレードする。


以下はHomebrewでインストールしたruby-buildのアップグレードの手順。


```
brew update
brew upgrade ruby-build
rbenv install -l
```

これで 2.0.0-p0 が表示されればOK。

あとはいつも通りにインストールする。

```
rbenv install 2.0.0-p0
rbenv global 2.0.0-p0
rbenv rehash
```
UTF-8で文字化け

##文字コードで失敗した話

1.mb_send_mailで文字化けしてメール送信できないよー！
2.掲示板で相談
3.そもそも保存した時の文字コード間違ってる

発端はphpのメールフォームでmb_send_mail()しようとして
日本語がすべて?????になってしまった事象から。
再発防止の備忘録としてメモ。

mb_send_mail()で文字化けした場合、
サーバの文字コードとソースの文字コードを調べたり
mb_language()とmb_internal_encoding()
の文字コード指定をチェックをするのが基本のようで

mb_language()は[PHP: mb_language - Manual](http://php.net/manual/en/function.mb-language.php)にある通り
mb_send_mail()の送信する時の文字コード設定につかわれるので
ISO-2022-JPで送るなら"ja"もしくは"japanese"。

mb_internal_encoding()は変換元になる文字コードで
ソースをUTF-8で書いてるなら"UTF-8"。
[PHP: mb_internal_encoding - Manual](http://www.php.net/manual/ja/function.mb-internal-encoding.php)

```php:form.php
<?php
mb_language("ja");
mb_internal_encoding("UTF-8");

mb_send_mail($mailTo,$subject,$body,$header);
```

たいていは、メールの文字化けと言えばこれでOK。
ですが、相変わらずクエスチョンばかり。
ついに掲示板へ質問。
以下の確認が行われました。

*mb_internal_encoding("UTF-8")は本当にちゃんと設定できてる？
*$subjectと$bodyはその場でUTF-8で出力できてる？

結果、後者ができておらず
mb_send_mail()うんぬん以前の話であったことが判明。
穴を掘って入りたいです。

最終的にはUTF-8にBOMがくっついてたのが原因だったわけですが
EmEditorで新規作成した際に「名前を付けて保存」すると
デフォルトで「BOMを付ける」にチェックが入っているんですが
これを外し忘れていたようです。
シェルスクリプト自身のパス取得

シェルスクリプトでスクリプト自身のパスを取得する方法。
以下の処理でシェルの種類に依存せず（とは言っても bourne shell 系のみだが）
シェルスクリプト自身のパスを取得する事ができる筈。

```sh:example.sh
#!/bin/sh
# ${0} の dirname を取得
cwd=`dirname "${0}"`

# ${0} が 相対パスの場合は cd して pwd を取得
expr "${0}" : "/.*" > /dev/null || cwd=`(cd "${cwd}" && pwd)`

```
標準入力同士の diff

ブログネタなんですが、こちらで公開した方が大勢の目に触れると思うので…

コマンド command1 の出力結果と コマンド command2 の出力結果を diff (1) で比較したい場合、bash (1) の場合は以下の様にする事で簡単に比較できる。

```shell:
$ diff <(command1) <(command2)
```

bash 以外の posix shell の場合は以下の方式で同様の処理となる。

```bash:
$ command1 | ( command2 | diff /dev/fd/3 -) 3<&0
```

>command1 の結果は 3<&0 の記述に従って ファイルディスクリプタ 3 へ出力される。
>diff の第1引数は /dev/fd/3 が指定されているので command1 の出力を受け取ることができ、
>command2 の結果は直接標準出力を経由して diff の 第2引数へと渡されるので
>結果として command1 の出力と command2 の出力が比較できる。
Flaskのrequest.argsでパラメータの処理について


知ってたら楽できるのでFlask使う人には覚えて欲しい

flask.request.argsの実態はソース読むと以下のインスタンスですね。

```
werkzeug.datastructures.ImmutableMultiDict
```

request.argsで一番使うメソッドは多分getだと思うんですが実態は

```
from werkzeug.datastructures import TypeConversionDict
```

のgetメソッドです。

これのヘルプ読むと型指定できるんですね。

```
 |  ----------------------------------------------------------------------
 |  Methods inherited from TypeConversionDict:
 |  
 |  get(self, key, default=None, type=None)
 |      Return the default value if the requested data doesn't exist.
 |      If `type` is provided and is a callable it should convert the value,
 |      return it or raise a :exc:`ValueError` if that is not possible.  In
 |      this case the function will return the default as if the value was not
 |      found:
 |      
 |      >>> d = TypeConversionDict(foo='42', bar='blub')
 |      >>> d.get('foo', type=int)
 |      42
 |      >>> d.get('bar', -1, type=int)
 |      -1
 |      
 |      :param key: The key to be looked up.
 |      :param default: The default value to be returned if the key can't
 |                      be looked up.  If not further specified `None` is
 |                      returned.
 |      :param type: A callable that is used to cast the value in the
 |                   :class:`MultiDict`.  If a :exc:`ValueError` is raised
 |                   by this callable the default value is returned.
 |  
 |  ----------------------------------------------------------------------
```

つまり、このパラメータはINT型などの指定が簡単に出来るんですね。


簡単な例を挙げると、参照系のAPIでoffset, limitパラメータをよく作ると思いますが型の指定を含めて下の2行で出来てしまいます。

```python
    offset = request.args.get("offset", default=0, type=int)
    limit = request.args.get("limit", default=10, type=int)
```


Flaskのドキュメント読むだけでは気付けないことが結構あるのでwerkzeugのドキュメントや実装読んだりしてみると意外と発見があるのでぜひ読んで下さい。

これをもっと拡張すると自作のデータ型を使ってパラメータを受け取ることも可能です。

```python
class SortType(object):
    accepts = ["-time", "-size", "+time", "+size"]    
    default = ["-time"]

    def __init__(self, sort_parameter):
        super(SortType, self).__init__()    
        if sort_parameter in self.accepts:
           self.sort = sort_parameter
        else:
           self.sort = self.default

    def __repr__(self):
        return self.sort

    def __str__(self):
        return self.sort
```

```python
sort = '%s' % request.args.get("sort", type=SortType)
```

いくつかのソートタイプとデフォルトのソートをもつクラスを定義して type にそれを定義して sortパラメータを受け取ってます。
Androidアプリで作ったファイルがPCに接続すると見えない場合

機種によっては、Androidアプリで作ったファイルが、PCから見れない場合がある。
(adb接続をすると見える)

```java:sample.java
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
```
とやると見える。
が、マウントのBroadcastが走るため、ウイルススキャンアプリが入っているとスキャンが走ってしまう諸刃の剣。

参考
https://groups.google.com/forum/#!topic/android-group-japan/_cVr-BwVHPo
Open it Sleipnir :bookmarklet for Safari

Sleipnir Mobileがあまりにも気に入ったのでSafariから開き直すブックマークレットが欲しかった。探すよりも作る方が早そうだった。


適当に保存したブックマーク（このページでもいい）のURL欄に以下を貼り付け。  

`javascript:(function()%7Bvar%20u=location.href;location.href=u.replace(/%5Ehttp/,'sleipnir');%7D)();
`

Chrome派の人は`sleipnir`を`googlechrome`に替えてください。
ちなみに、httpsページもキチンとhttpsで開き直しますのでご安心を。
FlaskでLast-Modifiedを設定する最も簡単な方法


[flaskでjsonを返すサンプルコード - uokadaの日記](http://uokada.hatenablog.jp/entry/2012/11/10/002453 "flaskでjsonを返すサンプルコード - uokadaの日記")

上のエントリからしばらく開いてしまったけどStack Overflowみてたら簡単な方法を見つけたので紹介する。
[http - RFC 1123 Date Representation in Python? - Stack Overflow](http://stackoverflow.com/questions/225086/rfc-1123-date-representation-in-python "http - RFC 1123 Date Representation in Python? - Stack Overflow")


```
from wsgiref.handlers import format_date_time
```
このformat_date_time関数がポイント。
これにタイムスタンプを渡せばRFC1123形式へフォーマットして出力してくれる。


サンプルコードはこんな感じ。

```python
#!/usr/bin/env  python2.7
from flask import Flask, jsonify, after_this_request
from wsgiref.handlers import format_date_time
from datetime import datetime
from time import mktime


app = Flask(__name__)

@app.route('/name/<name>.json')
def hello_world(name):
    greet = "Hello %s from flask!" % name
    result = {
        "Result":{
        "Greeting": greet
        }
    }
    @after_this_request
    def d_header(response):
        """ add header

        Arguments:
        - `response`:
        """
        now = datetime.now()
        stamp = mktime(now.timetuple())
        response.headers['Last-Modified'] = \
            format_date_time(stamp)
        return response
    return jsonify(ResultSet=result)

if __name__ == '__main__':
    app.run(debug=True)
```


スクリプトを起動してアプリケーションが返すヘッダーを確認します。

```shell
% curl -I localhost:5000/name/uokada.json
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 91
Last-Modified: Thu, 28 Feb 2013 17:47:20 GMT
Server: Werkzeug/0.8.3 Python/2.7.1
Date: Thu, 28 Feb 2013 17:47:20 GMT
```

Last-ModifiedがちゃんとRFC 1123の形式で出力されてますね。

この関数、日本語訳されているドキュメントに載ってないので全然気づかなかった。
[20.4. wsgiref — WSGI ユーティリティとリファレンス実装 — Python 2.7ja1 documentation](http://docs.python.jp/2/library/wsgiref.html "20.4. wsgiref — WSGI ユーティリティとリファレンス実装 — Python 2.7ja1 documentation")
EB4Jでwordnetを検索してみた。

wordnetは英英辞書
検索語を以下にセットして実行すると見出しと内容が前方一致で当たっただけでてくる
final String word = "gun";←ここ

wordnetのCATALOGファイルとWINフォルダを同じ階層に置く
この場合ここ　"C:\\Users\\DLtool\\"
windowsで試した
参考
http://d.hatena.ne.jp/argius/20120828/1346160359
WordNet公式　http://wordnet.princeton.edu/
EPWING形式配布サイト http://www.vector.co.jp/soft/data/writing/se323658.html

以下を外部jarに突っ込んだが全部必要かはわからない。
commons-lang-2.4.jar
eb4j-core-1.0.5.jar
slf4j-api-1.5.10.jar
slf4j-nop-1.5.10.jar

友人がandroidで試してくれて動いているが
この方法でやったかはわからないｗ
この場合、andoidにwordnetを入れる必要がある。

heading とtextの組はあるだけ出てくる。
三単現のsを当てにくい。この場合ケツを削るといいかも

```java
package com.ts;

import fuku.eb4j.Book;
import fuku.eb4j.EBException;
import fuku.eb4j.Result;
import fuku.eb4j.Searcher;
import fuku.eb4j.SubBook;
import fuku.eb4j.hook.DefaultHook;
import fuku.eb4j.hook.Hook;

public class eb4j_test {

	public static void main(String[] args) throws EBException {

		final String word = "gun"; //検索ワード
		//語幹が当たらないものと　当たるものがある謎だ。
		//当たらない例　enterprises  companies adds gets hits
		//当たる例　phenomena has 
		
		Book book = new Book("C:\\Users\\DLtool\\");//EPWINGのCATALOGがあるディレクトリを指定
		SubBook[] subbooks = book.getSubBooks();
		SubBook dic = subbooks[0]; // １つしかないので
		
		//http://eb4j.sourceforge.jp/apidocs/fuku/eb4j/SubBook.html 関数の説明
		Searcher searcher = dic.searchWord(word); // 前方一致
		Hook<String> hook = new DefaultHook(dic);
		
		String textString;
		while (true) {
		    Result result = searcher.getNextResult();
		    if (result == null)
		        break;
		    final String heading = result.getHeading(hook);
		    final String text = result.getText(hook);
		    
		    textString ="heading:"+heading+"\n"+"text:"+text;
			System.out.println(textString);
		}

	}

}

```
シングルトンインスタンスへポインタのようにアクセスする

シングルトンのインスタンスのアクセスする際に、
defineで置き換えることでクラスへのポインタのようにアクセスができる。
ただ肩身の狭いマクロ定義なので使う人はほとんどいないと思いますが・・・

```cpp
class Manager
{
public:
    static Manager* GetInstance(){
        static Manager m_instance;
        return &m_instance;
    }
    void Hoge();
private:
    Manager();
    ~Manager();
    Manager(const Manager& _Manager);
    Manager& operator=(const Manager& _Manager);
}

// マクロによる定義
#define lpManager Manager::GetInstance()
```

アクセス例) lpManager->Hoge();
Gruntで任意のシェルコマンドを登録する

Gruntfile.coffeeで任意のシェルのタスクを登録するサンプル

```coffee

# in gruntfile.coffee
 
{exec} = require('child_process')
runCommand = (exp, done) ->
  exec exp, (error, stdout, stderr) ->
    return done(true) if error or stderr
    done(false,stdout)
 
grunt.registerMultiTask 'test', 'test command', ->
  conf = @
  done = conf.async()
  runCommand 'ls -l', (error, ret) =>
    if error
      grunt.log.writeln('error')
      return done(false)
    grunt.log.writeln('done);
    done(true)
```

同様のことをする grunt-execというのがすでにあります
jharding/grunt-exec · GitHub https://github.com/jharding/grunt-exec

ただ、このイディオムを覚えておくと任意のJSオブジェクトをインポートしたり、fsで制御したりできるので便利です
Emacsでテキストをソートする

Emacs でテキストをソートするときは今まで C-u M-| sort でソートしてましたが
関数が存在することを今更ながら知りました。

ソートする範囲を選択して M-x sort-lines を実行します。
逆順にソートするときは C-u M-x sort-lines。

他にもフィールド単位, 段落単位, ページ単位などソートする関数がいろいろ定義されています。
詳細は Emacs の info の Sorting を参照。
unite-grepのバックエンドをagに切り替える

```vim
let g:unite_source_grep_command = 'ag'
let g:unite_source_grep_default_opts = '--nocolor --nogroup'
let g:unite_source_grep_recursive_opt = ''
let g:unite_source_grep_max_candidates = 200
```

これをvimrcに書く。

追記: 最初からrecursiveだからオプション要らなかった。
自分のGithubのソースコードをオフラインで高速に検索出来るMyGithub

![mygithub](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130228/20130228010644.jpg)

[Qiita Hackathon 03](http://ongaeshi.hatenablog.com/entry/20130206/1360164614) で作っていたやつです、やっと公開することが出来ました。

- パッチ的に作っていた部分を共通化
- 上書きしていた関数はフックとして呼び出せるように

などなど、Milkodeがバージョンアップしても動かなくなることが無いようにするのに時間がかかりました。

Qiita Hackathon に参加していなければMyGithubは生まれなかったと思います。次回ハッカソンも是非参加したいです。

[[記事本文へ]](http://ongaeshi.hatenablog.com/entry/2013/02/28/100921)
他のRegionで同じもしくは近いKernel Nameを持つAKIを調べる方法


例えば以下のようにEC2でSnapshotから作ったAMIのインスタンスが正常起動しない場合があります。

- 西海岸のリージョンで作ったスナップショットを東京リージョンにコピー
- スナップショットにからAMIを作成
- AMIからEC2のインスタンスを起動したら「Instance Status Checks」に失敗する

原因はKernel ID はリージョン毎に異なるためで、解決方法としては、Kernel Name が同じもの、もしくは近いものを東京リージョンで選びインスタンスを起動しないといけません。

例えば、西海岸リージョンのaki-9ba0f1de のKernel name は以下となります。

```
ec2-public-images-us-west-1/pv-grub-hd0-V1.01-x86_64.gz.manifest.xml
```

こちらはEC2コマンドラインAPIツールより以下のようにご確認できます。

```
ec2-describe-images aki-9ba0f1de --region us-west-1
IMAGE   aki-9ba0f1de    ec2-public-images-us-west-1/pv-grub-hd0-V1.01-x86_64.gz.manifest.xml    amazon  available       public          x86_64  kernel         instance-store   paravirtual     xen
```

同じKernel nameを持つAKIを東京リージョンで検索した結果は以下となります。

```
ec2-describe-images -o amazon --region ap-northeast-1 | grep pv-grub-hd0-V1.01-x86_64
IMAGE aki-d409a2d5 ec2-public-images-ap-northeast-1/pv-grub-hd0-V1.01-x86_64.gz.manifest.xml amazon available public x86_64 kernel instance-store paravirtual xen
```

ということで、東京リージョンでは　aki-d409a2d5　を選択してインスタンスを起動すればよいということになります。

また、pv-grub-hd0 x86_64系の最新版は aki-44992845 （バージョン1.03）となっているのでこちらを指定する方法でもいけます。

PV-GRUB AKI のリストの見方
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/UserProvidedkernels.html#AmazonKernelImageIDs
Gitlabをサブディレクトリで動かしたらアイコンが表示されなかった

アイコンの表示個所を一生懸命探したけど、実際は[Font Awesome](http://fortawesome.github.com/Font-Awesome/)で表示しているらしい。

サブディレクトリ以下で動かす時はconfig/gitlab.ymlで```relative_url_root: /gitlab```を設定する必要があるが、assetのコンパイル時にFont Awesomeはこれを見ていない模様。

[Issue 2162](https://github.com/gitlabhq/gitlabhq/pull/2162)で議論されて、プルリクエストも出ているのでそのうち直ると思うけどとりあえずはasset compile時に

```bash
$ RAILS_RELATIVE_URL_ROOT="/gitlab" bundle exec rake assets:precompile RAILS_ENV=production
```

とすれば対処可能。
Emacsで今見ているバッファの行数を数える

`C-x l` を押す。がちゃがちゃ押してたら偶然見つけた。

```
 Page has 129 lines (40 + 89)
```
全部で129行、40は現在行で残り89行という意味。
`M-x count-lines-page` でも同じ。
Gowebで静的ページとRESTful APIを両方ともハンドリングする


「http://localhost:8080/」でアクセスされたら、index.htmlを「http://localhost:8080/api/リソース名」でアクセスされたらRestful APIでハンドリングするには以下の様にハンドリングすればいい。

```main.go
package main

import (
	"fmt"
	"github.com/stretchrcom/goweb/goweb"
	"net/http"
)

func main() {

	// Gowebのコントローラーの登録とかをする

	// RESTful APIのハンドリング -> Gowebへ
	http.Handle("/api/", http.StripPrefix("/api", goweb.DefaultHttpHandler))

	// 静的ファイルのハンドリング -> ファイルサーバへ
	http.Handle("/", http.FileServer(http.Dir("static")))

	// Webサーバの開始
	http.Handle("/", http.FileServer(http.Dir("static")))
}

```
onloadに複数の関数を登録する。

```:javascript
    function addOnloadEvent(fnc){  
      if ( typeof window.addEventListener != "undefined" )  
        window.addEventListener( "load", fnc, false );  
      else if ( typeof window.attachEvent != "undefined" ) {  
        window.attachEvent( "onload", fnc );  
      }  
      else {  
        if ( window.onload != null ) {  
          var oldOnload = window.onload;  
          window.onload = function ( e ) {  
            oldOnload( e );  
            window[fnc]();  
          };  
        }  
        else  
          window.onload = fnc;  
      }  
    }  
```

[Javascript　onloadが複数ある場合の対処法　～FancyZoomとCubeブログシールを共存させる](http://lets-customize.seesaa.net/article/101533572.html)
文字列からハッシュに変換

ググると二回ループを回す例が多いですが、一回で出来ます。

```perl:string_to_hash.pl
use Data::Dumper;
# この例では「,」がレコードの区切り、「:」がキーと値の区切り
my $string = "1:abc,2:def,3:ghi,4:jkl";

my %hash = split(/[:,]/, $string)

print Dumper \%hash;
```

実行結果

```
$VAR1 = {
          '4' => 'jkl',
          '1' => 'abc',
          '3' => 'ghi',
          '2' => 'def'
        };
```

ハッシュなので順番は保障されません。
Invalid instantiator of type "%s" for "NULL".

```php:Invalid_instantiator.php
$serviceManager->get('\Foo\Bar');
// Exception 
// Invalid instantiator of type "\\Foo\\Bar" for "NULL".
```

検索されるクラス名に\が付いていると、RuntimeDefinitionでReflectionにより処理されたクラス名と不一致が起きるため。

```php:RuntimeDefinition.php
        /** @var $rClass \Zend\Code\Reflection\ClassReflection */
        $rClass = new Reflection\ClassReflection($class);
        $className = $rClass->getName();
        $matches = null; // used for regex below

        // setup the key in classes
        $this->classes[$className] = array(
            'supertypes'   => array(),
            'instantiator' => null,
            'methods'      => array(),
            'parameters'   => array()
        );
```

同じ例外を起こす別のパターンとしては、
+ Diを使っている時に、必須パラメーターが不足しているとき
+ AbstractPluginManagerなどでDiAbstractFactoryの使用時、DIを優先するためにUSE_SL_AFTER_DIを指定できるが、一部のパラメーターでSL上のサービスをインジェクションしたい場合、DI上に定義が存在しないとき。

など、その他、Definition上の不一致で生じることがある。

なお、依存性の解決優先順位はコメントを抜き出すと、
// PRIORITY 1 - consult user provided parameters
// PRIORITY 2 - specific instance configuration (thisAlias) - this alias
// PRIORITY 3 - THEN specific instance configuration (thisClass) - this class
// PRIORITY 4 - THEN specific instance configuration (requestedAlias) - requested alias
// PRIORITY 5 - THEN specific instance configuration (requestedClass) - requested class
// PRIORITY 6 - globally preferred implementations
// next consult class level preferred instances

となっている。
InvalidInstantiatorが設定ミスのために発生するのでこれを完全に抑止することは好ましくないが、たとえば、Loggerのようにグローバルに使いまわす可能性が高いものや、ServiceLocatorのように暗黙にアプリケーションスコープのサービスロケーターを期待する場合などは、typePreferenceを追加して自動的に解決させるという選択肢がある。
上記のようにPriority6 と6+でTypePreferencesは解決されるので、別のオブジェクトを抽入したい場合には適切に設定を行う必要がある。特定のinterfaceに対してグローバルなオブジェクトを割り当てておき、スコープ内でのオブジェクトを使うときだけ明示的に指定するといった場合にTypePreferencesは便利な選択となる。
Tomcat クラスタ構成設定(FreeBSD Edit.)



##install
make なり portinstall でインストール。

```console:console1
# cd /usr/ports/www/tomcat7
# make config-recursive
# make install clean
```

##make base dir
インストールしたらベースとなるディレクトリを作る。 
Tomcat がインストールされているパスを確認してリンクを貼ったり起動スクリプトや conf ディレクトリのコピー、設定をします。 (必要であればポート番号も変更。)
(設定方法は割愛)

```console:console2
# mkdir -p /usr/local/tomcat/tomcat7_1
# cd /usr/local/tomcat/tomcat7_1
# ln -s /usr/local/apache-tomcat-7.0/bin .
# ln -s /usr/local/apache-tomcat-7.0/endorsed .
# ln -s /usr/local/apache-tomcat-7.0/lib .
# ln -s /usr/local/apache-tomcat-7.0/logs .
# ln -s /usr/local/apache-tomcat-7.0/temp .
# ln -s /usr/local/apache-tomcat-7.0/webapps .
# ln -s /usr/local/apache-tomcat-7.0/work .
# cp -R /usr/local/apache-tomcat-7.0/conf .
# cp /usr/local/etc/rc.d/tomcat7 /usr/local/etc/rc.d/tomcat7_1
```

## touch init script
起動スクリプトを書き換える。なんだかパスがハードコーディングされているみたいだったので変数に置き換える。(バージョンアップされたら泣くのかな、、、w)

```console:console3
# diff tomcat7 tomcat7_1
86,87c86,87
< eval "_tomcat_catalina_home='/usr/local/apache-tomcat-7.0'"
< eval "_tomcat_catalina_base=\${${name}_catalina_base:-'/usr/local/apache-tomcat-7.0'}"
---
> eval "_tomcat_catalina_home='/usr/local/tomcat/${name}'"
> eval "_tomcat_catalina_base=\${${name}_catalina_base:-'${_tomcat_catalina_home}'}"
95,96c95,96
< eval "_tomcat_java_opts=\${${name}_java_opts:-''}"
< eval "_tomcat_wait=\${${name}_wait:-'30'}"
---
> eval "_tomcat_java_opts=\${${name}_java_opts:-''}\ \${tomcat7_java_opts:-''}"
> eval "_tomcat_wait=\${${name}_wait:-'60'}"
113c113
<       -classpath '/usr/local/apache-tomcat-7.0/bin/bootstrap.jar:/usr/local/share/java/classes/commons-daemon.jar:/usr/local/apache-tomcat-7.0/bin/tomcat-juli.jar${_tomcat_classpath}' \
---
>       -classpath '${_tomcat_catalina_home}/bin/bootstrap.jar:/usr/local/share/java/classes/commons-daemon.jar:${_tomcat_catalina_home}/bin/tomcat-juli.jar${_tomcat_classpath}' \
117c117
<       -Djava.endorsed.dirs='/usr/local/apache-tomcat-7.0/endorsed' \
---
>       -Djava.endorsed.dirs='${_tomcat_catalina_home}/endorsed' \
```

## clone Tomcat
後は、ベースをコピーしてポート番号を変える。
(設定方法は割愛)

```console:console3
# cd /usr/local/tomcat/
# cp -R tomcat7_1 tomcat7_2
# cp /usr/local/etc/rc.d/tomcat7_1 /usr/local/etc/rc.d/tomcat7_2
```
特定要素中の特定座標のクリックイベントを発生させる

キャンバス系のWebアプリでテスト自動化をする場合にはこういうことをする必要がありました。

```
var e = new jQuery.Event("click");
e.offsetX = 100;
e.offsetY = 100;
$('#hoge').trigger(e);
```
rmコマンドでファイルを消さずにごみ箱に移動させる

```sh
$ which rm
rm: aliased to gmv -f --backup=numbered --target-directory ~/.Trash
```

どうせファイル容量なんかたいしたことないので，`rm`コマンドで出来るだけ事故を起こさないように移動させるだけにしておく．
同名ファイルが既にあるときは，`filename.~1~`のような形でナンバリングされる．
virtualbox(centos)にphpmyadmin+nginxでインストールする方法メモ


nginxでphpmyadminを設定する方法のメモ

## 環境

* centos6.3（ゲストOS）
* macosx10.8(ホストOS)

## 事前準備に必要なもの
* nginx ※入れてない方は[virtualbox(centos)でnginxをwebsocketを使用出来る状態でインストールする方法メモ](http://qiita.com/items/40b527c390f068985f75)を参照してください
* php-build+phpenvでPHPをインストール済みであること。インストールしていない場合は[virtualbox(centos)でphpenv+php-buildインストールメモ(5.3,5.4変更確認まで)](http://qiita.com/items/7d031440bb174a55a6a1)を参照してください。
* mysql ※入れていない方は[virtualbox(centos)でMYSQLインストールメモ(mysqld_multiで複数インスタンス起動まで)](http://qiita.com/items/73df4ab45c96092b63b8)を参照してください。

## 参考にしたサイト

* [MySQL用GUI設定ツール導入(phpMyAdmin)](http://centossrv.com/phpmyadmin.shtml)


## nginxの設定を追加する

ソースからコンパイルしている場合は/usr/local/nginx/conf/nginx.confとか
yumでインストールしている場合は
/etc/nginx/conf/conf.d/default.confとかにあります。
httpディレクティブの項目に追加するだけです。

```shell:/usr/local/nginx/conf/nginx.conf
http {
#下記の項目を追加
    server {
        listen       80;
        server_name  lo.pma.org;
        root   /home/web/lo.pma.org/www; #ドキュメントルートは適時変更してください
        index  index.php index.html index.htm;
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/web/lo.pma.org/www$fastcgi_script_name; #ドキュメントルートは適時変更してください
            include        fastcgi_params;
        }
    }
}
```


## phpMyAdminのインストール

svnから一発で

```shell
#ココらへんの設定は各自で
cd /home/web/lo.pma.org/www
svn checkout https://phpmyadmin.svn.sourceforge.net/svnroot/phpmyadmin/tags/STABLE/phpMyAdmin ./
```

## configファイルの編集

デフォルトファイルは残しておきましょうね

```shell:/home/web/lo.pma.org/www/
cp /home/web/lo.pma.org/www/config.sample.inc.php /home/web/lo.pma.org/www/config.inc.php
```

編集

```php:/home/web/lo.pma.org/www/config.inc.php
#修正前
$cfg['blowfish_secret'] = '';
#修正後
$cfg['blowfish_secret'] = 'ojwelolk6gmsswpgqosameeBmtxswelzamM4wdfcfolbz>'; #適当な42文字
#修正前
$cfg['Servers'][$i]['host'] = 'localhost';
#修正後
$cfg['Servers'][$i]['host'] = '127.0.0.1';

#追加
$cfg['Server'][$i]['port'] = '3306';
```

上記の設定の追加はmysqld_multiで複数ポートで運用している場合です。そうではない場合はblowfish_secretだけでOKです

## nginxの再起動

動いていなければstartだけOKです。ちなみにrestartだと動かなかったです。

```shell
/etc/init.d/nginx stop
nginx を停止中:                                            [  OK  ]


/etc/init.d/nginx start
nginx を起動中:                                            [  OK  ]
```


## hostOS側のhostsを追加

ローカル環境だと思うので

### ifconfigで自分のipを調べる

```shell
ifconfig

#下記の項目(inet)がどこかにあるのでメモしておく（デフォルトだと192.168.xx.xxx）なはず
inet addr:192.168.56.101
```

### hostsファイルの編集

※windowsの場合は「windows host」とかでググってください。
今回はmacの場合で説明します


```shell:/etc/hosts
sudo vim /etc/hosts

192.168.56.101  lo.jenkins.org #ifconfigで調べたipとホストOSから見る場合のvirtualhostを指定する
```


## 動作確認

hostsで書いたアドレスにアクセス
今回は[http://lo.pma.org](http://lo.pma.org)にアクセスしてphpmyadminのログイン画面が見えればOK!!


大体10分くらいでできました。
virtualbox(centos)にjenkins+nginxでインストールする方法メモ


自動タスクはjenkinsですよね！！ってとある人に言われた。
存在は知っているが入れた事はない
では「いつやるか？」
「今でしょう！！」
またcentosがCUIなのでnginxのリバースプロキシ経由でホストOS側から参照できるようにする

## 環境

* centos6.3（ゲストOS）
* macosx10.8(ホストOS)

## 事前準備に必要なもの
* ここから先は全てroo(権限)ユーザーで実行しています
* nginx ※入れてない方は[virtualbox(centos)でnginxをwebsocketを使用出来る状態でインストールする方法メモ](http://qiita.com/items/40b527c390f068985f75)を参照してください

## 参考にしたサイト

* [jenkins本家](https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+RedHat+distributions)
* [さくらのVPSにJenkins/Nginxをインストールする](http://d.hatena.ne.jp/FGtatsuro/20120603/1338653541)


## javaのインストール（古いバージョンの場合はアンインストール）

jenkinsはjavaが1.6.0 < しか動かないらしいです。（本当か？）
centosのデフォルトのバージョンだとjavaが1.5系なのでもしjavaが既に入ってる場合はアンインストールしましょう。

```shell
java -version


java version "1.5.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.8) (rhel-1.56.1.11.8.el6_3-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
```

### 入ってた場合

```shell
yum remove java
```

## javaのインストール

本家どおりで問題なし

```shell
yum install java-1.6.0-openjdk java-1.6.0-openjdk-devel
```


## jenkinsのリポジトリの追加とjenkins本体のインストール

これも本家通りでOK

```shell
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum install jenkins
```

## jenkinsの設定の追加

nginxにリバースプロキシの設定をかけるためには以下のファイルを編集する必要がある

```shell:/etc/sysconfig/jenkins
vim /etc/sysconfig/jenkins

#修正前
JENKINS_ARGS=""
#修正後
JENKINS_ARGS="--prefix=/jenkins --httpPort=${JENKINS_PORT} --ajp13Port=${JENKINS_AJP_PORT}"
```

## nginxのjenkinsの設定

ソースからコンパイルしている場合は/usr/local/nginx/conf/nginx.confとか
yumでインストールしている場合は
/etc/nginx/conf/conf.d/default.confとかにあります。
httpディレクティブの項目に追加するだけです。

```shell:/usr/local/nginx/conf/nginx.conf
http {
#下記の項目を追加
    #jekins 
    server {
        listen 80;
        server_name lo.jenkins.org; #host名
        location /jenkins {
            proxy_pass http://localhost:8080;
        }
    }
}
```

## jenkinsの起動

いつもどおり

```shell
/etc/init.d/jenkins start
Starting Jenkins                                           [  OK  ]
```

### jenkinsの自動起動設定

これもいつもどおり

```shell
chkconfig jenkins on
```

## nginxの再起動

動いていなければstartだけOKです。ちなみにrestartだと動かなかったです。

```shell
/etc/init.d/nginx stop
nginx を停止中:                                            [  OK  ]


/etc/init.d/nginx start
nginx を起動中:                                            [  OK  ]
```


## hostOS側のhostsを追加

ローカル環境だと思うので

### ifconfigで自分のipを調べる

```shell
ifconfig

#下記の項目(inet)がどこかにあるのでメモしておく（デフォルトだと192.168.xx.xxx）なはず
inet addr:192.168.56.101
```

### hostsファイルの編集

※windowsの場合は「windows host」とかでググってください。
今回はmacの場合で説明します


```shell:/etc/hosts
sudo vim /etc/hosts

192.168.56.101  lo.jenkins.org #ifconfigで調べたipとホストOSから見る場合のvirtualhostを指定する
```


## 動作確認

hostsで書いたアドレスにアクセス
今回は[http://lo.jenkins.org/jenkins](http://lo.jenkins.org/jenkins)にアクセスしてjenkinsが見えればOK!!


大体２０分くらいでできました。
UIImageView 画像リソースを使わないお手軽Highlighted


UIImageViewは通常時とハイライト時の2種類の画像を設定出来ます。
例えば以下のようなNormalとHighlightedの2種類の画像を用意してコードでhighlightedを切り替えると、UIImageViewの選択状態と非選択状態をわかりやすく表せます。
![Normal](http://f.cl.ly/items/3e1k2F1B3L240O0F2U3L/Aru200x200.png) ![Highlighted](http://f.cl.ly/items/1E3N2W2z0C0G3c3L0T1V/Aru200x200-Highlighted@2x.png)

```objectivec:Sample.m
// それぞれの画像で初期化
UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Normal"]
                                             highlightedImage:[UIImage imageNamed:@"Highlighted"]];

// highlightedで画像の切替が出来る
imgView.highlighted = YES;
imgView.highlighted = NO;
```

けど、わざわざHighlighted用の画像用意するのは・・・めんどくさい。
コードで画像合成するのも・・・めんどくさい。
他のViewを重ねるのも・・・ちょっと煩雑。

というわけでHighlighted用の画像リソース、画像合成、他のViewもなしなお手軽Highlighted実装です。
やり方はUIImageViewのbackgourndColorとalphaをいじるだけです。

## サンプルコード
画像をtouchDown時にHighlighted(少し暗く)でtouchUpになったらNormalの状態に戻るサンプルです。
簡単に実装するために前回投稿したtouchDownとtouchUpのイベントをblockで設定出来る[ジェスチャークラス](http://qiita.com/items/13aefd76ea66b5e6edd1)を使います。
例えば画像をボタンの様にタップしたときなどの、フィードバックをわかりやすくしたいときに使えます。

```objectivec:Sample.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Normal"]];
	// タッチイベントを受け付ける
    self.imageView.userInteractionEnabled = YES;
    
    YSTapUpDownGestureRecognizer *tap = [[YSTapUpDownGestureRecognizer alloc] initWithTouchDown:^(YSTapUpDownGestureRecognizer *tapGesture, NSSet *touches, UIEvent *event){
		 // 少し暗くする
        self.imageView.backgroundColor = [UIColor blackColor];
        self.imageView.alpha = 0.8f;
    }touchUp:^(YSTapUpDownGestureRecognizer *tapGesture, NSSet *touches, UIEvent *event, BOOL isTouchUpInside){
		 // 通常に戻す
        self.imageView.backgroundColor = [UIColor clearColor];
        self.imageView.alpha = 1.f;
    }];

    [self.imageView addGestureRecognizer:tap];
```

透明部分がある画像や色合いをちゃんと調整したい場合はHighlighted用の画像を用意する必要がありますが、touchDown時にちょっと暗くしたいくらいだったらこれで事足りると思います。

## 参考

もしかしたらよくある手法なのかもしれませんが、すごくはっとするアイデアでした。

http://stackoverflow.com/questions/9499327/highlighting-uiimageview-with-grey-color
フォルダ内の.DS_Storeをすべて削除する

##ターミナルで実行
```shell:
$> find . -name .DS_Store -print0 | xargs -0 rm
```

Macで作成したフォルダをアップしたりWindowsでみたりすると
.DS_Storeさんがうざいのでコレで一発です。
Facebook Javascript SDKのFeedDialogの大きさが2倍になるバグに対処する


# AndroidのDensityが高いやつではFacebook Feed Dialogの幅が2倍になって、横スクロールしてしまう

Feed Dialog
https://developers.facebook.com/docs/reference/dialogs/feed/

ほかのDialog系も同じことになるかと思われる

## CSSのルールを動的に追加すると直る

``` javascript
var bodyW = $('body').css('width');
var css = document.styleSheets.item(0);
var idx = document.styleSheets[0].cssRules.length;
css.insertRule("body.android #fb-root .fb_dialog_mobile iframe { width:" 
               + bodyW + " !important; }",	idx);

```

FB.ui(feedDialogOption, callback)を叩く直前くらいに↑をやる
Away3D Tips "Transformation of 3D coords and 2D coords"

## Utility

```as3
/**
 * 床のマウス座標(2D座標)から3D座標を求める
 * 用途: マウスカーソルに追随する床の目印など 
 */
public function get3DcoordsFrom2D():Vector3D
{
	if (!isNaN(mouseX) && !isNaN(mouseY)){
		var pico:PickingCollisionVO = view.mousePicker.getViewCollision(mouseX, mouseY, view);
		if (pico){
			return new Vector3D(pico.localPosition.x, pico.localPosition.y, pico.localPosition.z);
		}
	}
	return null;
}

/**
 * メッシュの3D座標からスクリーン2D座標を求める
 * 用途: キャラクターの頭上に表示する2Dのインジケータなど
 */
public function get2DcoordsFromMesh(mesh:Mesh):Point
{
	var pos2D:Vector3D = view.project(mesh.sceneTransform.position);
	return new Point(pos2D.x, pos2D.y);
}
```

## 準備
view.mousePickerに反応させるためには、床オブジェクトに対して以下の操作が必要です。

```as3
floor.mouseEnabled = true;
```

## 使い方

enterframe内

```as3
var vec:Vector3D = get3DcoordsFrom2D();
if(vec){
	mesh.x = vec.x;
	mesh.z = vec.z;
}
var p:Point = get2DcoordsFromMesh(mesh);
square.x = p.x - square.width/2;
square.y = p.y - square.height; //高さに調整必要
view.render();
```

## その他
- 実際に使う際はreturn で newさせるのではなくお好みで値を設定させるなどしてください
- キャラの頭に設定したいときは、インジケータ用ダミーのMeshを頭に設定するときれいにハマります