OmniAICreator/Qiita-1.07M huggingface dataset:
Zabbixでmysqlをモニタリングするスクリプト

[Zabbix study - SSSSLIDE](http://sssslide.com/www.slideshare.net/baguzy/zabbix-study)
で紹介されていた手法を使っています。ありがとうございます。

zabbix agentからUserParameterで外部スクリプトを起動し、そこからzabbix_senderで複数の値を登録するという手法です。

まず、mysqlをモニタリングするユーザの作成と権限付与を行います。PROCESS権限が必要です。
[5.3.1. Creating a MySQL User Account for the Monitor Agent](http://docs.oracle.com/cd/E17952_01/mysql-monitor-2.3-en/mem-agent-rights.html)

```mysql
grant process on *.* to '${Your_mysql_user_here}'@'${Your_mysql_server_here}' identified by '${Your_mysql_password_here}';
```

パスワードはファイルに保存しておいて、mysqlの--defaults-extra-fileオプションで指定します。

[MySQL :: MySQL 5.5 Reference Manual :: 4.2.3.3 Using Option Files](http://dev.mysql.com/doc/refman/5.5/en/option-files.html)


```ini:/etc/zabbix/.my.cnf
[client]
password=${Your_mysql_password_here}
```

/etc/zabbix/.my.cnfはzabbixユーザのみ読めるようにしておきます。

```sh
sudo chown zabbix:zabbix /etc/zabbix/.my.cnf
sudo chmod 400 /etc/zabbix/.my.cnf
```

zabbix agentから起動するスクリプトです。以下の2つのSQLを1回のmysqlコマンド起動で実行して、awkで加工して必要な値を出力します。

```
show global status;
show engine innodb status\G
```

```sh:/etc/zabbix/send_mysql_stat_to_zabbix.sh
#!/bin/sh
dbuser=${Your_mysql_user_here}
dbhost=${Your_mysql_server_here}
mycnf_path=/etc/zabbix/.my.cnf
zabbix_server=${Your_zabbix_server_or_proxy_here}
my_zabbix_hostname=`hostname`

echo_sql() {
  cat <<'EOF'
show global status;
show engine innodb status\G
EOF
}

echo_sql | mysql --defaults-extra-file=$mycnf_path -u $dbuser -h $dbhost | awk '
$1=="Bytes_received" { print "Bytes_received", $2 }
$1=="Bytes_sent" { print "Bytes_sent", $2 }
$1=="Com_insert" { print "Com_insert", $2 }
$1=="Com_select" { print "Com_select", $2 }
$1=="Com_update" { print "Com_update", $2 }
$1=="Com_delete" { print "Com_delete", $2 }
$1=="Threads_connected" { print "Threads_connected", $2 }
$1=="Threads_running" { print "Threads_running", $2 }
/^Buffer pool hit rate [0-9]+ \/ [0-9]+/ {
  print "Buffer_pool_hit_rate", $5 / $7
}
/^[0-9.]+ inserts\/s, [0-9.]+ updates\/s, [0-9.]+ deletes\/s, [0-9.]+ reads\/s/ {
  print "insertsPerSec", $1
  print "updatesPerSec", $3
  print "deletesPerSec", $5
  print "readsPerSec", $7
}
' | sed 's/^/'$my_zabbix_hostname' mysql./' | \
zabbix_sender -z $zabbix_server -s $my_zabbix_hostname -i - > /dev/null
echo $?
```

スクリプトの出力はコマンドの終了コードを出すようにしています。

zabbix-agentから起動するためのスクリプトです。

```:/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
UserParameter=mysql.monitor_status,/etc/zabbix/send_mysql_stat_to_zabbix.sh
```

zabbixの管理画面に適宜アイテムを追加します。

zabbix-agent再起動

```sh
/etc/init.d/zabbix-agent restart
```
fabricのお役立ちコンテキストマネージャ


# fabric.api.path: $PATHを操作できる

fabric.api.path を使うとPATHをいじれる。


例として、Pythonをソースからビルドし、/usr/local/bin 配下に配置し、ここのpythonを実行する。


```python:fabpath.py
import fabric.api as api

with api.path("/usr/local/bin", behavior="prepend"):
    api.run("python -V")
```

behavior="prepend" を指定することによって

> **PATH=/usr/local/bin:$PATH**

このように展開される。


# fabric.api.prefix: 事前処理を実行させる

fabric.api.prefix を使うとwithブロックの中のすべてのrun, sudoの命令の前に指定した処理を挿入できる。


例えばvirtualenvを有効にする場合に使う。

```python:enablevenv.py
import fabric.api as api

with api.prefix(". /home/www/bin/activate"):
    fabric.api.run("./manage.py syncdb")
```


# fabric.api.shell_env: シェルの環境変数を追加する

例として、pythonコマンドでDjangoのスクリプトを実行する。

```python:djscript.py
import fabric.api as api

with api.env_shell("PYTHONPATH=. DJANGO_SETTINGS_MODULE=settings.imagawa"):
    api.run("python dosomething.py")
```
UITableViewの空セルのseparatorを消す

##元情報
http://stackoverflow.com/questions/1633966/can-i-force-a-uitableview-to-hide-the-separator-between-empty-cells

```objective-c:test.m
UITableView *table = [[UITableView alloc] initWithFrame:frame];

UIView *v = [[UIView alloc] initWithFrame:CGRectZero];
v.backgroundColor = [UIColor clearColor];
[table setTableHeaderView:v];
[table setTableFooterView:v];
```
URLのパラメータ部分を NSDictionary に変換する


URLのパラメータ部分を NSDictionary に変換したい場合って良くありますよね。ruby で言う CGI::parse みたいなの。ちょっと必要になったので、NSURL クラスをカテゴリで拡張してみました。

```objective-c:NSURL+dictionaryFromQueryString.h
#import <Foundation/Foundation.h>

@interface NSURL (dictionaryFromQueryString)
-(NSDictionary *) dictionaryFromQueryString;
@end

```

```objective-c:NSURL+dictionaryFromQueryString.m
#import "NSURL+dictionaryFromQueryString.h"

@implementation NSURL (dictionaryFromQueryString)
-(NSDictionary *) dictionaryFromQueryString{

    NSString *query = [self query];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:0];
    NSArray *pairs = [query componentsSeparatedByString:@"&"];
    
    for (NSString *pair in pairs) {
        NSArray *elements = [pair componentsSeparatedByString:@"="];
        NSString *key = [[elements objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSString *val = [[elements objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        
        [dict setObject:val forKey:key];
    }
    return dict;
}
@end

```

NSURL ではなく NSString にカテゴリ追加してもいいかもしれませんね。
pythonのコピー


浅いコピーと深いコピーがある

浅いコピーはネストされた先がかわるとかきかわってしまう

ネストされてる場合深いコピー
ネストしないかるいやつ浅いコピーと言う感じだろうか

```
import copy
copy.copy(pokopoko) #浅いコピー
cpoy.deepcopy(pokopoko) #深いコピー

pokopoko[:] #リストの浅いコピー
```

こんなかんじなのかな
jQuery1.9以降のIE判別方法

jQuery1.9以降では長らく非推奨であった`$.browser`が無くなるため、以下のようなコードは動かない。

```js
if ($.browser.msie) {
  alert("グヘヘ、きみIEなんだね（ ＾ω＾）");
}
```

存在しないオブジェクトを辿ろうとしてエラーで処理が止まるから注意。

## $.supportを使う

`$.browser.msie`などという安直なやり方で条件分岐出来る時代は終わった。
これからは、ブラウザがサポートしている機能の組み合わせで判別するしか無い。

というわけでIE6〜IE9までは以下のコードで分けられる。

```js
if (!$.support.noCloneChecked) {
  alert("お前IEだな！");
}
```

どこかのブログに「$.support.noCloneEvent」はIE6~9までfalseを返す、みたいなことが書いてあったのだが、それだとIE9はtrueを返すので信じないように。
noCloneCheckedの他にIE6〜IE9までfalseを返してくれるのは「$.support.optSelected」くらいだと思う。
「$.support.cors」も使えそうだが、Operaに反応してしまうらしい。

## IE10は？

知らない。
FlashBuilder 4.7で"version4locale を開くことができません" というエラーが出た時の対処法

エラー全文はこちら

> 'C:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\eclipse\plugins\com.adobe.flexbuilder.flexunit_4.7.0.349722\flexunitSwcs\4.5\locale\en_US\version4locale' を開くことができません	JoGame		不明	Flex の問題

1. C:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\eclipse\plugins\com.adobe.flexbuilder.flexunit_4.7.0.349722\flexunitSwcs\4.5\locale\en_US　フォルダ(インストールディレクトリは仮)に含まれている **FlexUnitTestRunner_rb.swc** をコピーする

2. 上記フォルダに **version4locale** という名前のフォルダを作成する

3. 新しく作成した **version4locale** に、**FlexUnitTestRunner_rb.swc** をペースト

これで解決すると思います。2回遭遇して2回解決済。
GitLabとRedmineを連携させる

GitLabで管理しているgitレポジトリをRedmineに登録したので，やり方をメモ．

TOC
---------
1. まえおき
2. GitLab上の権限設定
3. ミラーレポジトリの作成
4. Redmine上で登録
5. Web Hookの設定

まえおき
---------
Redmineにgitレポジトリを登録するときは，localかつbareなレポジトリである必要がある．
 
GitLabとRedmineを同じサーバで運用して，GitLab(gitolite)が管理している/home/git/repositories/をRedmineに登録すれば良いと思い，試してみたがうまくいかなかった．パーミッションは設定したつもりだが，`fatal: Not a git repository: '/home/git/repositories/hoge.git/'`と怒られる．出来た人がいたら教えて欲しい．
 
ここではRedmine用にミラーしたレポジトリを用意して行う方法を記録する．
 
 
GitLab上の権限設定
---------
Redmine用にミラーしたレポジトリを作るため，GitLab上のレポジトリ(プロジェクト)をcloneできるよう権限設定を行う．やり方は以下の二通り．
 
1. プロジェクトにDeploy Keyを追加する
2. Redmine用のユーザを作成し，プロジェクトにReporterとして参加させる
 
今後も幾つかGitLabとRedmineを関係付けたいプロジェクトが出てきそうだったので，オペレーションが楽そうな2を選んだ．cloneできればどっちでも良い．
 
 
ミラーレポジトリの作成
---------
例えば以下のようにしてミラーレポジトリを用意する．
 
```sh
sudo -u redmine mkdir -p /home/redmine/git_repositories // ミラーレポジトリを置く場所
cd /home/redmine/git_repositories
sudo -u redmine git clone --mirror git@my-gitlab.com/hoge.git // --mirrorでbareレポジトリをcloneできる
```
 
 
Redmine上で登録
---------
Redmineでプロジェクトを開いて，Settings > Repositories > New repository

| field | value |
|:-----------|:------------|
| SCM | git |
| Main repository | true | 
| Identifier | 何でも良い気がする |
| Path to repository | /home/redmine/git_repositories/hoge.git/ |
| Path encoding | Defaultのまま |
| Report last co... | ご自由に |
 
CreateするとRepositoryというタブが増える．クリックするとしばらく時間がかかった後，レポジトリが見える様になる．
 
 
Web Hookの設定
---------
GitLab上でレポジトリが更新されたことをRedmineへ通知し，ミラーを更新する設定を行う．
 
まずは，Redmineにredmine_github_hookプラグインをインストールする．
GitHubとの連携のためのプラグインだが，GitLabでも使える．
インストール方法はこちらから -> https://github.com/koppen/redmine_github_hook
 
次に，GitLab上でプロジェクトのHooksタブで以下のHookを追加する．
`http://my-redmine.com/github_hook?project_id=<project identifier>`
 
`<project identifier>`はRedmine上で設定したプロジェクトのIdentifier．登録したレポジトリではなく，プロジェクトのIdentifierであることに注意．



いじょう．
clamav gem を MacOSX にインストールする


    $ brew install clamav

この時入ったclamavのバージョンは 0.97.6

````
$ env ARCHFLAGS='-arch x86_64' gem install clamav -- --with-clamav-include=/usr/local/Cellar/clamav/0.97.6/include --with-clamav-lib=/usr/local/Cellar/clamav/0.97.6/lib/
````

でgemのインストールが完了する。
アスペクト比を保った長方形の拡大縮小

ここでいうアスペクト比とは長方形の高さに対する幅の長さのこと。

長方形の大きさだけが問題なのでCGSizeの関数を作る。

```objc
// アスペクト比の取得
CGFloat CGSizeGetAspect(CGSize size) {
    return size.width / size.height;
}

// sizeに内接する、アスペクト比がaspectの長方形の大きさを返す。
CGSize CGSizeMakeAspect(CGSize size, CGFloat aspect) {
    if (CGSizeGetAspect(size) >= aspect)
        return CGSizeMake(size.height * aspect, size.height);
    else
        return CGSizeMake(size.width, size.width / aspect);
}

// sizeに外接する、アスペクト比がaspectの長方形の大きさを返す。
CGSize CGSizeMakeAspectFill(CGSize size, CGFloat aspect) {
    if (CGSizeGetAspect(size) < aspect)
        return CGSizeMake(size.height * aspect, size.height);
    else
        return CGSizeMake(size.width, size.width / aspect);
}
```
関数名はAVFoundationを参考にした。
CGSize~っていう名前の関数を作ってもいいんだろうか？　ObjCでいうカテゴリ的なものだと思えば問題無し……か？
Resqueスケジューラーで動的にargsを渡す方法


需要があるかどうかもわからないし、他にやり方があるかもしれない

## schedulerコンフィグにargsがHashになるよう設定する　
```resque_scheduler.yml
sample_queue:
  every: 60s
  class: SampleQueue

  # Hashになるように設定する
  args:
    time: "this will be replaced"
```

## before_delayed_enqueue フックでわたってきたHashを書き換える
```ruby:
class SampleQueue
  def self.before_delayed_enqueue(*args)
    # schedulerがenqueuする直前によばれ
    # argsにparseされたargsが配列でわたってくる    
    # おそらくこんな用途に使うものでないのか
    # 戻り値とか無視されるのでHashで渡すようして
    # そのHashの中身を上書き
    # ソース見る限りそれをそのまま渡してそう
    param = args.shift
    param["time"] = Time.now.to_i
  end

  def self.perform(params)
    time = params["time"]
  end
end
```
findでファイル名のみ表示

# はじめに

`find`を普通に使うと, 以下のようにディレクトリとともに出力されるが,
ファイル名のみ抽出したい場合がある.

```console
$ find . -type f
./path1/to1/file1.pl
./path2/to2/file2.rb
./path3/to3/file3.py
./path4/to4/file4.php
./path5/to5/file5.js
```

# 自分がよく使う方法

## 方法①

以下のように, `find`の後にパイプでAWKに渡すと, ファイル名のみ出力できる.

```console
$ find . -type f | gawk -F/ '{print $NF}'
file1.pl
file2.rb
file3.py
file4.php
file5.js
```

(コメント欄でご指摘いただいた方法)

## 方法②

`sed`でも可 [^1]

```console
$ find . -type f | sed 's!^.*/!!'
```

[^1]: `sed`より`awk`の方がコマンドは長くなるが,  個人的に意味が分かりやすいので,
      `awk`による方法を使っている.

# その他の方法

## 方法③

まず, `find`でファイル名のみを表示する方法としては,
`basename`を使った以下のような方法が最初に思いつく.
ただし, BSDの`basename`では問題ない一方で, GNUの`basename`ではエラーを出す.
これは, `xargs`が複数の引数をまとめて渡すにもかかわらず,
GNUの`basename`は引数を1つしか取れないためらしい.

```sh
find . -type f -print0 | xargs -0 basename # BSD版のみ
```

## 方法④

そこで`xargs`の`-n`オプションを使って,
`basename`に引数を1つずつ渡す以下のような方法が思いつく.
しかし当然, 対象のファイル数が膨大であれば処理が遅い.

```sh
find . -type f -print0 | xargs -0 -n1 basename # BSD版でもGNU版でも使えるが, 遅い
```

## 方法⑤

また, GNU版の`find`では`-printf`オプションを使って, 以下のように簡潔に書ける. [^2]

```sh
find . -type f -printf '%f\n' # GNU版のみ
```

[^2]: 個人的には, 使い分けるのが煩わしいので,
      最初に書いた`awk`や`sed`による方法を使っている.

# 確認環境

- Ubuntu 12.04: GNU findutils 4.4.2 (find, xargs), GNU coreutils 8.13 (basename)
- Mac OS X 10.7.5: BSD (find, xargs, basename)

# 参考

https://superuser.com/questions/52861/find-exec-vs-xargs-aka-why-does-find-xargs-basename-break
RailsでKonachaとSinon.JSを合わせて使う

KonachaだけでもJSテストをするには十分かもしれないが、Ajaxなどの通信部分のテストなどは面倒だ。
そこをSinon.JSを導入して解決する。

## Sinon.JSとは？

公式。
http://sinonjs.org/

mixiのエンジニアブログに分かりやすい導入編が載っているので参考にしてください。
http://alpha.mixi.co.jp/2011/10798/

フェイクオブジェクトを作成することで、関数が呼ばれたかどうかを監視したり、ダミーのXHRやServerを作成することで、サーバ側の依存を無くしたりできます。
素晴らしいですね。

## Railsに導入する

これ幸いなことに、Rails用のgemがあります。

```ruby:Gemfile
gem 'konacha'
gem 'sinon-chai-rails'
gem 'sinon-rails'
```

`bundle install`してください。

- sinon-rails
  - Sinon.JSをRailsにインストールします
- sinon-chai-rails
  - Sinon.JSとChaiをつなげるものらしい（あまり理解してない・・・）
  - KonachaはChaiが含まれているので念のため入れておきます

## 試しに使う

```javascript:application_spec.js
//= require application
//= require sinon-chai
//= require sinon

var Hogeee = function(callback) {
  /* 中でXHR使っているとイメージしてください */
  /* 通信に成功したらcallbackを実行する */
}

describe("Hogeee", function(){
  it("通信に成功する", function(){
    var _xhr, _requests;
    beforeEach(function(){
      _xhr = sinon.useFakeXMLHttpRequest();
      _requests = [];
      _xhr.onCreate = function(xhr){
        _requests.push(xhr);
      }
    });
    afterEach(function(){
      _xhr.restore();
    });

    var spy = sinon.spy();
    Hogeee(spy);  // コールバック関数にspyを仕込む
    _requests[0].respond(200);  // sinonに200を返させる
    // calledWithMatchの中のオブジェクトとHogeeeのコールバック関数が同じかどうか
    spy.calledWithMatch({ data: '成功ですわ' }).should.be.ok;
  });
});
```

あとは適当に頑張れば幸せになれる。
Rails4.0 Newcomer


## all => ActiveRecord::Relation

```rb
Task.all.class.name
=> "ActiveRecord::Relation"
```

## where.not

```rb
Task.where.not(title: "test")
 # => Task Load (0.3ms)  SELECT "tasks".* FROM "tasks" WHERE ("tasks"."title" != 'test')
```

## where!

```rb
tasks = Task.order(:created_at); tasks.where!(title: "test")
 # => Task Load (0.3ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."title" = 'test' ORDER BY "tasks"."created_at" ASC
```

## 複数カラムpluck

```rb
Task.where(id: 1).pluck(:title, :content, :count)
   (0.2ms)  SELECT "tasks"."title", "tasks"."content", "tasks"."count" FROM "tasks" WHERE "tasks"."id" = 1
 # => [["テスト", "テストタスク", 1]]
```

## update_attributes => update

```rb
Task.update_attributes(params[:user])
```

↓

```rb
Task.update(params[:task])
```

## order => :asc／:desc

```rb
Task.order(created_at: :desc).all
 # => SELECT "tasks".* FROM "tasks" ORDER BY "tasks"."created_at" DESC
```
Konachaのインストールと事始め

RailsでJSのテストフレームワークを動かすにはどうしたらいいのか。
いろいろあるみたいだけど、Konachaをインストールしてみた。
https://github.com/jfirebaugh/konacha

gemに追加すればいいだけ。

```ruby:Gemfile
gem 'konacha'
```

これで`bundle install`すればインストールは完了する。

## 起動

標準ではブラウザを立ち上げてテストを実行する。
rakeタスクで起動。
`$ bundle exec rake konacha:serve`

ついでに、capybara-webkitやpoltergeistを導入すればheadlessテストも出来る。

## 試しに使う

テスト用のファイルは'spec/javascripts'ディレクトリを作成し、その中にテストファイルを置いておけばいい。
ファイルのルールは`ファイル名_spec.js`とか`ファイル名_test.js`であればOK。

ここでは`application_spec.js`として以下のようなテストを実行する。

```javascript:application_spec.js
//= require application

describe('Array', function(){
  describe('#indexOf()', function(){
    it('should return -1 when the value is not present', function(){
      [1,2,3].indexOf(5).should.equal(-1);
      [1,2,3].indexOf(0).should.equal(-1);
    });
  });
});
```

きっと動くだろう。

### 補足

Konachaの中身は、MockaとChaiなんだそうだ。
困ったときは両方のドキュメントに目を通すといい。
Titaniumのバッドノウハウ

## AndroidでTableViewのseparatorが消せない
## ScrollViewのfadingEdgeも消せない

消せない。
のでmodule作りました。
https://github.com/cathandnya/ti_android_util

## Androidでボタン押したら自動で暗くする

https://gist.github.com/cathandnya/5028411
alpha変えてるだけ

## ImageViewでAspectFillやりたい

loadイベントでimageAsCropped()する。
Androidだと切り取り前の画が一瞬出てしまう…
https://gist.github.com/cathandnya/5028405

## TableView内にTextFieldを入れたとき、Androidで文字入力中にフォーカスが外れる

TableViewだとだめらしいのでScrollViewにする

## TableView内にWebViewを入れたとき、WebView内のタップに反応しない

TableView内にあるとだめっぽい。

## Androidで実機だけborderRadiusが効かない

android:hardwareAccelerated="true"
にしてると起きるぽい。falseに。

## Releaseビルドでネットワークに繫がらない

Debugビルド時だけSSL証明書エラーを無視してるっぽい。
validatesSecureCertificate : false
にする。

## AndroidでtoImage().heightしても正しい高さが取れないことがある

取れないことがある。
他の方法で回避。

## AndroidでImageViewのsubviewが表示されない

表示されない。
Viewを使う。
ImageMagick を OSX Mountain Lion にインストールする

## 概要
### 問題
homebrew でのインストールでは display コマンドなどがうまく動作しなかった。

日英の文献を調べてもネット上に解決策がまだ転がっていないように感じたので、簡単な方法ではあるがドキュメントを残しておくことにした。

###解決
下記リンクからインストーラーパッケージを用いてインストールしたらうまくいった。

http://cactuslab.com/imagemagick/

## 経緯
### 環境
- MacBookPro Retina, Mid 2012
- OS 10.8.2
- Homebrew 0.9.4

### ダメだった例
homebrew で imagemagick をインストールすると……


```terminal
# ダメな例
$ brew install ImageMagick

```

インストールされたバージョンは、

- ImageMagick-6.8.0-10

である。
display コマンドを打つと、利用できるオプションの羅列とともに以下のようなメッセージが出る（オプションの表示は省略しました）。
もちろん、X11は立ち上がらない。

``` terminal
$ display

……

display: delegate library support not built-in `' (X11) @ error/display.c/DisplayImageCommand/1909.
```

設定を表示させてみると、DELEGATES に x11 が入っていない。
ゆえに、動作しないわけだ。

``` terminal
$ convert -list config

……

DELEGATES      bzlib fontconfig freetype jpeg jng lcms png tiff xml zlib
```

しょうがないのでアンインストールする。

``` terminal 
$ brew uninstall imagemagick
Uninstalling /usr/local/Cellar/imagemagick/6.8.0-10...
```


### よかった例
CactusLab でインストーラーパッケージを入手し、インストールする。

http://cactuslab.com/imagemagick/

自分は下記のバージョンをダウンロードした。

- ImageMagick 6.7.8-8 for Mac OS X Mountain Lion
With FreeType support. Requires XQuartz. (8.6MB)

**もちろん、 XQuartz はインストール済みだ。インストールしてない場合は、適当にやり方をググってインストールしておくべきだ。**

- ImageMagick-6.7.8

がインストールされた。
インストールが完了したら、設定を確認してみる。

``` terminal
$ convert -list config

……

DELEGATES     bzlib freetype jpeg jng jp2 lcms png tiff x11 xml zlib

```

ごらんのように、 DELEGATES に x11 が追加されている。

``` terminal
$ display
```
コマンドを打つと、 XQuartz のウインドウが立ち上がり、魔法使いのおじいさんの画像が表示された。

## 結論
最新の ImageMagick のバージョンの問題なのか、それとも Homebrew のダウンロードするパッケージの問題なのか、よくわからないが、さしあたっては同じような問題にぶつかった場合、上記のインストーラーを用いた方がよい。
Boxen 導入でハマったことメモ

Boxen へ移行する際、多少ハマりがちなので、随時メモ

## FileVault が必須といわれる
```
Please enable full disk encryption and try again
```

`--no-fde` フラグをつけて実行するか `BOXEN_NO_FDE` 環境変数を 1 にしてやる

```
$ BOXEN_NO_FDE=1 script/boxen
```

## localhost, *.dev が見れない
pow が ipfw を設定しているので、それを削除してやる

```
$ sudo ipfw list
00100 fwd 127.0.0.1,20559 tcp from any to me dst-port 80 in
00100 fwd 127.0.0.1,20559 tcp from any to me dst-port 80 in

$ sudo ipfw delete 00100
$ sudo vim /etc/ipfilter/ipfw.conf
```

```diff:ipfw.conf.patch
- add 100 fwd 127.0.0.1,20559 tcp from any to me dst-port 80 in
```


## *.dev が見れない
pow と違って自分でプロセスをつくってやる必要がある
https://github.com/boxen/our-boxen/blob/master/docs/rails.md#unicorn

## 導入時にインストールされていたアプリを削除すると、boxen コマンドで再導入できない
```
$ sudo rm -f /var/db/.puppet_appdmg_installed_Skype
```
Capybaraでハマらないために気をつけるべき4つのこと

自分がCapybaraで一番ハマったのは、画面の初期化や、Ajaxやアニメーションなどの遅延を待たずに、どんどんclickなどを行おうとして意図しない結果になってしまうこと。

ブラウザから自分で試してみてもうまく行くので、自動テストをうまく行かせるためだけのデバッグ作業となり、作業のための作業、これは無駄以外のなんでもない。腹立たしい。
だから、情報共有。

# findで要素が準備OKになるまで待たせる

本家の

  https://github.com/jnicklas/capybara#asynchronous-javascript-ajax-and-friends

でも書かれているが、Capybaraにはこういう非同期JavaScriptの問題への対処として、findや、have_content実行時にまだ要素が見つからない場合は、設定した時間(初期値2秒)待ってからリトライをしてくれる。

この機能を使って、clickする、have_xxx で検証するなどの前に、findでちゃんと存在するまでcapybaraに待たせる事が重要。

# 基本的に非表示要素がfindやhave_selectorなどにヒットしたりしないようにする

feature/support/env.rb にて以下のように設定する。

```
  Capybara.ignore_hidden_elements = true
```

こうしないと

* 実際に押す事が想定されないタイミングでもリンクがクリックされてしまう
* 意図したタイミング以外で検証してしまう

などで、意図しない状態が生まれる。

たとえば、

* アニメーション完了後に初期化
* その初期化された要素に対してクリックをさせる

という動きを想定していても、アニメーション完了前にクリックにいってしまう。

jQueryのshow()みたいな、時間が短いアニメーションだと、アニメーションの存在にすら気づかずハマったりする。
非表示要素がfindなどにヒットしないことにより、上記のwaiting動作が働き、表示されるまで待ってから押させるようにして解消する。

# windowやimgのonloadの初期化を待ってくれない

windowのonloadや、``` $('img.hoge').load(function(){ ...``` のような画像のロードは
ハンドラーが呼び出される前に、capybaraの処理はがんがん走ってしまう。

できるだけ、DOM readyで初期化するようにすること。
または、画像がloadされるまで待つ、とかそういうcapybara側の処理(cucumberであればstep_difinitionなど)を自作するなどして、意識的に待たせないといけない。

# 画面遷移を待ってくれない

もしfindで検証したい要素がない場合は待ってくれるが、絞り込み検索画面など、画面遷移前と遷移後がほぼ画面構造が同じ場合、画面遷移がされる前にfindは通過してしまう。

ページタイトルをユニークにするなどしてまずそこで検証をかけると妥当なwaitが発生して回避できる。

# 以上...

気をつけるべき事はまだ、増えそうだけど、順次増やしていくか ^^;
Rでマルコフ確率場の反復条件付きモード

PRML 8.3.3に記載の通り、ノイズを含む観測画像をy、未知の元の画像をxとするマルコフ確率場において、反復条件付きモード(ICM)によって、yが与えられたときp(x|y)を極大化するxを求めます。図8.30と同様に、元の画像、ノイズを含む画像、ICMによって復元された画像とピクセルの復元率を表示します。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/kblOcNuhPm/16.IteratedConditionalModes.png)

```r
library(biOps)
frame()
set.seed(0)
par(mfcol=c(2, 3))
par(mar=c(0, 0, 1, 0))
data(logo)
source <- imagedata(logo[,,3])
NI <- nrow(source)
NJ <- ncol(source)
s <- ifelse(source < 128, -1, 1)
plot(imagedata((s + 1) / 2 * 255))
title("source", cex.main=1.0)

# add noise
y <- s * ((runif(length(s)) > 0.1) * 2 - 1)
plot(imagedata((y + 1) / 2 * 255))
title("y", cex.main=1.0)

doplot <- function(beta, eta, h) {
	x <- y
	repeat {
		energyDiff <- 0
		for (i in (1:NI)) {
			for (j in (1:NJ)) {
				energy <- function(xx) {
					result <- h * xx
					if (i > 1) {
						result <- result - beta * xx * x[i - 1,j]
					}
					if (i < NI) {
						result <- result - beta * xx * x[i + 1,j]
					}
					if (j > 1) {
						result <- result - beta * xx * x[i,j - 1]
					}
					if (j < NJ) {
						result <- result - beta * xx * x[i,j + 1]
					}
					result <- result - eta * xx * y[i,j]
					result
				}
				values <- c(x[i,j], x[i,j] * -1)
				energies <- energy(values)
				minEnergyIndex <- which(energies == min(energies))
				x[i,j] <- values[minEnergyIndex]
				energyDiff <- energyDiff + energies[minEnergyIndex] - energies[1]
			}
		}
		cat("difference of total energy");print(energyDiff)
		if (energyDiff == 0) {
			break
		}
	}
	restored = round(sum(s == x) / length(x) * 100, 1)
	plot(imagedata((x + 1) / 2 * 255))
	title(paste0("x (beta=", beta, " eta=", eta, " h=", h, ") ", restored, "%"), cex.main=1.0)
}

doplot(1.0, 2.1, 0)
doplot(1.0, 2.1, 1.5)
doplot(1.0, 2.1, -1.5)
doplot(5.0, 2.1, -1.5)
```
SSH するときにホスト名を自動補完する


bash-completion を使うと ssh コマンドで（ログインしたことのある）ホスト名を補完してくれたりします。


```shell
$ brew install bash-completion
(snip)
Add the following lines to your ~/.bash_profile:
  if [ -f $(brew --prefix)/etc/bash_completion ]; then
    . $(brew --prefix)/etc/bash_completion
  fi
```

 なので ~/.bash_profile に追記。

```~/.bash_profile 
  if [ -f $(brew --prefix)/etc/bash_completion ]; then
    . $(brew --prefix)/etc/bash_completion
  fi
```

設定を再読み込み。

```shell
$ source ~/.bash_profile
```

あとはいい感じに補完してくれます。

```
$ ssh  <TAB>
192.168.1.10
192.168.1.101
192.168.1.11
192.168.1.2
192.168.1.202
192.168.1.213
(snip)
```

これでいろいろ捗る。

Debian ぽいディストリビューションなら標準でインストール済みらしいので、設定の追加だけで使えるぽい。
Macでcanvas利用時に


フレームレートが定期的に一瞬落ちる現象が起きた。
外部モニタに接続するとなぜか起きない。
ガベコレっぽい雰囲気を感じて原因を探ったが、
コードを変更しても改善はなかった。

ふと、自分のMacBook Proにグラボが2ついて、
自動で切り替わる事を思い出す。

設定は
システム環境設定 &gt; 省エネルギー &gt; グラフィックスの自動切り替え
にある。

試しにチェックを外すと、、、
滑らかになった！！

外部モニタにつなぐとグラボを切り替えるらしい。
だから外部モニタだと問題が起きなかったんだ。。

さて、jsでmacのグラボの切り替えが直接できるはずもないので、
方法を考えた。

負荷がかかりそうだと判断したり、
OpenGLを使ったアプリを立ち上げると切り替わるらしいので、
まず最初に思いつくのは、WebGLっしょ。

```coffeescript
window.onload = ->
  c = document.createElement 'canvas'
  break for key in ["experimental-webgl", "webgl"] when window.MAC_GPU_FIX = c.getContext key
```

上のコードを入れたら、一発でグラボが切り替わった。
なんの処理をしなくても、WebGLコンテキストを保持してれば良いみたい。

グラボの状態を簡単にチェックできたり、
設定できたりするアプリがあったので、
そちらを入れて動作をチェックした。

gfxCardStatus
[http://codykrieger.com/gfxCardStatus](http://codykrieger.com/gfxCardStatus)

やれやれだぜ。
Ubuntu Linux上で受け入れテスト自動化し、OS X上でリモートデバッグする

# 前提

 * Cucumber + Capybara + Poltergeistで受け入れテストを自動化(RSpecのrequest specでも構わないと思う)
 * Capybaraはubuntu 12.04 サーバー上で動いている
 * CapybaraはPoltergeistをjavascript_driverに使っている
 * OS X上で実行時の状態をWeb インスペクタを使ってデバッグしたい
 * OS Xはmountain lion

# 準備

 * OS XにX11を入れる
   http://xquartz.macosforge.org/landing/
 * XQuartzを起動。環境設定 -> セキュリティで「ネットワーク・クライアントからの接続を許可」にチェックを入れる
 * XQuartzを再起動
 * X11アプリの「ターミナル」を起動し、下記のように入力し、外部X Serverからの入力を受付設定する

```
   $ xhost +
```

 * ubuntuサーバー上で、下記のように実行し、XをOS X側に飛ばすようにする

```
   $ export DISPLAY=192.168.1.23:0.0
```

 * ubuntuサーバーにchrominiumを入れる

```
   $ sudo apt-get install chromium-browser  
```

 * feature/support/env.rb にて下記のように、inspectorにchromium-browserを設定する

```
    Capybara::Poltergeist::Driver.new(app, :inspector => 'chromium-browser')
```

# 実行
 * テストプログラムで、下記のように呼び出すと、OS X上のX 11でubuntuのchrominiumが投影される
```
   page.driver.debug
```
 * 表示されるページの下のリンクをたどると、page.driver.debugが呼び出された時点のインスペクタが表示され、ここでいつも通りデバッグできる

OS Xであるとか、Ubuntuであるとか、そういうのは、特に関係なく、他のOS同士でも手順は違うと思うけど同等の環境は当然作れると思う。
PostgreSQLのチューニング事例


## 事前情報

m3.xlargeインスタンス

> 15GB メモリ
> 13 ECU = 3.25ECU(2.6GHz) * 仮想4コア


DBサイズ

> 3.38 GB


## 設定値

```/etc/postgresql/9.1/main/postgresql.conf
max_connections = 100
shared_buffers = 3GB # 実メモリの20%

# ここらへんのはとりあえずこのくらいで。小さすぎる分にはlog_temp_filesの設定で書き出されるので後で気づいて調整できる。
temp_buffers = 32MB
work_mem = 32MB
maintenance_work_mem = 128MB

wal_buffers = 16MB  # 迷いどころもなく16MB

checkpoint_segments = 16  # HDへのフラッシュ回数を減らす
effective_cache_size = 7GB  # planerのため。実メモリの半分ぐらいがいいらしい
```


```/etc/sysctl.conf
# 7GB max shared mamory
kernel.shmall=1835008
kernel.shmmax=7516192768
```

して`sudo sysctl -p`, `sudo /etc/init.d/postgresql restart`


メモ

- shared_buffersの経験則は実メモリの20%-30%、もしくは頻繁にアクセスするテーブルのデータが載る程度
- shared_bufferを50%以上にするとカーネルのキャッシュが溢れスワップする
- work_memの最大は`(実メモリ-shared_buffers)/max_connections`。そうでないと確実にスワップする
- work_memの経験は`実メモリ/max_connections/[4-16]`
- log_temp_filesの設定により、一時ファイルを使った場合Logに書き出すことが出来る
- wal_buffersは-1でshared_bufferの1/32になる。
 - 通常のWALセグメントの大きさである16MBを超えることはないため、大きすぎる場合は設定しなおしたほうが良い。

## ログ書き出しの設定

http://www.postgresql.jp/document/9.2/html/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHERE

```/etc/postgresql/9.1/main/postgresql.conf
#log_destination = 'stderr'
logging_collector = on
log_rotation_size = 1GB
#log_min_messages = warning
log_min_error_statement = warning  # log_min_messages似合わせる
log_line_prefix='[%t][%p][%c-%l][%x][%e]%q (%u, %d, %r, %a) ' #とりあえず全部の情報を出しておけば良いのではという発想 
log_min_duration_statement = 500  # 0.5秒以上かかった問い合わせを記録
log_temp_files = 1MB  # 1MB以上の一時ファイルを作ったらログに書き出す
```

## 残存プロセスの除去

AP側が落ちたり、APとのNWが断絶された際、APからの応答をずっと待ってしまうDB側のプロセスが残ってしまう。こうなるとConnection数がMaxに達したり、ロングトランザクション化したりする問題が起こる。タイムアウトを短めにしてこれを防ぐ。

```
tcp_keepalives_idle = 60  # keep alive パケット送出までの待機時間(デフォルト7200秒)
tcp_keepalives_interval = 5  # KeepAliveパケット送出に応答がなかった場合の再送間隔(デフォルト75秒)
tcp_keepalives_count = 6  # KeepAliveパケット送出回数の上限(デフォルト9)
```

この設定では1分半で残存プロセスを除去

## 参考: 
- http://www.mindcircus.jp/archives/2734
- http://itpro.nikkeibp.co.jp/article/COLUMN/20090703/333173/
- http://www.postgresql.jp/events/event_sozai/Summer_seminar2011_Operation_technique.pdf
gnuplot でヒストグラム（頻度分布図）を描画する

実は gnuplot だけで（しかもかなり簡単に）できます．filter の第二引数をいじれば，いくつごとにまとめるかが変わります．

```gnuplot
filter(x,y)=int(x/y)*y
plot "hoge.dat" u (filter($1,0.001)):(1) smooth frequency with boxes
```
Apache mod_spdy のインストール

## Apache mod_spdy のインストール

ここに書かれている通りで基本的には入ります。
https://code.google.com/p/mod-spdy/wiki/GettingStarted


Ubuntu でやるのが色々捗ると思います。


## 依存のインストール

Ubuntu の場合です。

```shell
$ sudo apt-get install subversion curl g++ apache2 patch binutils make devscripts
```


## depot_tools のインストール

Google の Chrome 周りの開発に使われているツール群です。
この中の gclient を使うのでインストールします。


http://dev.chromium.org/developers/how-tos/install-depot-tools


無くても、普通の svn コマンドで代用できると思いますが、
インストールと言っても git clone してパスを通すだけなので、
そんなに敷居は高くないと思います。


```shell
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
```


## コードの取得

mod_spdy のコードを取得します。
ここで gclient を使っています。


```shell
$ mkdir mod_spdy
$ cd mod_spdy
$ gclient config "http://mod-spdy.googlecode.com/svn/tags/current/src"
$ gclient sync --force
$ cd src
```


## mod_ssl の npn サポートビルド

SPDY では NPN が必要なので、それを有効にした mod_ssl をビルドします。
スクリプトが用意されているので、それを叩くだけです。
Open SSL をビルドしているので、少し時間がかかります。

```shell
$ ./build_modssl_with_npn.sh
```

## mod_ssl のインストール

ビルド結果の mod_ssl.so を配置して有効にします。

```shell
$ sudo cp mod_ssl.so /usr/lib/apache2/modules
$ sudo a2enmod ssl
```

## mod_ssl の証明書設定

証明書の作成と設定をします。
ここで行っているのはいわゆるオレオレ証明書なので、あくまでテスト用です。

```shell
$ sudo apt-get install ssl-cert
$ make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /tmp/selfsigned.crt
# host 名を入れます。テスト用途なら localhost で OK
$ sudo mkdir /etc/apache2/ssl
$ sudo mv /tmp/selfsigned.crt /etc/apache2/ssl
$ sudo emacs /etc/apache2/sites-available/default-ssl  # Any editor is fine here.
# 1. SSLCertificateFile の証明書のパスを作成したものに変更します。  SSLCertificateFile /etc/apache2/ssl/selfsigned.crt
# 2. 続く SSLCertificateKeyFile の行をコメントアウトします。
$ sudo a2ensite default-ssl
```

## mod_ssl の確認

リスタートします。エラーがでなければ最後に done と表示されます。

```shell
$ sudo /etc/init.d/apache2 restart
```


## restart でエラー

こんなのが出たら。

```shell
$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2
... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
```

/etc/apache2/httpd.conf に下記の一行を追加

```
ServerName localhost
```

restart に成功したら https://localhost にアクセスするとデフォルトページが表示されます。
大規模データを間引いて gnuplot で描画

# 純粋に間引いて表示

every X という風に書けば X 行ごとに表示してくれる．

```gnuplot
plot "hoge.dat" every 100 u 1:2 with lines
```

# 一定区間の平均をとって表示

以下のようにすると，x の値が 0.1 ごとにまとめられて平均をとってくれる．（filter の第二引数をいじればいくつごとにまとめるかが変えられる．）

```gnuplot
filter(x,y)=int(x/y)*y
plot "hoge.dat" u (filter($1,0.1)):2 with lines smooth unique
```

以下の Web ページを参考にさせてもらいました．

http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/average.html
Macでsetup.pyから拡張モジュールをコンパイルする時にgccを使う方法


C++のコードをswigを使ってbindingする際に、setup.pyを使ってshared objectを作る。
Mac OS Xでやろうとすると、ライブラリ自体はg++でコンパイルされているのに、Clangでコンパイルしようとしてエラーをはいてしまう。

こんな感じ。

```
$ python setup.py build_ext             
running build_ext
building '_Mykytea' extension
cc -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -I/usr/local/include -I/usr/local/opt/sqlite/include -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c mykytea_wrap.cxx -o build/temp.macosx-10.8-intel-2.7/mykytea_wrap.o
(略)
In file included from mykytea_wrap.cxx:3481:
In file included from ./mykytea.hpp:9:
/usr/local/include/kytea/kytea.h:128:24: error: implicit instantiation of undefined template
      'kytea::Dictionary<kytea::ModelTagEntry>'
        if(dict_ != 0) delete dict_;
                       ^
/usr/local/include/kytea/kytea.h:34:26: note: template is declared here
template <class T> class Dictionary;
                         ^
2 warnings and 1 error generated.
error: command 'cc' failed with exit status 1
```

で、呼んでもいないClangはほっといてgccでコンパイルするには、

```
 $ ARCHFLAGS="-arch x86_64" CC=gcc CXX=g++ python setup.py build_ext
```

とすればよい。

本当はsetup.pyに書く方法のが良いのかもしれないけど、オリジナルのライブラリが何でコンパイルされたかを、動的に判断するのってできるのかなぁ。

というわけで、めでたく[KyteaのPythonバインディング](https://github.com/chezou/Mykytea-python)が最新の0.4.4に対応しました。
第8回オフラインリアルタイムどう書くの参考問題の回答例。groovy で。


イベントページは http://atnd.org/events/36783 。
問題は http://nabetani.sakura.ne.jp/hena/ord8entco/ 。
解答リンク集は http://qiita.com/items/24b9be4ee3bae4c89a95 。

で。

最初の実装は ruby だったんだけど、ruby の解答はすでに出ているので groovy に移植した。

```groovy
MAP=[
 "0111":"a", "0101101":"c", "01010":"d", "10":"e", 
 "1101":"h", "0100":"i", "010111":"l", "0011":"n", 
 "0110":"o", "1100":"r", "0010":"s", "000":"t", 
 "111":false
]

def solve_core( bits, result ){
 MAP.collect{ 
  m=bits =~ /^${it.key}(.*)$/
  if ( m ){
   cap=m[0][1]
   used = result[1]+it.key.size()
   return it.value ? 
    solve_core( cap, [result[0]+it.value, used])
    : [ result[0], used]
  }
 }.find{it} ?: ["*invalid*"]
}

def solve( src ){
 solve_core( (0..<(src.length()*4)).collect{
  ch = src[ (int)( it / 4 ) ] /// シンタックスハイライトのバグ回避のためのコメント
  Integer.toString( 
   Integer.parseInt( ch, 16 )|32, 2 )[5-it%4]
 }.join(""), ["", 0 ] ).join(":")
}

def test( src, expected){
 actual = solve( src );
 result = actual==expected ? "ok" : "***NG***"
 println( "${src}->${actual} / ${expected} : ${ result }" )
}

/*0*/ test( "16d9d4fbd", "ethanol:30" )
/* 略 */
/*36*/ test( "6822dcb", "*invalid*" )
```

正規表現で評価済み部分とそれ以外の部分に分け、それ以外の部分を再評価。
ループよりも再帰の方が簡単にかけるので、スタックがあふれたら困るなぁと思いつつ、再帰。

solve の中にある怪しげな計算は、ビット順を逆にしているだけ。
32 と or を取って桁数不足を回避している。

solve_core 関数。
本当は Map.each の中で関数から return したいところなんだけど、ruby のブロックに相当するものがないので、苦し紛れに collect したものから find した。もっといい方法があるはず。改善案求む。

相変わらず、collect と書くべき所で何度も map とエラーを出した。なかなか慣れない。
rbenvでRuby 2.0.0-p0をMac OS Xに入れる


## 結論
shu_0115さんのこちらの記事で必要十分でした。
http://qiita.com/items/05a09296f3633cadac3f

```
$ brew update
$ brew upgrade ruby-build
$ brew install openssl curl-ca-bundle readline
$ cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem #証明書のコピー
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-p0 
```

これだけで良かったんだ。大事なのはbrewのupdateでしたね。

2013/03/10追記：よくよく見たら、irbで日本語入力できなかったので、readlineとopensslの場所を指定するコマンドを追加した

証明書のコピーについては以下を参照してください。
http://qiita.com/items/12457815d5cee3723b97

良かったよかった。これで、[Mykytea-ruby](https://github.com/chezou/Mykytea-ruby)の2.0.0での動作確認ができた。swig周りも問題無さそうですね。

## 以下過去の情報

参考にしたのはこちらの記事。ほとんど同じです。
[Ruby 2.0 on Debian with ruby-build, rbenv - 平衡点 -- equilibrium point --](http://uwabami.junkhub.org/log/20130226p01.html)


とりあえず、入れてない場合はHomebrewでrbenvとruby-buildを入れておく。

```bash:Terminal
$ brew install rbenv
$ brew install ruby-build
$ echo 'eval "$(rbenv init -)"' >> .bash_profile 
$ source ~/.bash_profile
$ rbenv rehash
```

ruby-buildのdefinitionを追加する。

```Terminal
$ echo 'install_package "ruby-2.0.0-p0" "http://ftp.ruby-lang.org/pub/ruby/ruby-2.0.0-p0.tar.gz" autoconf standard' > /usr/local/share/ruby-build/2.0.0-p0
```

できた！

```Terminal
$ rbenv global 2.0.0-p0
$ ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.1]
```

やってみてから気づいたのが、githubにはすでに2.0.0-p0のdefinitionが出ていたので、homebrewじゃなくてgitでcloneした人は悩まなくても良かったですね……。
https://github.com/sstephenson/ruby-build/blob/master/share/ruby-build/2.0.0-p0

で、これをそのまま使って入れなおしてみます。


さて、[高速になったrequire](http://jp.rubyist.net/magazine/?0041-Hotlinks)を体験するとするか

## 追記
gem installができてませんでした。あれれ。。。

```
$ gem install rpec
ERROR:  Loading command: install (LoadError)
	cannot load such file -- openssl
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass
```
GitHubで公開されているRubyMotionを使ってビルドする。


RubyMotionは一部がGitHubで公開されているので、それらを使ってビルドしてみます。

まずはリポジトリをclone。

```sh
cd ~
git clone git://github.com/HipByte/RubyMotion.git
```

続いてコンパイラなどが含まれたディレクトリをリンクします。

```sh
ln -s /Library/RubyMotion/bin ~/RubyMotion
ln -s /Library/RubyMotion/data ~/RubyMotion
```

続いてビルドしたいアプリの``Rakefile``の先頭を下記のように書き換えます。

```ruby:Rakefile
$:.unshift(ENV['RUBYMOTION_LIB'] || '/Library/RubyMotion/lib')
```

あとは``rake``する際、環境変数``RUBYMOTION_LIB``にGitHubから入手した先を指定すればOKです。

```sh
RUBYMOTION_LIB=~/RubyMotion/lib rake
```
EC2のPublicDNS/PrivateDNSのIPについて

NonVPC環境のEC2のPublicDNSとPrivateDNSは以下のようなIPと結びつく

|                  | 同一リージョン | 別リージョン(EC2以外のPC) |
|:---------|:---------------|:-----------|
| PublicDNS | PrivateIP | PublicIP |
| PrivateDNS | PrivateIP | 名前解決不可能 |

関連：[EC2セキュリティグループのSourceにセキュリティグループを指定した場合のアクセス確認 · mechamogera/MyTips Wiki](https://github.com/mechamogera/MyTips/wiki/EC2%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AESource%E3%81%AB%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E7%A2%BA%E8%AA%8D)

## 確認手順
 * Tokyoリージョンに1つ目のEC2を作る
 * Tokyoリージョンに2つ目のEC2を作る(1つ目とは別Zone)
  * PublicDNS：***.ap-southeast-1.compute.amazonaws.com
  * PrivateDNS：***.ap-southeast-1.compute.internal
  * Amazon Linux
 * SingaporeリージョンにEC2を作る
  * PublicDNS：***.ap-northeast-1.compute.amazonaws.com
  * PrivateDNS：***.ap-northeast-1.compute.internal
  * Amazon Linux
 * Tokyoリージョンの1つ目のEC2でPublicDNSのIPを確認する

```bash
$ host ***.ap-southeast-1.compute.amazonaws.com
***.ap-southeast-1.compute.amazonaws.com has address [PublicIP]
$ host **.ap-northeast-1.compute.amazonaws.com
***.ap-northeast-1.compute.amazonaws.com [PrivateIP]
```

 * TokyoリージョンのEC2でPrivateDNSのIPを確認する

```bash
$ host ***.ap-southeast-1.compute.internal
Host ***.ap-southeast-1.compute.internal not found: 3(NXDOMAIN)
$ host ***.ap-northeast-1.compute.internal
***.ap-northeast-1.compute.internal has address [PrivateIP]
```
CoffeeScript 1.5.0新機能 literateモードを試してみた

CoffeeScript 1.5.0でliterateモードなるものが追加されたらしい。

> 「.litcoffee」という拡張子のファイルに対して適用されるもので、literateモードでは行頭にインデントがある行のみがCoffeeScriptコードとして解釈され、それ以外の行はすべて無視される。これにより、ドキュメント内に埋め込まれたCoffeeScriptコードを簡単に実行できるようになる。もちろん、.literate形式のファイルをJavaScriptにコンパイルすることも可能だ。 

[SourceForge.JP Magazine](http://sourceforge.jp/magazine/13/02/26/0533246)より抜粋

というわけで下のようなmarkdownを作って試してみました。
使用感なんかも書いてあります。

```markdown:sample.litcoffee
# CoffeeScript 1.5.0 新機能 literateモード お試し

## インデントについて

* タブの場合は1個から、スペースの場合は4個目以降がコードとして扱われる模様。
* スペース2つでインデントする場合はリストのネストは1回までOK。
  * Markdownの正式ルールでは1インデントはタブ1つもしくはスペース4つぽいからこの方法は邪道かもしれない。
* タブの場合はリストのネストは不可。

---

## 実行されるコード・実行されないコード

    console.log 'これは実行される'

### クラスとか作ってみる

    class Hoge
      constructor: (@aaa) ->
      print: () => console.log @aaa

### 上で作ったクラスを使って処理

    fuga = new Hoge 'これも実行される'
    fuga.print()

> 引用内なら(先頭に`>`があるので)コードブロックも使える。
>
> ### 実行されないコード
>     console.log '実行されない'

### requireとかしてみる

    fs = require 'fs'

### 自分自身を読み込んでnode-markdownで展開する

    {Markdown} = require 'node-markdown'
    html = Markdown fs.readFileSync(process.argv[1], 'utf8')
    fs.writeFileSync process.argv[1].replace(/\.litcoffee$/i, '.html'), html, 'utf8'

---

## お試しで使ってみた感想

実行したコードをドキュメント内に展開するみたいなPHPチックな使い方はできない模様。  
(上で試した**自分自身をMarkdownで展開**とか利用してがんばれば埋め込めるかもしれないけど素直にテンプレートエンジンとか使った方がマシだと思う)

あくまでドキュメント部分はコード実行時には無視されるだけ、といった感じだと思う。

## 何に使えるの？

Markdown形式に則って(かつ、リストのネストなどしないように気をつけて).litcoffeeでコードを組むと1ファイルでドキュメントもソースも完成！みたいな・・・？  
小物ツール程度ならアリかもしれない。

## ちなみに

.litcoffeeをコンパイルするとドキュメント部分が消えた.jsが作成されました(そりゃそうか)。
```

このmarkdownをコピペしてsample.litcoffeeといったファイル名で保存して、

```sh
$ coffee sample.litcoffee
```

などとすると、sample.htmlが作成され、コンソールには以下の様に表示されます。
(node-markdownがインストールされている必要があります)

```sh
これは実行される
これも実行される
```

正直微妙な感はありますが、まあ「by -1」が結構うれしいのでそれで良しとします。

あとは、エラーが発生した時の行番号表示が.coffeeのものになってくれればと思うけど、まあ難しいだろうな・・・ (´･ω･`)
HtmlからHamlを作り、またHTMLにする


何を言っているのかわからないかもしれないタイトルでごめんなさい。

以前ならWikiとか今ならMarkdownとかreSTとかでしか物を書かなくなってきて、レジュメもなんでもMarkdownでいいじゃないかと思っていたのですが、思わぬ所で「生HTMLを書いて」と言われたので、必死に抗ってみました。

## Hamlって？
[HTML/XHTMLを生成するためのマークアップ言語](http://haml.ursm.jp/)、ということです。ちなみに、CSSにおいてはSassというマークアップ言語が親戚のようです。

タグ閉じたくないよね、面倒だよねという人にうってつけです。

```haml:input.haml
!!!
%html
  %head
    %title Haml haml haml!
  %body
    #header
      %h1 Haml!
    #content
      %p I love Haml
```

と書くと、

```input.html
<!DOCTYPE html>
<html>
  <head>
    <title>Haml haml haml!</title>
  </head>
  <body>
    <div id='header'>
      <h1>Haml!</h1>
    </div>
    <div id='content'>
      <p>I love Haml</p>
    </div>
  </body>
</html>
```

というHTMLに変換されます。

## 助けて！エディターさん！
Pythonよろしくインデントが肝なので、エディターに助けてもらいましょう。

Emacsの人はhaml-modeがあります。

http://emacswiki.org/emacs/HamlMode

Sublime text2のHamlモードはインデントが納得いかないです。なんかフラット。。。

Vimは全くわかりませんが、プラグインもあるみたいです。
https://github.com/tpope/vim-haml

## Haml→HTML変換
昔はRubyから`require 'haml'`とかやっていたのですが、今は

```
$ gem install haml
```

で大丈夫です。

```
$ haml input.haml
```

とかやればHTMLをはいてくれます。



## HTML→Haml変換
過去のHTMLをベースにしたいという人は、

```
$ gem install html2haml
```

でhtml2hamlを入れればOK。

```
$ html2haml input.html output.haml
```

で処理してくれます。便利な時代だ。

## 注意事項

html2haml→hamlで生成したHTMLは、元のHTMLと完全に一致しない場合があるので注意。

### 条件付きコメント

例えば、条件付きコメントとかは、hamlにはなってもhtmlに戻すときに多分死にます。特に間にIE用のスクリプトとかある場合に死にました。

```html:test.html
<!--[if IE 6]>
 some code for IE
<![endif]-->
```

一応[公式にはサポートしていることにはなっている](http://haml.info/docs/yardoc/file.REFERENCE.html#conditional_comments_)し、そうじゃなければ、[surround helper使え](http://stackoverflow.com/questions/9107681/ie-conditional-comments-in-haml)って話になっているみたいですが、ことごとく死にました。

結局Hamlに``:plain``記述を使ってそのまま生かすこと。。。ダサい。。。

```haml:zannen.haml
:plain
  <!--[if IE 6]>
   some code for IE
  <![endif]-->
```

### タグの要素をunescapeしたい場合

ごくまれに、

```html:
<div id="<!var!>">
```

みたいに、タグの要素をunescapeしなければならない場合があったとします。なんというか、実は別のPerlなテンプレートエンジンが次に走るとかいう場合とかあるんですよ。。

こういう場合も苦しみます。先人は、[先にRubyのパラメータ展開をすればいいじゃない。それか、Hamlやめれば？](http://stackoverflow.com/questions/3540310/rails-haml-how-to-unescape-tag-parameter)とボコボコに言われています。

そうは言っても、生HTML書きたくないし、、、というわけで、結局また``:plain``先生にお世話になりましたとさ。

## まとめ
Haml便利！と言いたかったのですが、Markdownの方がHTMLと混在にできて楽だよね、ということに気づきました。

Hamlの最大の弱点は、グーグル先生が自動的に"html"というクエリに修正してくれるところです。困ったら、"haml"とクエリをクォートしましょう。

KobitoみたいなリアルタイムでプレビューできるHaml,Sass,Markdownエディターが欲しい今日このごろであります。
[pear] install / upgrade 時に Fatal error: Allowed memory size of ～となる場合

ちょっとはまったのでメモ。

pear install時に
  (ex. pear install --alldeps pear.phpqatools.org/phpqatools pear.netpirates.net/phpDox)

```php:message
PHP Fatal error:  Allowed memory size of 16777216 bytes exhausted 以下略
```

となりpearのインストールに失敗する。


phpの設定で、割り当て可能なメモリサイズを増やしてやればいいのだけど、
pearにバグがあるらしく(裏をとってません) pearcmd.phpに直接

```php:pearcmd.php
@ini_set('memory_limit', '32M'); 
```

を追記してあげる必要があります。
memory_limitサイズは必要に応じて書き換えてね。


pearcmd.phpの在処はyumでinstallした場合はこの辺です。






```php:/Path/to/pearcmd.php
/usr/share/pear/pearcmd.php
```


　
　
　
---
なお、上記の前に試した内容はこんな感じ。
いずれの場合もpear install時に 

```php:message
PHP Fatal error:  Allowed memory size of 16777216 bytes exhausted 以下略
```

となりました。

・php.iniのmemory_limit変更
　　　CLI用のiniなので、php -i | grep ini で場所を確認してね。
　
・pearのphp_iniに上記memory_limitを変更したiniファイルを指定
　　　pear config-show or pear config-get php_ini で確認し、
　　　pear config-set php_ini /path/to/php.ini で設定します。
メモリを増やしてもeclipseが落ちる原因

これは私の場合でしたが、複数のJavaがインストールされていることが原因でした。
干渉していたのだと思います。
一度全部のJavaをアンインストールしてから最新のJavaをインストールすると落ちることがなくなりました。
もしeclipseが頻繁に落ちてしまうようであれば、Javaのインストール状況を確認してみてください。
日付オブジェクトの生成には Time.local を使おう

日付のオブジェクトを生成する場合、`Time.parse` はとても遅いので `Time.local` を使うようにしましょう。

```ruby
n = 100000
Benchmark.bm(20) do |x|
x.report("Time.parse") { n.times { Time.parse("2012-12-01") } }
x.report("Time.local") { n.times { Time.local(2012, 12, 1) } }
end 

#=>
user     system      total        real
Time.parse            6.630000   0.020000   6.650000 (  6.653874)
Time.local            0.270000   0.010000   0.280000 (  0.270010)
```
google_match_patchの使い方（javascript編）


#説明
javascript を用いて画面遷移なしにテキストデータの diff を表示させることができます。

# 手順
1.　ヘッダーでjsファイルを読み込みます
2. diff_match_pach オブジェクトを作成します
3. オブジェクトに diff_main() 関数を用いて diff を取得します
4. 得られた diff に diff_prettyHtml() 関数を用いて diff のhtml 出力を得ます。

## ダウンロード
http://code.google.com/p/google-diff-match-patch/downloads/list

## ドキュメンテーション
http://code.google.com/p/google-diff-match-patch/wiki/API

入力（新旧データ）はテキストエリア部で、結果は div 部で出力することにしました。
結果には result という id を割りふっています。
diff の表示は、ボタンがクリックされたタイミングで行われるようにします。
ボタンには diff という id を割りふりました。

```html
<textarea id="old_data"></textarea>
<textarea id="new_data"></textarea>
<div id="result"></div>
<button id="diff">diffを取得する</button>

```

デザイン的な理由により、CSSでdiffの結果を出力するdivを非表示にしておきます。
上記の4つのタグのうち、ロードしたときに見えているのは textarea と button です。

```css
#result {
	display: none;
}
```


```javascript
// jqueryを使っています
// diff_match_patch.jsも読み込んでおきましょう
	$(function(){
		$('#diff').click(function(){
			var a = $('#old_data').val()
			var b = $('#new_data').val()
			var dim = new diff_match_patch()
			var diff = dim.diff_main(a,b)
			var pretty = dim.diff_prettyHtml(diff)
			$('#result').html(pretty).hide().fadeIn(800)
		})
	});
```
Listの末尾にListを追加する

C#でRubyの[Array#+](http://miyamae.github.com/rubydoc-ja/1.9.3/#!/method/-array/i/=2b.html)  に相当するやつは何かと思って調べた。

[List(T).AddRange メソッド (System.Collections.Generic)](http://msdn.microsoft.com/ja-jp/library/z883w3dc.aspx) だそうな。

```csharp:addrange.cs
var list = new List<int>(){1, 2, 3};
var l2 = new List<int>(){4, 5};
list.AddRange(l2);
Console.WriteLine("[" + String.Join(", ", from v in list select v) + "]");
```

実行結果

```
[1, 2, 3, 4, 5]
```

## 関連記事
* [C#でRubyっぽいデバッグ表示(List編)](http://qiita.com/items/5c67c6a9766712851fcc)
Mozilla発の新言語Rustの概要

Rust([http://www.rust-lang.org/](http://www.rust-lang.org/))というMozillaが開発している言語に興味を持っている。マルチコアを生かす次世代のブラウザエンジンであるServoの開発に使われている。

* 実行速度重視の、静的型付けのマルチパラダイム言語。
* Actorモデルに基づいた並列計算。
* Haskellの型クラスのようなオープンなtrait（Javaのインターフェイスのようなものだが、型を定義した後にtraitを外から足せる）に基づく簡潔なOOP。
* バイナリ（構造体のメモリ配置、関数の呼び出し）がC互換。OOPも構造体のデータ定義とメソッドを定義が分離した形になっている。
* 安全性を保ちつつ、パフォーマンスを落とさないポインタ操作。ポインタに&@~と異なる修飾子をつけることで扱いが変わり、グローバルなGCに頼らず静的にヒープオブジェクトの寿命チェックができる（ここのところはちょっと難しいのでまだ勉強中）。
* 関数型言語の機能（クロージャ、代数的データ型とパターンマッチ）を持つ。

まだバージョンが0.5なので仕様も相当変わることが予想される。そのせいもあってか、まだドキュメントがあまり十分でない。公式のTutorialもあまり出来が良くないのだが、ライブラリのソースコードを読んだりすれば理解が深まりそう。

とりあえず、前にCで書いたプログラムをRustで書き換えてみたたが、実行速度はかなり速かった。
~~https://gist.github.com/nebuta/4975736~~
**注釈：このコードはRust 0.5で書かれたもので、最新のバージョン（1.3）では全く動かない**

ロジックを微妙に変えたので単純比較はできないが、Cの物よりも速かった。あとはより関数型っぽく抽象化を進めたときにどのくらい速さが保たれるか、が気になる所。
gitで打ち間違えた時にも自動で正しいコマンドを予測し実行する

gitで早くコマンドを打っていると、`git status`と間違えて

```sh:
$ git statsu
git: 'statsu' is not a git command. See 'git --help'.
Did you mean this?
	status
```
のように `git statsu`と入力してしまい、打ち直さなければいけなく、めんどくさいなあと皆さん思っていませんか？

そんなときには`help.autocorrect`をonにするだけで`statsu`や`sttaus`のような微妙に間違ったコマンドを、`status`とちゃんと解釈してくれます。
これのおかげで僕のgit力は1.5倍ぐらいになったので、みなさんも是非使って開発速度を少しでも高めましょう。

```sh: 
$ git config --global help.autocorrect 1
```
accepts_nested_attributes_forの更新処理をカスタマイズする

`accepts_nested_attributes_for` を使って1つのフォームで複数のテーブルを同時に更新している場合、子となるモデル側の更新処理をカスタマイズしたいケースがあります。
例えば画像を投稿するフォームで永続化しないパラメータとして `photo` のような属性を定義している場合、「画像のみを変更する場合」は `AR::Base#changed?`が true にならず、`before_save`などのコールバックを含め更新処理が一切走らず困ったことになります。

### Bad Case

```ruby
class FavoriteIdol < ActiveRecord::Base
  attr_accessor :photo

  before_save :save_photo

  private

  def save_photo
    if photo
      self.photo_saved_at = Time.now
      upload_photo(photo)
    end
  end
end
```


## Solution
`accepts_nested_attributes_for :relation` を呼びだした際に定義される `relation_attributes=` というメソッドをオーバーライドします。
引数にはポストされたparamsの配列が格納されています。この配列を使い、関連オブジェクトの値を書き換える事で任意の更新処理を実装することができます。

### 例

```ruby
class User < ActiveRecord::Base  
  accepts_nested_attributes_for :favorite_idols
  
  has_many :favorite_idols

  def favorite_idols_attributes=(listed_attributes)
    listed_attributes.each do |index, attributes|
      idol = favorite_idols.detect{|i| i.id == attributes["id"].to_i } || favorite_idols.build
      idol.assign_attributes(attributes)
      idol.photo_saved_at = Time.now if idol.photo.present?
    end
  end
end
```
レスポンシブWebデザインのためのMediaQueriesの閾値


参考にさせてもらっているフレームワークなどの設定をピックアップ

## Twitter Bootstrap v3.0

```css
/* Extra small devices: Phones (<768px) */
@media (max-width: 767px) {}

/* Small devices: Tablets (≥768px) */
@media (min-width: 768px) and (max-width: 991px) {}

/* Medium devices: Desktops (≥992px) */
@media (min-width: 992px) and (max-width: 1199px) {}

/* Large devices: Desktops (≥1200px) */
@media (min-width: 1200px) {}
```

## Twitter Bootstrap v2.3

```css
/* Large desktop */
@media (min-width: 1200px) { ... }
 
/* Portrait tablet to landscape and desktop */
@media (min-width: 768px) and (max-width: 979px) { ... }
 
/* Landscape phone to portrait tablet */
@media (max-width: 767px) { ... }
 
/* Landscape phones and down */
@media (max-width: 480px) { ... }
```

## jQuery Mobile v1.3

```css
/* Odd iPad positioning issue. */
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) { ... }

/* Show priority 1 at 320px (20em x 16px) */
@media screen and (min-width: 20em) { ... }

/* Show priority 2 at 480px (30em x 16px) */
@media screen and (min-width: 30em) { ... }

/* Show priority 3 at 640px (40em x 16px) */
@media screen and (min-width: 40em) { ... }

/* Show priority 4 at 800px (50em x 16px) */
@media screen and (min-width: 50em) { ... }

/* Show priority 5 at 960px (60em x 16px) */
@media screen and (min-width: 60em) { ... }

/* Show priority 6 at 1,120px (70em x 16px) */
@media screen and (min-width: 70em) { ... }
```

## WordPress Tewnty Twelve Theme

```css
/* Large desktop */
@media screen and (min-width: 960px) { ... }
/* tablet and desktop */
@media screen and (min-width: 600px) { ... }
```

## WordPress Tewnty Eleven Theme

```css
/* tablet */
@media (max-width: 800px) { ... }
/* smaller devices */
@media (max-width: 650px) { ... }
/* phones */
@media only screen and (min-device-width: 320px) and (max-device-width: 480px) { ... }
```
UITextViewに暗黙的に入っているpadding

UITextViewにはデフォルトでpaddingが入っていて、場合によっては邪魔。
これを setContentInset: で調整できるが、UIEdgeInsetsZero状態(全部ゼロ)が初期状態=padding入った状態なので、負数を設定する必要がある。
なおかつ、上部insetの長さは使用フォントに影響されるので、都度調べるしかない。
[UITextViewの行間を変えるとか隙間を消すとか - 猫も茶を飲む](http://d.hatena.ne.jp/chaoruko/20120627/1340808359)
[Removing padding from UITextView - foobarpig.com](http://foobarpig.com/iphone/get-rid-of-uitextview-padding.html)

機械的にinset値を調べる方法ってありますか？
(必要性、興味、元気がないので私は調べません。)
FaceDetect をWindows 64bit 環境でコンパイル

Matlabで顔検出する際，しばしばFaceDetect(http://www.mathworks.com/matlabcentral/fileexchange/19912) を利用する機会があるかと思われますが，そのままだとWindows 64bit環境でmexコンパイルできずつらい感じになります（先のリンクのコメント欄が阿鼻叫喚になってることからもわかるかと思います）

この原因は至極単純で，同梱されているcv.lib, cvhaartraining.lib, cxcore.libが32bit版だから，ということになります．

以下のように修正することで，Windows 64bit環境でもコンパイルができるようになります．

1. 64bit版ライブラリをビルド
http://wtpage.info/program/opencv.html
ここが非常に詳しいです．

2. できあがったcv_64.lib, cxcore_64.lib, cvhaartraining_64.libをFaceDetect/lib/内に，cv100_64.dll, cxcore100_64.dllをFaceDetect/bin/に置く．

3. FaceDetect.cpp内部を以下のように修正．

```cpp
#include "cv.h" 

#pragma comment(lib, "../lib/cv_64")
#pragma comment(lib, "../lib/cxcore_64")
#pragma comment(lib, "../lib/cvhaartraining_64")

...
```

4. srcディレクトリに移動し，コンパイル

```
>> mex FaceDetect.cpp -I../Include/ -outdir ../bin/

```

以上です．