OmniAICreator/Qiita-1.07M huggingface dataset:
SQL ログを出力する

`conf/application.conf` で以下の設定を有効化すると、playframework が実行する SQL ログをコンソールに出力することができます。

```
# Debug SQL statements (logged using DEBUG level):
jpa.debugSQL=true
```

ただ、これだけではバインドされた変数の値は分かりません。こちらは `conf/application.conf` と `log4j.properties` に Hibernate のオプションを指定することで出力することができます。

```
# You can even specify additional hibernate properties here:
# hibernate.use_sql_comments=true
# ...
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.use_sql_comments=true
```

```
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.logger.org.hibernate.hql.ast.AST=info
log4j.logger.org.hibernate.tool.hbm2ddl=warn
log4j.logger.org.hibernate.hql=debug
log4j.logger.org.hibernate.cache=info
log4j.logger.org.hibernate.jdbc=debug

log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
log4j.appender.hb.layout.ConversionPattern=HibernateLog --> %d{HH:mm:ss} %-5p %c - %m%n
log4j.appender.hb.Threshold=TRACE
```

### 参考

- [java - Hibernate show real SQL - Stack Overflow](http://stackoverflow.com/questions/2536829/hibernate-show-real-sql)
評価版VMWare Fusionがダウンロードできない

ダウンロードページに

    この製品の登録が完了していません。
    You have not registered for this product. 

というメッセージが表示され。ボタンを押すが同じページが読み込まれる状態

*解決策

フリーメールでユーザー登録しているとこうなるらしい

- http://4-mind.net/2441203.html

    521:460 ：2012/08/28(火) 16:25:21
    >>518 
    gmailで行けたの？俺はgmailはダメだった。 
    プロバイダーのメールでやり直したらダウンロードできた。

たぶん無限メアド(ナツい)されて無償で使い続けられることへのゆるい対策? かな。
【WP-Champloo】文字数を指定して取得する関数

タイトル・抜粋・カスタムフィールド等の文字数を指定して取得する関数です。

## ソースコード

```php5:functions.php
<?php
/**
* @function get_trim_str
* @param str(string), len(int), suffix(string), echo(bool)
* @return string
*/
if(!function_exists('get_trim_str')){
	function get_trim_str($args = ''){

		$defaults = array(
			'str' => '',
			'len' => 30,
			'suffix' => '..',
			'echo' => true
		);
		$args = wp_parse_args($args, $defaults);
		extract($args, EXTR_SKIP);

		$str = esc_html($str);
		$len = intval($len);
		$suffix = esc_html($suffix);

		if(mb_strlen($str, 'UTF-8') > $len){
			$output = mb_substr($str, 0, $len, 'UTF-8').$suffix;
		}else{
			$output = $str;
		}

		if($echo){
			echo $output;
		}else{
			return $output;
		}
	}
}
?>
```


## パラメータ

**str（取り出したい文字列を含む文字列）**

**len（取り出す文字数を指定）**

* 30（正数）**初期値**

**suffix（接尾辞）**

* ..（文字列）**初期値**

**echo （出力）**

* 1（true）**初期値**
* 2（false）


## 使用例
**抜粋の文字数を指定して表示したい場合**

```php5:ソース
<?php get_trim_str(array('str'=>get_the_excerpt(), 'len'=>100)); ?>
```
node.jsの管理をhomebrewからnodebrewに変えて、npmをインストール


しばらくnode.jsの環境をほったらかしにしていたらnodebrewなるものが便利とのことなので、復習がてら環境を作りなおしてみる。

[[hokaccha / nodebrew]](https://github.com/hokaccha/nodebrew)

## homebrewでインストールしたnode.jsのアンインストール
先にnpmをアンインストール

```
$ cd /usr/local/lib
$ sudo npm uninstall npm
$ rm -rf /usr/local/bin/npm
```

node.jsをhomebrewからアンインストール

```
$ sudo brew uninstall node.js
```

## nodebrewをインストール
ワンライナー

```
$ curl https://raw.github.com/hokaccha/nodebrew/master/nodebrew | perl - setup
```

PATH通すために.zshrcに追記
v0.8系の最新が使いたいので。

```
if [[ -f ~/.nodebrew/nodebrew ]]; then
    export PATH=$HOME/.nodebrew/current/bin:$PATH
    nodebrew use v0.8
fi
```

## node.jsのインストール
ソースからインストール（時間かかる）

```
$ nodebrew install v0.8
```

バイナリからインストール（早い！！）

```
$ nodebrew install-binary v0.8
```

インストール確認とバージョン

```
$ nodebrew use v0.8
$ node -v
v0.8.22
```

## npmのインストール
```
$ npm -v
1.2.14
```

勝手に入ってた

## CoffeeScriptもインストール

```
$ npm install -g coffee-script
```

ほい

```
$ coffee -v
CoffeeScript version 1.6.2
```
RubyとPythonじゃデフォルト引数の値が評価されるタイミングが違うんだぜ

分かりにくいタイトルですみません。
言葉で説明するより、実際にコードを見た方がどういうことか分かりやすいと思います。
環境ですが、RubyはRuby 2.0、PythonはPython 3.2となっています。

##さて、書くか

試しにRubyでこんなコードを書いてみます。

```ruby
#スコープの関係でグローバル変数
$msg = "Hello, Before World!"

def say(str = $msg)
   puts str
end

say #=> Hello, Before World!

$msg = "Hello, After World!"
say #=> Hello, After World!
```

出力はコメントの通りのはずです。

Pythonで同じようなコードを書くとこうなります。

```python
msg = "Hello, Before World!"

def say(str = msg):
    print(str)

say() #=> Hello, Before World!

msg = "Hello, After World!"
say() #=> Hello, Before World!
```

同じようなコードですが、 `say` 関数の出力結果が変わっています。

これで、タイトルの意図は大体掴んで頂けたでしょうか？

##解説です

まず、RubyもPythonも任意の式をデフォルト引数の値に書くことが出来ます。で、RubyとPythonではこの値が評価されるタイミングが違います。

Rubyでは、 **関数が呼び出されたとき** に、
Pythonでは、 **関数が定義されたとき** にデフォルト引数の値が評価されます。
※Rubyはメソッドだろおい、とか細かいことは言わない。

```ruby
$msg = "Hello, Before World!"

def say(str = $msg)
   puts str
end

say() #=> Hello, Before World!

$msg = "Hello, After World!"
say() #=> このタイミングで $msg が評価される
    #=> よって Hello, After World!
```

```python
msg = "Hello, Before World!"

def say(str = msg): #この時点で msg が評価されて Hello, Before World! になっている
    print(str)

say() #=> Hello, Before World!

msg = "Hello, After World!"
say() #=> すでに str の値は決定しているから、 Hello, Before World!
```


なので、さっきみたいな結果になるわけですね。

##雑感…

個人的には、Rubyの方が色んなことが出来るので面白いなぁ、と思うんですが、どちらの挙動も *自然* なものなので悪くはないです。（PythonはVMの仕様的にあ­あせざるを得ないのかなぁ、とも）

ちなみに、Rubyではデフォルト引数以外の引数を参照することができるので、さらにデフォルト引数内で自身を呼び出して再帰させることで、

```ruby
#見ろよこいつ、デフォルト引数で再帰してやがる…
def fact(n,ret = n <= 1 ? 1 : fact(n-1) * n)
   ret
end

puts fact(10) #=> 3628800
```

みたいなことが出来たりします。
Rubyってやつは…（絶句）。

ついでに、Pythonではこの特性を利用して、ローカルスコープ代わりにしたりするみたいです（多分）。

```python
say_n = []

for i in range(0,10):
    #say_n.append(lambda: print(i))
    #だと i の値が更新されていってしまうためダメ
    say_n.append(lambda j = i: print(j))
    #のようにして、 i を束縛する必要がある

say_n[2]() #=> 2
say_n[4]() #=> 4
```

非常に雑多なTipsでしたが、こういう細かい言語ごとの仕様の違いにハマるとなかなか抜け出せなくなるので、知っていて損するものでもない気がします。覚えておいて、少しでも役立つことがあったら幸いです。

RubyもPythonも門外漢なので、少なからず何か間違っていることがあるかもしれません。それを見つけた際は、コメント欄かTwitter( [@alucky0707] )でそっと鳩尾にツッコミをかましていただけるとありがたいです。

##参考ページ

* [rubyのデフォルト引数を使った再帰処理] - Rubyのデフォルト引数で再帰できるってここで知った。
* Pythonのスコープ云々って話を聞いてこの記事を考えたんだけど、どこにあったか忘れた…。

[@alucky0707]:http://twitter.com/#...
[rubyのデフォルト引数を使った再帰処理]:http://purigen.seesaa.net/article/124056851.html
コマンドラインで json を csv に変換する方法

コマンドラインで json を csv に変換するツールを紹介します。

- https://github.com/zeMirco/json2csv

README.md にコマンドの利用例が示されています。
２つの例を引用します。

例１：

    $ json2csv -i in.json -f carModel,price,color
    carModel,price,color
    "Audi",10000,"blue"
    "BMW",15000,"red"
    "Mercedes",20000,"yellow"
    "Porsche",30000,"green"

例２：

    $ json2csv -i in.json -f carModel,price,color -p
    ┌────────────────┬──────────┬──────────┐
    │ carModel       │ price    │ color    │
    ├────────────────┼──────────┼──────────┤
    │ "Audi"         │ 10000    │ "blue"   │
    ├────────────────┼──────────┼──────────┤
    │ "BMW"          │ 15000    │ "red"    │
    ├────────────────┼──────────┼──────────┤
    │ "Mercedes"     │ 20000    │ "yellow" │
    ├────────────────┼──────────┼──────────┤
    │ "Porsche"      │ 30000    │ "green"  │
    └────────────────┴──────────┴──────────┘

内部的には cli-table ( https://github.com/LearnBoost/cli-table ) を使っているようです。

例３：

    $ cat sample-001.js
    var Table = require('cli-table');
    var table = new Table({ head: ["", "Top Header 1", "Top Header 2"] });    
    table.push(
        { 'Left Header 1': ['Value Row 1 Col 1', 'Value Row 1 Col 2'] }    
        , { 'Left Header 2': ['Value Row 2 Col 1', 'Value Row 2 Col 2'] }
    );
        
    console.log(table.toString());

実行結果：

    $ node sample-001.js
    ┌───────────────┬───────────────────┬───────────────────┐
    │               │ Top Header 1      │ Top Header 2      │
    ├───────────────┼───────────────────┼───────────────────┤
    │ Left Header 1 │ Value Row 1 Col 1 │ Value Row 1 Col 2 │
    ├───────────────┼───────────────────┼───────────────────┤
    │ Left Header 2 │ Value Row 2 Col 1 │ Value Row 2 Col 2 │
    └───────────────┴───────────────────┴───────────────────┘
ubuntu 12.04にgitlab 5.0を入れた後、redmineをいれたメモ

タイトルが昨今のラノベのようになっている気がしますが、的確なタイトルが思い浮かばなかったのでそのまま。

[gitlab 5.0をvmware上のubuntu 12.04にいれたときのメモ](http://qiita.com/items/6358d9533a20f4cb8b19)
の環境に続けてredmineを入れた時のメモになります。

[公式インストールガイド](http://redmine.jp/guide/RedmineInstall/)
を参考にいれました。

そのメモがこちらになります。
[自分の環境用インストールメモ](https://github.com/kyanro/gitlabknowledge/blob/5.x/redmine%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%A2.md)

いろいろ試行錯誤しながら入れてたので抜けてるコマンドとか間違ってる場所があるかもしれません
(´・ω・｀)

おかしいところがあったらぜひ教えて下さい。
FuelPHP【パッケージ】-- minifyもcompressも簡単にできるパケージ fuelphp-casset --


minify,compressやりたいならこのパッケージを導入すれば簡単にできます。

## 環境

* centos6.3
* fuelPHP1.5.3

## 事前準備に必要なもの
* php5.3以上
* git
* fuelPHPがインストール済みであること インストールをしていない場合は[FuelPHP【入門】-- CRUDを作った時のメモ(インストールからCRUD作成まで) --](http://qiita.com/items/ae107a96699745a02560)を参考にインストールしてください。

## 参考にしたサイト
* [日本語版ドキュメント(1.5ドキュメント)](http://fuelphp.jp/docs/1.5/)
* [canton7 / fuelphp-casset](https://github.com/canton7/fuelphp-casset)

## oilでpackageを導入する

コマンドで一発

```shell
php oil package install casset
```
fuel/packages/fuel-cassetというディレクトリができます。

## packageのロード

```php:fuel/app/config/config.php
	'always_load'  => array(
		'packages'  => array(
			'fuel-casset',
		),
```

※注意点：なぜか自分の環境(1.5.3)だとfuel/packages/fuel-cassetという名前だとクラスをうまく読み込んでくれませんでした。
その時はfuel/packages/cassetにリネームしてください。

## public/assetにcacheというディレクトリを作成する

```shell
mkdir public/assets/cache
chmod 777 public/assets/cache
```

## 使い方(js)

minify,compress対象の指定

```
Casset::js('jquery.js'); //jquery.jsをminify,compress対象にします。
Casset::js('bootstrap-transition.js'); //minify, compress対象にします
Casset::render_js(); //jquery.js bootstrap-transition.jsを一つにしてcompressします
//public/assets/cacheに２つをまとめたファイルが出来上がります
```

## 使い方(css)

minify,compress対象の指定

```
Casset::css('common.css'); //jquery.jsをminify,compress対象にします。
Casset::css('bootstrap.js'); //minify, compress対象にします
Casset::render_css(); //common.css bootstrap.cssを一つにしてcompressします
//public/assets/cacheに２つをまとめたファイルが出来上がります
```

そのほかにもグループ化とか細かい設定もできるみたいです。
詳しくは[github](https://github.com/canton7/fuelphp-casset)をさんこうにしてください。

超カンタンにできます。
png/jpgなどにplotする際に適切に日本語文字列を描画する

Mac + Rの環境でplotする時には.Rprofileでフォントの指定をするのが定番になっている(例: [Mac OSXのRで日本語をプロットしたい - 驚異のアニヲタ社会復帰への道](http://d.hatena.ne.jp/MikuHatsune/20120428/1335544822))．
しかし，これだけでは  

```r:
png("/tmp/test.png")
plot(iris, main = "アヤメのデータ")
dev.off()
```

とした場合にmain部分が文字化けする．
これを回避するには

```r:
png("/tmp/test.png")
par(family="HiraMaruProN-W4")
plot(iris, main = "アヤメのデータ")
dev.off()
```

とかやってフォントを指定すれば適切に描画される．
Rails抜きで script/delayed_job (w/ ActiveRecord) を使う

とりあえず起動するようになったのでやったことメモ。

Delayed::Worker 初期化時に何カ所か Rails モジュールを参照してるので、そこを上手いことだましてやる必要がある。ちょうど config/environment.rb をrequire しているので、そこに最低限のメソッドを定義したダミーを放り込んでやる。例えばこんなの。

```config/environment.rb
module Rails
    # backend が ActiveRecord の時のみ必要？ (mongoid の場合は未検証)
    def self.env
       ENV["RAILS_ENV"]
    end
    
    def self.root
       File.join(File.dirname(__FILE__), "..")
    end
end
```

さらに ActiveRecord の接続情報は ENV["DATABASE_URL"] に url で設定するか hash 形式なら ActiveRecord::Base.configurations に持たせておく必要がある模様。こうしないと daemonize後の再接続がうまくいかず、無言で死ぬ。

```config/environment.rb
require 'yaml'

config = YAML.load_file(File.join(Rails.root, "config", "database.yml"))
ActiveRecord::Base.configurations = config
```

あとはデフォルトのログの吐き場所 log/ と pid ファイル置き場 tmp/pids/ を掘るだけ。普通に ```script/delayed_job start``` すれば ワーカーが起動する。

ここまでやって飽きたのでちゃんと動いているかどうかの確認は棚上げ。
Androidをコマンドラインで開発したいとき

Androidをコマンドラインで開発したいときによく使うコマンドまとめ。
環境はMac OS Xです

Android SDKをダウンロードしておき、パスを通しておきます

``` sh:~/.bash_profile
# android-sdk-macosxのパスは、インストールしたディレクトリに置き換えてください
export PATH="$PATH:/Users/xxx/Development/android-sdk-macosx/platform-tools:/
Users/xxx/Development/android-sdk-macosx/tools"
```
 
プロジェクトを作成
targetは、$ android list targets で確認可能

```
android create project --target 1 --name HelloWorld --path `pwd` --activity HelloWorldActivity --package jp.temp.helloworld
```
 
Eclipseからプロジェクトを作成した場合などは、
build.xmlを作成します (antに必要)

```
#  プロジェクトのルート(`pwd`)
#  targetはandroid list targets
android update project --path `pwd` --target 1 --subprojects
```
 
ビルド

```
ant debug
```
 
Emulatorを作成
-t(--target)は、android list targets で確認

```
android create avd -n avd_1_2.3.3 -t 2
```
 
Emulator起動

```
emulator -avd avd_1_2.3.3
```
 
アプリを転送

```
adb install -r HelloWorld-debug.apk
```
LINUXにRuby 2.0を入れてみた。


ソース格納ディレクトリに移動（場所は任意）

```bash
cd /usr/local/src/
```
取得！！

```bash
curl -O  ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p0.tar.gz
```
展開！

```bash
tar zxvf ruby-2.0.0-p0.tar.gz
```
お決まりのmake install

```bash
cd ruby-2.0.0-p0
./configure
sudo make
sudo make install
```
2.0.0であることを確認。これであなたもruby2.0の仲間入り

```bash
$ ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]
```
gem本体がsudoでは実行出来なかったので

```bash
$ sudo ln -s /usr/local/bin/gem /usr/bin/gem
```
シンボリックリンク作成完了

```bash
$ sudo which gem
/usr/bin/gem
```
Sublime Text便利機能とvintageモードの共存

Sublime Textをvintageモードを使うと、
デフォルトでvimっぽい動きになり、プログラミングで重宝します。

ですが、Sublime Textでの便利機能である複数選択（Ctrl+D）と
vimのスクロールのショートカットが衝突してしまいます。
また、Sublime Textでの前に選択していた位置にカーソルを戻す（Ctrl+U)も
vimのショートカットが衝突してしまいます。

そこでvimっぽい動きのまま、便利機能を使えるように
する方法を調べました。

`Preferences → Key Bindings - User`

を選択するとショートカットの一覧が表示されます。
そこに下記をコピペします。

`{ "keys": ["ctrl+m"], "command": "find_under_expand" },
{ "keys": ["ctrl+b"], "command": "soft_undo" },`

※jsonファイルですので、ペーストする場所により、適宜、カンマ(,)を入れてください。

上記設定にて、複数選択はCtrl+M、カーソル戻しはCtrl+Bでできるようになります。
vimのページスクロールはデフォルトのままで使えるため、
vimっぽい動きのまま、Sublime Textの便利機能が活用できるようになります。

keysの値を適当な値にすると、そのショートカットが適用されるので、
他のショートカットと衝突しないように覚えやすいショートカットを設定してみてください。
BIND9 で Dynamic DNS のゾーン情報を確認

BIND9 で Dynamic DNS をやると動的に更新されたレコードはジャーナル (*.jnl) に記録されるので、ゾーンファイルを見ても現在のゾーン情報が判りません。

## A. ゾーン情報をダンプして確認

    rndc dumpdb -zones
    cat /var/named/data/cache_dump.db | grep ddns.example.com.

 - DNSサーバ上で実行しなければならない
 - ダンプファイルが読めなければならない（bind の実行ユーザとか）
 - 別ゾーンのレコードがファイルに含まれてしまう


## B. DDNS をフリーズしてゾーンファイルを見る

    rndc freeze ddns.example.com
    cat /var/named/zone/ddns.example.com.zone
    rndc thaw ddns.example.com

 - DNSサーバ上で実行しなければならない
 - ゾーンファイルが読めなければならない（bind の実行ユーザとか）
 - `rndc thaw` を忘れるとレコードの更新が出来なくなる

## C. dig でゾーン転送する

    dig @127.0.0.1 ddns.example.com. axfr

 - dig を実行するホストへのゾーン転送が可能でなければならない
ScriptDbでの anyOf() の最高数は500

 [ScriptDb](https://developers.google.com/apps-script/scriptdb)
2013年4月4日に確認

google apps scriptで利用できるデータベースのScriptDbでエラーが起きた。
anyOf() は以下のようにして使う、mysqlとかの in と同じ役割のメソッド。

```javascript
var result = db.query({
    address: {
        state: db.anyOf(["NY", "MS"])
    }
});
```

anyOf()の引数に要素数が500以上の配列を入れたらエラーが起きた。
500だったらエラーが起きなかったので、500以下にする必要が有るようだ。
iPhoneアドレス帳の検索対策のバッドノウハウ

iPhoneのアドレス帳検索が糞なので文句を書きなぐって発散するエントリー。

まず、人名なんかは姓と名を普通に分けて振り仮名書いとけば十分、あとは渾名とかあればニックネームに入れとけば大抵十分。更に渾名が複数あったりする場合やそいつを思い出すためのキーワードがあるなら検索用に、追加フィールドで「メモ」とかに列挙しちゃってる。

## 企業名とかお店の名前とか
問題になるのは大抵これ。この場合、姓か名に1行で書いちゃうことが多いと思う。でもその時に例えば`柏レーザー脱毛クリニック`の振り仮名を`かしわれーざーだつもうくりにっく`とかにしちゃうと後で後悔するよ。
何故かというと検索で`だつもう`とか`くりにっく`で検索しても出てこないから…。そもそも病院の名前とか覚えてないから脱毛とか適当なキーワードでまず探すじゃん？そのときに出ないのよ。そんなときは`かしわ れーざー だつもう くりにっく`とかにしとけば大体は検索できるようになる。
だから単語が連なるような名前のふりがなは基本 **分かち書き** しておこう！

## あいおい損保とか最悪
その中でも「何でだよ！」って思ったのがこれよ。

`あいおい損保`の、振り仮名を分かち書きしないと`そんぽ`で出ないとかはもう基本だわ。`あ`では出るのに`あい`や`あいお`で見つからない、…のもまだ許そう。でも…

> **`あいおい`で見つからないとかどういうことだよ！？**

ふりがなを`あいおい そんぽ`って風に分かち書きしてすら駄目だよ！
仕方がないからこいつに関してははもうこんな風にしちゃったよ。これでやっと`あいおい`で検索できた…。

```
  姓 あいおい損保
せい あいおい そんぽ
  名 (空)
めい あいおい
```

## 根本解決してほしい
てかAppleさんよー、アドレス帳なんて大したサイズじゃないんだからもう **N=2のNグラム** でインデックス作っちゃってよ、お願いだから！
暗黙の型変換を抑制

参照
[Enforcing toString()](Enforcing toString())

型変換されて加算されてしまう。

```javascript
var obj = {}
"test" + obj //-> "test[object Object]"
var fnc = function(){}
"test" + fnc //-> "testfunction (){}"
```

暗黙の型変換を抑制

```javascript
Object.prototype.valueOf = function () {
	throw new Error('型が違ってるよ！');
};

"test" + obj //-> Uncaught Error: 型が違ってるよ！ 
"test" + fnc //-> Uncaught Error: 型が違ってるよ！ 
```
開発環境と本番環境で favicon を変える


開発環境と本番環境をブラウザ上で間違って操作してしまった経験はありませんか？僕はあります。

そんなとき favicon や title タグを変えると役に立ちます。自分が関わるプロジェクトでは

- 本番は通常の favicon
- 開発環境はモノクロの favicon

を作って切り分けています。他にも環境がある場合、色調補正したり、90度回転させてみたり、ぱっと見すぐ解るようにしています。

小さな変更ですが、かなり便利です。

例: 社内ツール
<img src="http://gyazo.com/27734655b39617adfa1a1cf71a466007.png">
Twitter, Facebook, はてなブックマークのカスタムシェアボタンを表示するjQueryプラグインを公開しました。

## jQuery POP'n SocialButton

![サンプル画像](https://github.com/ktty1220/jquery.popn-socialbutton/raw/master/example.png)

こんな感じのちょっと変わったシェアボタンを表示できます。

それぞれのボタンにマウスカーソルを合わせると、ボタンがピョコっと浮き上がります。

今のところの対応サービスは、日本でシェアボタンの主流になっている3サービス(Twitter, Facebook, はてなブックマーク)のみです(というか他のサービスのシェア数の取得方法が分からないだけだったりする)。

こんな感じで使用します。

```javascript:簡単なサンプル
    $('#social-button').popnSocialButton([
      'twitter', 'facebook', 'hatebu'
    ]);
```

最新版のダウンロードはこちらからどうぞ。

<https://github.com/ktty1220/jquery.popn-socialbutton/archive/master.zip>

詳しい使用方法はgithubのリポジトリやアーカイブに同梱のREADME.mdやexample.htmlをご覧ください。

<https://github.com/ktty1220/jquery.popn-socialbutton>

## 追記1(2013-04-04): いきなりのバージョンアップそして仕様変更ｗ

コメントで頂いた要望を反映して、シェア数の部分をクリックすると各サービスのコメント一覧ページを開くようにしました。

ただし、Facebookはコメント一覧を見る方法がない(と思う)のでシェア数をクリックしてもシェア登録ページを開きます。

あと、まだ誰も使っていないだろうから大丈夫だと思いますが、一部オプションの設定名と構造を少し変更しました。

## 追記2(2013-04-05)

Facebookのいいねボタンの挙動に合わせて、Facebookのシェア数にはリンクを貼らないようにしました。
メソッド内で継承関係のないクラスを class::method で呼ぶ

Strict エラーになりますが・・・継承関係がないのに A のメソッドで `$this` が B のインスタンスになっている（PHP 5.2～5.5で確認）。

```php
<?php
error_reporting(E_ALL & ~E_STRICT);

class A
{
    public function func()
    {
        var_dump(__METHOD__);
        $this->xxxx();
    }
}

class B
{
    public function func()
    {
        var_dump(__METHOD__);
        A::func();
    }

    public function xxxx()
    {
        var_dump(__METHOD__);
    }
}

$o = new B();
$o->func();
```

```
string(7) "B::func"
string(7) "A::func"
string(7) "B::xxxx"
```

`call_user_func('A::func')` だと `Fatal error: Using $this when not in object context` で死ぬ。
リンク切れのシンボリックリンクを探す方法

## 結論
を先に書くと

> **リンク切れのシンボリックリンクは `find -xtype l` で探せる**

よ！

## manによると

>-xtype c
>  ファイルがシンボリックリンク以外の場合は -type と同じ。シンボリックリンクに対しては以下のように判断される。この判別式の前に -follow が指定されていなかった場合は、リンク先のファイルのタイプが c ならば真。 -follow が指定されていた場合は c が ‘l’ ならば真。つまりシンボリックリンクに対して、 -xtype は -type がチェックしない側をチェックする。

となっており、うーん分かりにくい…。

## -typeと-xtypeの違いを確認
まず試験用のファイルを作って…

```
$ touch file
$ ln -s file link-file
$ ln -s link-file link-link-file
$ ln -sf null link-null
$ mkdir dir
$ find -ls
113575 4 drwxr-xr-x 2 root root 4096  4月  4 13:19 .
113698 4 drwxr-xr-x 1 root root 4096  4月  4 13:19 ./dir
113638 0 -rw-r--r-- 1 root root    0  4月  4 13:17 ./file
113984 0 lrwxrwxrwx 1 root root    4  4月  4 13:17 ./link-file -> file
113985 0 lrwxrwxrwx 1 root root    9  4月  4 13:18 ./link-link-file -> link-file
113593 0 lrwxrwxrwx 1 root root    4  4月  4 13:19 ./link-null -> null
```

で、`-type`と`-xtype`、それから`-follow`をつけると動作が変わるらしいのでそれらを比較。

```
$ find -type f
./file

$ find -type l
./link-file
./link-link-file
./link-null

$ find -xtype f
./file
./link-file
./link-link-file

$ find -xtype l
./link-null

$ find -follow -xtype f
./file

$ find -follow -xtype l
./link-file
./link-link-file
./link-null

$ find -empty
./dir
./file
```

なるほど。ついでに`-empty`の動作も再確認してみたがこれは`-type`が`f`か`d`のときしか反応しない、と。

### 比較しやすいようテーブルにしてみる

|                | dir | file | link-file | link-link-file | link-null |
|---------------:|:---:|:----:|:---------:|:--------------:|:---------:|
|-type f         |     | ○   |           |                |           |
|-type l         |     |      | ○        | ○             | ○        |
|-xtype f        |     | ○   | ○        | ○             |           |
|**-xtype l**    |     |      |           |                | ○        |
|-follow -xtype f|     | ○   |           |                |           |
|-follow -xtype l|     |      | ○        | ○             | ○        |
|-empty          | ○  | ○   |           |                |           |

`-follow`が付いてると`-xtype`は`-type`と同じ動作になるっぽい、まぁ意味的に当然そうなるわな。`-follow`自体は`-xtype`だけで使うオプションではないのでその事自体は別によい。


### 注意な

わざわざ`-follow`について言及するのは、大事なのは、

> **-followが付いてる時、-xtypeはあなたが期待するのと違う動作になってる可能性が高いから注意しろよ**

ってことだと思う。
IRanges::union IRanges::intersectで領域の「和」と「積」をとる

IRangesパッケージはGenomicRangesパッケージのベースになっているパッケージです。このパッケージでは```union()```と```intersect()```という関数で領域の和と積を取ることができます。


```r
x <- IRanges(c(1, 19, 34, 40), width=c(8,  6, 2, 7))
y <- IRanges(c(7, 15,42), width=c(6,15, 3))
```

```r
> x
IRanges of length 4
    start end width
[1]     1   8     8
[2]    19  24     6
[3]    34  35     2
[4]    40  46     7
> y
IRanges of length 3
    start end width
[1]     7  12     6
[2]    15  29    15
[3]    42  44     3
```

![IRanges-1](https://dl.dropbox.com/u/80771782/Qiita/qiita-20130404-IRanges-1.png)
これらの和と積は以下のようになります。
![IRanges-2](https://dl.dropbox.com/u/80771782/Qiita/qiita-20130404-IRanges-2.png)


上の図は以下のコードで描画しました。

```R
plotRanges <- function(x, xlim = x, main = deparse(substitute(x)),
                       col = "black", sep = 0.5, ...) 
{
  height <- 1
  if (is(xlim, "Ranges"))
    xlim <- c(min(start(xlim)), max(end(xlim)))
  bins <- disjointBins(IRanges(start(x), end(x) + 1)) # max(coverage(grngs))
  plot.new()
  plot.window(xlim, c(0, max(bins)*(height + sep)))
  ybottom <- bins * (sep + height) - height
  rect(start(x)-0.5, ybottom, end(x)+0.5, ybottom + height, col=col, ...)
  title(main)
  axis(1)
}
png("qiita-20130404-IRanges-1.png",width=640,height=320)
par(mfrow=c(2,1))
plotRanges(x,xlim=c(1,50), main="x", col="black")
plotRanges(y,xlim=c(1,50), main="y", col="black")
dev.off()

png("qiita-20130404-IRanges-2.png",width=640,height=320)
par(mfrow=c(2,1))
plotRanges(union(x,y),xlim=c(1,50), main="union")
plotRanges(intersect(x,y),xlim=c(1,50), main="intersect")
dev.off()
```
pdsh Tips

複数台サーバのコマンド同時実行

## コマンドの実行

``` 実行
$ /usr/bin/pdsh -w xxx.xxx.xxx.xxx コマンド
$ /usr/bin/pdsh -g aplfp コマンド
-w:ホスト名,IPアドレス
-g:グループ
```

###  グループの参照

``` グループ
$ ls /etc/dsh/group/
all  apl  aplfp  aplsp	db  web

$ cat /etc/dsh/group/aplfp
apl1
apl2
apl3
```

### 出力の整形
パイプで、dshbak -c をつける。

``` 整形
pdsh -g apl 'cat /etc/redhat-release' | dshbak -c
```
GenomicRangesパッケージにおけるreduceとdisjoinの扱い

```r:データセットの準備
library(GenomicRanges)
ir <- IRanges(c(1, 8, 14, 15, 19, 34, 40), width=c(12, 6, 6, 15, 6, 2, 7))
strand <- rep(c("+", "-"), c(4,3))
grngs <- GRanges(seqnames = "chr1", ranges = ir, strand = strand, seqlengths = c("chr1" = 50))
```

```r
> grngs
GRanges with 7 ranges and 0 metadata columns:
      seqnames    ranges strand
         <Rle> <IRanges>  <Rle>
  [1]     chr1  [ 1, 12]      +
  [2]     chr1  [ 8, 13]      +
  [3]     chr1  [14, 19]      +
  [4]     chr1  [15, 29]      +
  [5]     chr1  [19, 24]      -
  [6]     chr1  [34, 35]      -
  [7]     chr1  [40, 46]      -
  ---
  seqlengths:
   chr1
     50
```
青、赤の色分けはそれぞれゲノム上の+鎖、－鎖に対応させている。


![default](https://dl.dropbox.com/u/80771782/Qiita/qiita-20130404-default.png)

##reduce
＋鎖、－鎖に存在するGRangeオブジェクトを個別にそれぞれつなげてくれる。
![reduce](https://dl.dropbox.com/u/80771782/Qiita/qiita-20130404-reduce.png)

##disjoin
各GRangeオブジェクトについて、他のGRangeオブジェクトと重ならない部分を抽出する。
![disjoin](https://dl.dropbox.com/u/80771782/Qiita/qiita-20130404-disjoin.png)

- - -

なお、上の図は http://www.bioconductor.org/help/course-materials/2009/GenentechNov2009/Module7/IRanges.R を参考に、以下のコードで描画しました。
条件分岐による色分けをするには、col= 引数にifelse()を与えてあげると便利です。

```r
plotRanges <- function(x, xlim = x, main = deparse(substitute(x)), sep = 0.5, ...) 
{
  height <- 1
  if (is(xlim, "Ranges"))
    xlim <- c(min(start(xlim)), max(end(xlim)))
  bins <- disjointBins(IRanges(start(x), end(x) + 1))
  plot.new()
  plot.window(xlim, c(0, max(bins)*(height + sep)))
  ybottom <- bins * (sep + height) - height
  rect(start(x)-0.5, ybottom, end(x)+0.5, ybottom + height,
       col = ifelse(as.data.frame(x)$strand=="+", "blue", "red"), ...)
  title(main)
  axis(1)
}
png("qiita-20130404-default.png",width=640,height=320)
plotRanges(grngs,xlim=c(1,50))
dev.off()

png("qiita-20130404-reduce.png",width=640,height=320)
plotRanges(reduce(grngs),xlim=c(1,50), main="reduce")
dev.off()

png("qiita-20130404-disjoin.png",width=640,height=320)
plotRanges(disjoin(grngs),xlim=c(1,50), main="disjoin")
dev.off()
```
現在の URL

現在リクエストされている URL は play.mvc.Http.Request#url で取得することができます。
当然、url フィールドは static ではないので、スレッドに紐付くインスタンスを取得してから参照します。

```java
String url = play.mvc.Http.Request.current().url;
```

### 参考

- [Http.Request (Play! API) ](http://www.playframework.com/documentation/api/1.2.5/play/mvc/Http.Request.html#url)
インターセプターの優先順位

play1 には下記四種類のインターセプターが用意されています。

- `@Before`
- `@After`
- `@Check`
- `@Finally`

同じインターセプターを複数個設定した場合の実行順序について、ドキュメントには `@Check` のみ記載がありますが、これら全てのインターセプターで `priority` 属性が指定できます。

```java
public class SomeController extends Controller {

    @Before(priority = 0)
    public static void highPriorityMethod() {
        Logger.debug("this method should be called first.");
    }

    @Before(priority = 1)
    public static void lowPriorityMethod() {
        Logger.debug("and then, this method will be called.");
    }
}
```

### 参考

- [Documentation: controllers — Playframework](http://www.playframework-ja.org/documentation/1.2.5/controllers#interceptions)
JavaScriptでURLのパラメータを取得する

今見ているページのURLのパラメータを取得することはよくやるけど、みんなどうやってるのか気になったから調べてみた。

http://ameblo.jp/linking/entry-10353146034.html
http://rem.bake-neko.net/prg/javascript3.html
window.locationで力づくでやるのがスタンダードっぽい。
(自分もそうやってる)

http://d.hatena.ne.jp/natu_n/20081220/1229756677
prototype.jsやjQueryのプラグインもあったけど、古いし、これのためだけに入れるのもなぁ。

とりあえず現状の解決策だけでも以下に載せておく。
なんか良いやり方があったら教えてほしい。

```javascript:get_url_vars()->
function get_url_vars()
{
  var vars = new Object, params;
  var temp_params = window.location.search.substring(1).split('&');
  for(var i = 0; i <temp_params.length; i++) {
    params = temp_params[i].split('=');
    vars[params[0]] = params[1];
  }
  return vars;
}

```
bashでdiffとる時の小技

```
$ diff abc_new.txt abc_old.txt > diff_result.txt &
```
上記よりも下記のがスマート
ただし、他に該当するファイルがない事！

```
$ diff abc_* > diff_result.txt &
```

極端な話、同ディレクトリ内にファイルが2つしかなければ、

```
$ diff * > diff_result.txt &
```

で、おｋ

（&はバックグラウンド処理を指定してる）
Unite.vimで現在のVimFilerバッファのディレクトリを移動する。


VimFilerでディレクトリを移動する際に`<Plug>(vimfiler_cd_input_directory)`でディレクトリのパスを入力して移動できるのは知っていたのですが、Unite.vimでディレクトリを選択できないのかな？と思い、とりあえずUniteのアクションを書いてみました。

```:vim
let s:vimfiler_cd = { 'is_selectable' : 1, }
function! s:vimfiler_cd.func(candidates)
  for l:candidate in a:candidates
    call vimfiler#mappings#cd(l:candidate.action__path)
  endfor
endfunction
call unite#custom_action('directory', 'vimfiler_cd', s:vimfiler_cd)
unlet s:vimfiler_cd
```

上記を.vimrcなどに記述すると、Uniteのアクションに`vimfiler_cd`が追加されます。
で、このアクションを実行すると現在のVimFilerバッファのディレクトリを選択されたディレクトリに移動することができます。


私はとりあえず以下のような感じに割り当ててみました。

> autocmd FileType vimfiler nnoremap <buffer>  I  :Unite -default-action=vimfiler_cd  directory_mru<cr>

追記:

既に、同じ動作を行う`lcd`というデフォルトアクションがありました。

> :Unite -default-action=lcd  directory_mru
WordPressの承認待ちコメントを一括でSPAMとしてマークする

承認待ちのSPAMが多すぎるので、カッとなってやった。Akismetにはがんばってほしい。

mysqlクライアントからSQLを叩く。

```sql
UPDATE `wp_comment`
  SET `comment_approved` = 'spam'
  WHERE `comment_approved` = '0';
```

* 参考 : [データベース構造 - WordPress Codex 日本語版](http://wpdocs.sourceforge.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0#.E3.83.86.E3.83.BC.E3.83.96.E3.83.AB.EF.BC.9A_wp_comments)
トラックパッドでiOSシミュレータの操作

######システム環境設定→トラックパッド→3本指のドラッグ→オン

###この設定にしておけば、3本指でシミュレータを操作できるのですね。

知りませんでした。

今までダブルタップとクリックだけでがんばってたのに...。

もしかしたら、僕みたいな人がいるかもしれないので一応投稿しておきます。
2つ目の github アカウント用に ssh を設定する


自宅のマシンに既に個人として使用するgithubアカウント用のsshキーが設定されてるんだけど、そのマシンに会社で使用しているgithubアカウントを追加するというケース。

個人用、会社用それぞれの ssh キーは既に github に登録済みとする。


## 会社用のプライベートキーを自宅マシンにコピー

会社マシンの .ssh/xxx_rsa を自宅マシンに .ssh/office_rsa などの名前でコピー。

パーミッションは他ユーザから参照できないように、600 などにしておくこと。


## .ssh/config を記述

.ssh/config がなければ作る。
以下のような感じ

```ssh:.ssh/config
Host office.github.com
  HostName github.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/office_rsa
```

Host は自分が分かりやすければなんでも良い。
IdentityFile は先にコピーした階や用のプライベートキーのファイル名に合わせる。

## 会社用アカウントを使って ssh 経由で git clone する

普段との違いは git clone 時のホスト名を .ssh/config で設定した Host 名を使うところ。
たとえば以下のように、 git@github.com/xxx となるところを、 git@office.github.com/xxx と変えてあげるだけで良い。

```:git&nbsp;clone&nbsp;の例
$ git clone git@office.github.com:my-office/repository.git
```


## 参考

- [Multiple GitHub Accounts & SSH Config - Stack Overflow](http://stackoverflow.com/questions/3225862/multiple-github-accounts-ssh-config)
munin install in Raspberry Pi 


## Install

    $ sudo apt-get -y install apache2 munin munin-node
    $ sudo ln -s /etc/munin/apache.conf /etc/apache2/sites-enabled/munin

    $ sudo mkdir -p /var/munin

    $ cd /etc/munin
    $ sudo cp munin.conf munin.conf.def
    $ sudo cp apache.conf apache.conf.def

    $ sudo vi munin.conf
    $ diff munin.conf.def munin.conf
    9c9
    < #htmldir /var/cache/munin/www
    ---
    > htmldir /var/munin
    98c98
    < [localhost.localdomain]
    ---
    > [localhost.raspberrypi]

    $ sudo vi apache.conf
    $ diff apache.conf.def apache.conf
    2c2
    < Alias /munin /var/cache/munin/www
    ---
    > Alias /munin /var/munin/
    16c16
    < <Directory /var/cache/munin/www>
    ---
    > <Directory /var/munin/>
    18c18
    <         Allow from localhost 127.0.0.0/8 ::1
    ---
    >         Allow from all
    64c64
    < 	Allow from localhost 127.0.0.0/8 ::1
    ---
    > 	Allow from all
    77c77
    < 	Allow from localhost 127.0.0.0/8 ::1
    ---
    > 	Allow from all


    $ sudo sh -c 'echo "ServerName raspberrypi" >> /etc/apache2/conf.d/servername.conf'
    $ sudo service apache2 restart

    $ sudo chown -R munin. /etc/munin
    $ sudo chown -R munin. /var/lib/munin
    $ sudo chown -R munin. /var/munin

    $ sudo -u munin /usr/bin/munin-cron

access: http://{raspberrypi-ip}/munin/

## Add Plugin

    $ cd /etc/munin/plugins
    $ sudo ln -s /usr/share/munin/plugins/apache_accesses .
    $ sudo -u munin /usr/bin/munin-cron

## syslog ignore cron Log

    $ sudo cp rsyslog.conf rsyslog.conf.def
    $ sudo vi rsyslog.conf
    $ diff rsyslog.conf rsyslog.conf.def 
    62,63c62,63
    < *.*;auth,authpriv.none,cron.none		-/var/log/syslog
    < cron.*				/var/log/cron.log
    ---
    > *.*;auth,authpriv.none		-/var/log/syslog
    > #cron.*				/var/log/cron.log

    $ sudo service rsyslog restart
Project Euler #108 Diophantine reciprocals I

[Diophantine reciprocals I](http://projecteuler.net/problem=108)

回答者 6053人。

満たすべき条件をできるだけ単純に変形すればごり押しで解けるが、
入力200くらいから計算時間が急速に延びて標準の1分では終わらなかった。計算コストを短縮できるとしたらmod?
40 C 20 を解く

プロジェクトオイラー１５らしいです。
階乗すぐオーバーフローしてしまうので、
先に約分をするというのがミソです。
アルゴリズム力をちょっとづつのばしていきたいところです。
命名とかやっつけです

```
#include <iostream>
#include <vector>

//a >= b
long long int gcd(long long int a, long long int b)
{
    long long int mod = a % b;
    if(mod == 0)
        return b;
    return gcd(b, mod);
}

void fact(std::vector<long long int> &array)
{
    for(long long int i = 0 ; i < array.size() ; ++i)
    {
        array[i] = (long long int)array.size() - i;
    }
}

void reduce(std::vector<long long int> &child, std::vector<long long int> &mother)
{
    for(long long int &c : child)
    {
        for(long long int &m : mother)
        {
            long long int n = (c > m)? gcd(c, m) : gcd(m, c);
            c /= n;
            m /= n;
        }
    }
}

long long int comb(long long int a, long long int b)
{
    std::vector<long long int> child(a);
    std::vector<long long int> mother1(b);
    std::vector<long long int> mother2(a - b);
    
    fact(child);
    fact(mother1);
    fact(mother2);
    
    std::vector<long long int> mother;
    mother.insert(mother.end(), mother1.begin(), mother1.end());
    mother.insert(mother.end(), mother2.begin(), mother2.end());
    
    reduce(child, mother);
    
    long long int c = 1;
    long long int m = 1;
    std::for_each(child.begin(), child.end(), [&c](long long int n){ c *= n; });
    std::for_each(mother.begin(), mother.end(), [&m](long long int n){ m *= n; });
    
    return c / m;
}
int main(int argc, const char * argv[])
{
    std::cout << comb(40, 20);
    return 0;
}
```
アプリログからデータを抜き出して補填SQLを発行するシェル

```text:sample.log
  1 127.0.0.1 - - [21/Feb/2013:00:06:20 +0900] "GET /index/ HTTP/1.0" 200 [ user_id:100 ] [ item_id:100_201 ] [ cost:500 ]"
  2 127.0.0.1 - - [21/Feb/2013:00:06:20 +0900] "GET /index/ HTTP/1.0" 200 [ user_id:100 ] [ item_id:300_501 ] [ cost:1500 ]"
  3 127.0.0.1 - - [21/Feb/2013:00:06:20 +0900] "GET /index/ HTTP/1.0" 200 [ user_id:100 ] [ item_id:400 ] [ cost:1000 ]"
```

↑適当にこんなログがあったとします。
user_idとitem_idを割り出して、なんかのテーブルに補填するシェルスクリプトを書いてみました。
※区切り文字から抜き出すときにもっといい感じにできそうなんですが、僕にはこれが限界…

```shellscript:hoten.sh
#!/bin/sh

tmp='tmp.list'
hotensql='hoten.sql'
# ファイルの存在チェック
if [ ! -e $1 ]
then
	echo "file not found";
	exit;
fi

user_id=`cat $1 | grep -o user_id:[0-9]* | awk -F ':' '{print $2}' | uniq`

`cat $1 | grep -o item_id:[0-9].* | awk '{print $1}' | awk -F ':' '{print $2}' | gsed -e 's/_/\n/g' > ${tmp}`

# コスト計算
cost=`cat $1 | grep -o cost:[0-9]* | awk  -F ':' '{print sum+=$2}' | tail -1`

# アイテムの数だけループ
while read line
do
	echo "INSERT INTO hoten (user_id, item_id,created_at) VALUES (${user_id} , ${line}, now());\n" >> ${user_id}_${hotensql}
done < ${tmp}

# コストの合計
echo "INSERT INTO hoten (user_id, point, created_at) VALUES (${user_id} , ${cost}, now());\n" >> ${user_id}_${hotensql}

rm ${tmp}
```

これを以下のような形で実行します。

```
$ sh hoten.sh sample.log
$ cat 100_hoten.sql
INSERT INTO hoten (user_id, item_id,created_at) VALUES (100 , 100, now());
INSERT INTO hoten (user_id, item_id,created_at) VALUES (100 , 201, now());
INSERT INTO hoten (user_id, item_id,created_at) VALUES (100 , 300, now());
INSERT INTO hoten (user_id, item_id,created_at) VALUES (100 , 501, now());
INSERT INTO hoten (user_id, item_id,created_at) VALUES (100 , 400, now());
INSERT INTO hoten (user_id, point, created_at) VALUES (100 , 3000, now());
```
How to play movies on UIView?


MOVなどの動画ファイルをiPhone上で再生させたいと思うときに、MPMoviePlayerControllerなどを使わずに自分で好きなように再生させたい時がある。
そういった時にAVFoundationのAVPlayerが役にたつ。このライブラリは動画の再生などを肩代わりしてくれるが、UI周りのすべてを自分で作る必要がある。画面とかに埋め込み動画みたいなものを作りたい人にはおすすめ。

## 必要なFramework
* AVFoundation.framework
* CoreMedia.framework

## PlayerView

UIViewに少し付け加えないと動かないので、そのWrapperを作る。

```AVPlayerView.h
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface AVPlayerView : UIView

@end
```

```AVPlayerView.m
#import "AVPlayerView.h"

@implementation AVPlayerView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

// AVPlayerLayerが使えますよと教えてあげる
// これなしで、普通のUIViewにくっつけても動かないので大事
+ (Class)layerClass
{
    return [AVPlayerLayer class];
}

@end
```

## ViewController

ViewControllerに必要な処理。

```ViewController.h
#import <UIKit/UIKit.h>

#import <Foundation/Foundation.h>
#import <CoreMedia/CoreMedia.h>
#import <AVFoundation/AVFoundation.h>

#import "AVPlayerView.h"

@interface MoviesViewController : UIViewController{
  	// あとでくっつける先となるUIViewの継承クラス
 	// 上で作ったやつ
    IBOutlet AVPlayerView *playerView;
}

@end
```


```ViewController.m
#import "MoviesViewController.h"

@interface MoviesViewController () {
    AVPlayer     *videoPlayer;
    NSString *moviePath;
}

@end

@implementation MoviesViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
	// 今回はすでにDocuments以下に置いてある動画を再生する
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *directory = [paths objectAtIndex:0];
    moviePath = [directory stringByAppendingPathComponent:@"/movie.mov"];

    
    NSURL *movieURL = [NSURL fileURLWithPath:moviePath];

    videoPlayer = [[AVPlayer alloc] initWithURL:movieURL];

    AVPlayerLayer* layer = ( AVPlayerLayer* )playerView.layer;
    layer.videoGravity = AVLayerVideoGravityResizeAspect;
    layer.player       = videoPlayer;
    [videoPlayer1 play];
}


@end

```


ここまででコード部分は完了。あとはStoryboardを使ってAVPlayerViewをattacheしていく。

![screen_shot](http://lewuathe.com/images/story_board.png "story_board")

自分で適当にはっつけたUIViewにさっきのAVPlayerViewをattacheすればいい。ただしこの時気をつけることは、このViewはUIViewのままになっているので以下のように、AVPlayerViewのインスタンスにしてあげないと、attacheの候補に現れてくれないので注意。

![screen_shot](http://lewuathe.com/images/AVPlayerView.png "AVPlayerView")
[PhoneGap]GalaxySで画像ファイル選択に失敗する

環境：GalaxyS、PhoneGap2.4.0

現象：
PhoneGapアプリ内のJavaScriptで、navigator.camera.getPicture() （オプショ
ン：Camera.PictureSourceType.PHOTOLIBRARY）として、ギャラリーからファイル選択すると、選択後にファイルパスが取得できずエラーになる。（選択失敗扱いになる）

原因：
PhoneGapのバグ（仕様？）で、Android側のファイル名に空白が入っていると、ファイル選択後、ファイルパスが取得できずエラーになるようだ。
GalaxySのカメラで撮影して保存した場合のデフォルトファイル名の形式は、
「YYYY-MM-DD HH24.MI.SS.jpg」でスペースが入っているため、そのままのファイル名だと必ずエラーになる。
ファイル名を端末内で事前に変更しておくと、無事選択できた。

navigator.camera.getPicture() （オプション：Camera.PictureSourceType.CAMERA）として、アプリ内のカメラで撮影後、そのままそのファイルを使う場合はエラーにならない。これはアプリ内のカメラで撮影する場合の一時ファイル名が、通常とは違う形式だからだと推測される。

別の機種ではファイル名の形式が違うせいか発生しなかった。
　例．GalaxyS3のファイル名の形式は「YYYYMMDD_HH24MISS.jpg」（アンダーバーになっている）ので問題なく動作した。

回避策：
PhoneGapの問題のため回避不可能と思われる・・・。
アプリの作りで回避するしかなさそう。

補足：
同じところでハマってそうな人がちらほら
http://osdir.com/ml/phonegap/2013-01/msg01141.html
https://groups.google.com/forum/#!topic/phonegap/-8YIQndur94
Xcode 4.5 でビルド → iOS 6 で動かす → UITextField に何も入力できない

ということがありました。

```
[self.window makeKeyAndVisible];
```

これが抜けていたせいでした。


テンプレから作ると、
AppDelegate.mのapplication:didFinishLaunchingWithOptions:に
デフォルトで書かれているのですが
何かの拍子に消してしまっていたみたいです。

```objc:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible]; // ←コレ
    return YES;
}
```

なお、Xcode 4.3でビルドしたときはなぜか上手くいきます。
Homebrewが壊れたときの対応

電車の中で`brew update`をかけたところ、通信品質が悪かったせいか`brew`の実行に必要なRubyのライブラリファイルが消えてしまったようで、`brew`が実行できなくなってしまいました。

そのようなときは、以下で復旧します。

    cd /usr/local && git checkout .
    brew doctor

Homebrewのツリーは単なるGitレポジトリですので、/usr/local上で`git checkout .`すれば基本的には復旧します（`brew doctor`は念のために実施している、程度の意味）。

私が試した限りでは、この対応で既存のCellerが壊れることはありませんでした。

----

なお…「通信状況の悪いところでは`brew update`しない」ことも心がけた方がよいでしょう。
既存のscopeからor条件のSQLを組み立てる

こんなモデルがあるとして

```ruby:user.rb
class User < ActiveRecord::Base
  scope :male,   ->{ where(sex: :male) }   # 男性
  scope :female, ->{ where(sex: :female) } # 女性
  scope :adult,  ->{ where(arel_table[:age].gteq 20) } # 成人
  scope :minor,  ->{ where(arel_table[:age].lt 20) }   # 未成年
  scope :men,    ->{ adult.male }   # 成人,男性
  scope :women,  ->{ adult.female } # 成人,女性
  scope :boys,   ->{ minor.male }   # 未成年,男性
  scope :girls,  ->{ minor.female } # 未成年,女性
end
```

## 単純なwhereのscopeをorでつなげる場合。
### ex) 男性 or 未成年

```ruby
User.where(User.male.minor.where_values.reduce(:or)).to_sql
# => "SELECT `users`.* FROM `users`  WHERE ((`users`.`sex` = 'male' OR `users`.`age` < 20))"

# もちろん male.minor と boys は同じなのでこれでもいい
User.where(User.boys.where_values.reduce(:or)).to_sql
# => "SELECT `users`.* FROM `users`  WHERE ((`users`.`sex` = 'male' OR `users`.`age` < 20))"
```

### ex) 男性 or 未成年 or :role => 'admin'

```ruby
User.where(User.male.minor.where(role: 'admin').where_values.reduce(:or)).to_sql
# => "SELECT `users`.* FROM `users`  WHERE ((`users`.`sex` = 'male' OR `users`.`age` < 20 OR `users`.`role` = 'admin'))"
```

## and条件も含むちょっと複雑なscopeをorでつなげる

### ex) 成人女性(成人 and 女性) or 未成年男子(未成年 and 男子)

```ruby
women = User.women.where_values.reduce(:and)
boys  = User.boys.where_values.reduce(:and)
User.where(women.or boys).to_sql
# => "SELECT `users`.* FROM `users`  WHERE ((`users`.`age` >= 20 AND `users`.`sex` = 'female' OR `users`.`age` < 20 AND `users`.`sex` = 'male'))"
```

### ざっくり説明
`ActiveRecord::Relation#where_values`で`Arel::Nodes::Node`の配列が取得できる。
このNodeにはarelの`.and()`やら`.or()`やらが使えるので、そのあたりを組み合わせてからARの`.where()`だったり`.merge()`だったりに渡してあげるとOK。
exists?をループ内で使わない

このコードはループ内でexists?を検証するクエリが走ってしまう。

```ruby:bad.rb
user = User.includes(:entries => :comments).find(id)
user.entries.each do |entry|
  if entry.comments.exists?
    ...
  end
end
```

こうしておけばEagerLoadingが効くのでクエリが走らない。

```ruby:better.rb
user = User.includes(:entries => :comments).find(id)
user.entries.each do |entry|
  if entry.comments.present?
    ...
  end
end
```
"TestCase class XXX is missing a public constructor with no parameters or a single String parameter" がLogCatにでて、テストが動かない問題

ActivityInstrumentationTestCase2を継承してTestケースを作るとき、
*引数なしのテストクラスを作るとテストの実行が出来ない*


```java:MainActivityTest.java
	public MainActivityTest(Class<MainActivity> activityClass) {
		super(activityClass);
	}
```

eclipseの自動補完を使ってしまうと、ついつい上記Classを引数にとるコンストラクタだけを作ってしまいがちだが、動作させるには引数なしのコンストラクタが必要

```java:MainActivityTest.java
	public MainActivityTest() {
		super(MainActivity.class);
	}
```

対象のAPKが正常にインストールされて、どこにも例外が発生しないのに
Androidのテストが動かないときは、LogCatにタイトルのエラーメッセージが表示されている場合がある。


Strutsなどサーバー側のフレームワークに慣れていて、TDDをやったことがある人であればすぐ気づくかもしれないが、それ以外の場合LogCatのエラーメッセージ以外は正常に動作しているように見えるので注意が必要だ。
デフォルトスコープとHABTM(has_and_belongs_to_many) relations

以下のような投稿とタグの関係を考える．一部のタグはデフォルトで見えないようにするために`default_scope`を使ってみる．

```ruby:models
class Tag < ActiveRecord::Base
  default_scope private: false
end
class Item < ActiveRecord::Base
  has_and_belongs_to_many :tags, join_table: "taggings"
end
```

しかしこうすると`item.tags`でprivate tagsを取ってこれない．

## 間違った対応
最初は以下のようにしていたが，これではセッター(`item.tags = tags`など)のときには問題が起きる．例えば`item.tags.push(tag)`などとしても保存されなかったりする．わかりづらい．

```ruby:item.rb
class Item < ActiveRecord::Base
  # ...
  protected
  def tags_with_unscoped
    Tag.unscoped { tags_without_unscoped }
  end
  alias_method_chain :tags, :unscoped
end
```

## 正しい方法
`has_and_belongs_to_many`の`conditions`オプションを使う．

```ruby:item.rb
class Item < ActiveRecord::Base
  has_and_belongs_to_many :tags, join_table: "taggings", conditions: { tags: { private: [true, false] }}
end
```

associationについては [Ruby on Rails Guides: A Guide to Active Record Associations](http://guides.rubyonrails.org/association_basics.html) を．
GAE/Pyのdev_appserver.pyで外部（localhost以外）から接続可能にするには

dev_appserver.pyで--hostオプションによりbind先アドレスを指定する。0.0.0.0であればどのインターフェイスからでも接続可能

```bash
$ google_appengine/dev_appserver.py --host 0.0.0.0 helloworld
```

VirtualBox上にLinux環境を構築してポートフォワーディングでホストOSからテストしようとした時にハマった。
Soprano的 データセンター構築の指針(嘘)

## はじめに
この指針(嘘)は SoftEther の作者登 大遊氏、プロジェクト709 にそれぞれ記載している内容を一部拝借して今後中の人が構築する際のメモとして記載したものになります。
http://d.hatena.ne.jp/softether/20061102
http://d.hatena.ne.jp/hori55/20110221/1298349500

## サーバー基本構想(2+1(+1))
常時2台(main + backup)のルーターに Soprano が利用するルーター,
(必要であれば)ひかり電話ルーターの構成とする。
(基本的にISPへ接続する場合は並列)

## IPアドレス割当構想
192.168.xxx.yyy/24 としてセグメントを構築する。
192.168.xxx.yyy/32 を割当てたら、基本的にその配下に設置したルーターの
DefalutGateway を 192.168.yyy.1 とする。

## サーバー構成図
isp1 ─ router1 ┐
isp2 ─ router2 ┼ storageida
isp3 ─ router3 ┘
isp3 ─ router3 ┐
isp4 ─ router4 ┼ storagetyo
isp5 ─ router5 ┘

router1: routerida
router2: routerbk1
router4: routertyo
router5: routerbk2

router3: changeable
changeable は Soprano と一緒に半移動するため第4オクテットを 3 に設定。
tyo に引っ越す場合は ida をそのまま放置し、radiko の判定を長野にしていく。
もし ida に戻る場合でも tyo を radiko 録音用にすれば良いわけでww

------------------------------------------------------------------------------------------------------------------------------------
(add 2013/03/30)
VPN の IPv4 ネットワークアドレスを 192.168.0.0/24 にするため 192.168.1.0/24, 192.168.2.0/24 に変更
(IPv6 は下記の｢IPv6 は～～｣にある通り)

router1, router4 はメインネットワーク
router2, router5 はメインネットワークが何らかの原因でダウンした際のバックアップ
どうせ CATV を見るだろw と思うのでバックアップ回線として活用するのもひとつの手。
※ただし、ADSL(フレッツ網)の場合 光の巻き添えを食らい接続できない可能性あり
http://www.itmedia.co.jp/news/articles/0705/16/news091.html


------------------------------------------------------------------------------------------------------------------------------------------------------

フレッツのセッション数は[通常2つ]だがひかり電話や Flet's Square を使う場合
セッション数不足で利用できなくなる可能性ある。電話で申し込みの確認をするときにセッションプラスの申し込みもできる。
そのため router({ida,tyo})の mpd.conf に設定を仕込む。 

それ以降のホストについては DHCP の割り当てで
IPv6 は 2001:3e0:365/48(iida), 2001:3e0:366/48(tokyo)
Feel6? InterLink?
catv でも v6 が割り当てられるのかも微妙、、、

## VPN
router1 ─[VPN]─ router4(内向き IP の第4オクテットが 1 同士)
router2 ─[VPN]─ router5(内向き IP の第4オクテットが 2 同士)

## 外向き生死監視
isp ─ router ─ outer_check(VM on storage or RaspberryPi, atom)

## ラック構成
現行では infra 系, media 系をそのまま1ラックに収容していたが、今後は infra 系, media 系を分離して収容する。
収容位置について基本的には下記の通り。その他何かある場合は未定 or 機器購入後決めていく。
(もちろん 裏側の配線のしやすさを考慮して 50[cm] 以上、壁に付けないようにする)
見せる Git revision in Rails app

用いる[git-revision](https://github.com/NARKOZ/git-revision) gem.


```ruby:Gemfile
gem 'git-revision'
```

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :set_git_header

  private

  def set_git_header
    response.headers['X-Git-Revision'] = Git::Revision.info[:commit_hash_short]
  end
end
```

置くcustom `X-Git-Revision` headerとlast commit sha.
phpのコーテーション


phpのダブルコーテーションとシングルコーテーションを調べたのでメモ
phpのバージョンは5.3.15

    $ php --version
    PHP 5.3.15 with Suhosin-Patch (cli) (built: Aug 28 2012 18:19:13)
    Copyright (c) 1997-2012 The PHP Group
    Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies


## 読み方

まずコーテーションなのかクォーテーションなのか、
物によっては読み方色々でどっちが正しいのか不明だったので
Google翻訳さんに聞いてみました。

- ダブルコーテーション => Double quotes
- ダブルクォーテーション => Double quotes
- Double quotes => 二重引用符
- 二重引用符 => Double quotes

- シングルコーテーション => Single quotes
- シングルクォーテーション => Single quotes
- Single quotes => 単一引用符
- 単一引用符 => Single quotes

どっちでも良いかな。二重引用符とか単一引用符の方が噛まずに済みそうではある。

## 違い

- ダブルクォーテーション　 ･･･ 文字列中の変数を変数値に置換する
- シングルクォーテーション ･･･ 文字列中の変数を変数値に置換しない

実行内容はこんな感じ

```php:
<?php
echo '\n'; # \n
echo "\n"; # 改行される

$pinch = '(／・ω・)／ピンチ！';

echo '＼(・ω・＼)SAN値！$pinch'; # ＼(・ω・＼)SAN値！$pinch
echo "＼(・ω・＼)SAN値！$pinch"; # ＼(・ω・＼)SAN値！(／・ω・)／ピンチ！

$str = 'c';

echo 'ab$strd'; # ab$strd
echo "ab$strd"; # ab
echo "ab $str d"; # ab c d
echo "ab$str d"; # abc d
echo "ab$strにd"; # ab
echo "ab{$str}d"; # abcd

class Huge{
  function foo() {
    return 'hi';
  }
}

$huge = new Huge;
echo "hoo $huge->foo()"; # hoo ()
echo "hoo {$huge->foo()}"; # hoo hi

```

## 実行速度

### 代入のみ

以下のようなプログラムを作成

```php:singleQuotes.php
<?php
$start = time();
$count = 1000000000;
for ($i=0;$i<$count;$i++) {
  $str = 'hihi';
}
$end = time();

echo $end - $start . "\n";
```

`$str`への代入を単一引用符から二重引用符へ変更した`doubleQuotes.php`も作成

    $ diff doubleQuotes.php singleQuotes.php
    5c5
    <     $str = "hihi";
    ---
    >     $str = 'hihi';

10回ずつ実行して平均値を比べる

    $ for i in `seq 1 10`; do php singleQuotes.php ;done;
    92
    97
    100
    94
    102
    93
    101
    100
    77
    90
    # 平均値 94.6
    $ for i in `seq 1 10`; do php doubleQuotes.php ;done;
    101
    95
    100
    77
    111
    96
    78
    107
    98
    100
    # 平均値 96.3

誤差と言っても良いぐらいの速度差ではある。

### 変数展開

変数展開の速度も試す

```php:singleQuotes.php
<?php
$start = time();
$count = 1000000000;
$str1 = 'hi';
for ($i=0;$i<$count;$i++) {
    $str2 = 'hi' . $str1 . 'hi';
}
$end = time();

echo $end - $start . "\n";
```

    $ diff singleQuotes.php doubleQuotes.php
    6c6
    <     $str2 = 'hi' . $str1 . 'hi';
    ---
    >     $str2 = "hi{$str1}hi";

10回ずつ実行して平均値を比べる

    $ for i in `seq 1 10`; do php singleQuotes.php ;done;
    140
    140
    141
    136
    139
    141
    121
    153
    141
    143
    # 平均値 139.5
    $ for i in `seq 1 10`; do php doubleQuotes.php ;done;
    138
    168
    165
    160
    162
    177
    142
    175
    170
    170
    # 平均値 162.7

二重引用符での変数展開だと若干遅くなるみたい。

### sprintf

ちなみに`sprintf`での速度も見てみる

    $ diff singleQuotes.php sprintf.php
    6c6
    <     $str2 = 'hi' . $str1 . 'hi';
    ---
    >     $str2 = sprintf('hi%shi', $str1);

10回ずつ実行して平均値を比べる

    $ for i in `seq 1 10`; do php sprintf.php ;done;
    370
    371
    378
    382
    401
    394
    415
    396
    402
    385
    # 平均値 389.4

単一引用符に比べると３倍ほど時間がかかるようです。

## まとめ

単一引用符早いってことでしょうか。
二重引用符だと見た目奇麗に書けるけども実行速度と相談でしょうか。
そんなに気にする物では無いかもですが。
`sprintf`はたまに使いますが使用回数多いところでは考えものかも知れませんね。