OmniAICreator/Qiita-1.07M huggingface dataset:
jQuery 1.9以降で「has no method 'live'」と出たら、 $(document).onを使う

動的に生成された要素にイベントを割り当てられる「.live」メソッドは、jQuery 1.9からなくなったようです。代わりに使うのが「$(document).on」というメソッド。セレクターは第2パラメーターに指定します。

```js
$('p').live('click', function() {
...
});
```

↓

```js
$(document).on('click', 'p', function() {
...
});
```
Phalcon\Mvc\Collection が参照するDIのservice

DIにmongoってserviceを登録してやれば、Phalcon\Mvc\Collectionはデフォルトでそのコネクションを使いにいくよ。
これ豆な。

参考：Setting a Connection
https://phalcon-php-framework-documentation.readthedocs.org/en/latest/reference/odm.html?highlight=mongo#setting-a-connection


以上、調べもの中のメモでした。
Ember.js公式ガイドを日本語に訳してみたよ！

# Ember.js公式ガイドの日本語訳を公開しました。

正式版がリリースされ、いよいよ注目度も上がってきたMVCフレームワーク「Ember.js」ですが、公式サイトにある[ガイド](http://emberjs.com/guides/)を日本語に訳したものをGithubに公開しました（もちろん、本家から認可済みです）。

[https://github.com/emadurandal/emberjs-guides-japanese-translation](https://github.com/emadurandal/emberjs-guides-japanese-translation)

すでにほぼ全てのページの翻訳が終わっているのですが、一部の記述を1.0ベースの内容に書き換えたり、Markdown形式に書き直す作業が残っている関係で、まだ一部のページしかリポジトリにアップできていません。

できるだけ早く、全てのページを載せられるようにするつもりですので、皆様しばしお待ちください。

こうして日本語のドキュメントもあることだし、皆さん、Ember.jsはもう怖く（？）ありませんよ！



（この日本語訳をきっかけに、Ember.jsコミュニティでは本格的に各言語へのトランスレーション・プロジェクトを立ち上げようという機運が起きつつあるようです。ますます広がるEmber.js……！）
【失敗】Stack Overflow のクローン、shapado をCentOS6.4にインストールする方法

Stack Overflow風の質問&情報構築サイトを作りたかったのでどんなのがあるのか調べてみたら、メチャクチャいっぱいあって圧倒される。とりあえずrailsで動いてて開発もアクティブな shapado を使うことに決めた。

まあでも結構めんどくさそうなのでここにメモを残しながら作業します。

※あきらめました。 次はAskbotを試してみます。
https://github.com/ASKBOT/askbot-devel

## インストール

ホームフォルダの下にgit clone してくる。いつも忘れるんだけど、初めに `shapado/`　とかディレクトリを作っておく必要はなくて、例えばこの場合だとホームディレクトリ直下で `git clone` すれば `~/shapado/` のディレクトリは自動的に作られる。

```shell-session
$ cd
$ git clone git://gitorious.org/shapado/shapado.git
$ cd shapado
```

DBにmongodbを使ってるので yum で入れる。

```shell-session
$ sudo vi /etc/yum.repos.d/mongodb.repo
```

まずはリポジトリをetc/追加。ちなみにこれは64bitのものなので32bitを使ってる人は最後の【参考】をみてください。

```/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

ついでにアップデートしてからインストール

```shell-session
$ sudo yum update
$ sudo yum install mongo-10gen-server mongo-10gen
```

mongod サービスを立ち上げてから動作を確認

```shell-session
$ sudo service mongod start

$ mongo
MongoDB shell version: 2.4.6
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
> db.foo.save({a:1})
> db.foo.find()
{ "_id" : ObjectId("522b3b4758daa254ed13e4b0"), "a" : 1 }
> exit
bye
```

mongodb のドライバーをインストール。
(ここでいうドライバーはMongo DBをRailsで使えるようにするってことか？)

```shell-session
$ gem install mongo
$ bundle install
```

でここで`Could not find twitter-1.7.2 in any of the sources` と赤文字で怒られるので、妙に古いtwitterのgemをコメントアウト

```ruby:Gemfile
  #gem 'twitter', '1.7.2'
```

再び `bundle install` したら

> Gem::InstallError: ZenTest requires RubyGems version ~> 1.8. Try 'gem
> update --system' to update RubyGems itself. An error occurred while
> installing ZenTest (4.7.0), and Bundler cannot continue. Make sure
> that `gem install ZenTest -v '4.7.0'` succeeds before bundling.

と出てきて、何でもgemのバージョンが1.8以上で2.0より小さいものじゃないとダメだといってるらしいけど `gem update --system` gemのバージョンは2.0.7だし、エラー修正方法を探しているうちにやる気が失せてきて別のStack Overflowクローンを使うことに決めました。

今考えてるのは 

## 参考
Installing Shapado Dependencies | Serdar Yildirim - blog 
http://serdaryildirim.net/ruby-on-rails/installing-shapado-dependencies.html

Stack Overflow clones - Meta Stack Overflow
http://meta.stackoverflow.com/questions/2267/stack-overflow-clones

CentOS5.5にMongoDBをyumでインストールしてみる - bose999の試験管の中の話
http://d.hatena.ne.jp/bose999/20101104/1288806847

Install MongoDB on Red Hat Enterprise, CentOS, or Fedora Linux
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/

I keep on getting "Could not find twitter-1.7.2 in any of the sources" when installing... - Shapado: Q&Aコミュニティ
http://shapado.com/questions/i-keep-on-getting-could-not-find-twitter-1-7-2-in-any-of-the-sources-when-installing
Nokogiri 1.6.0 のインストールが遅い件とその解決方法

Nokogiri 1.6.0 のインストールは、そのひとつ前の 1.5.10 と比較してとても遅い。これは、 1.6.0 では libxml2 および libxslt を同梱し、環境に合わせてビルドするようになったからだ。

gem install nokogiri したときにライブラリ不足で止まってしまうのはストレスフルだったので、これは人によっては嬉しい変更なんだろう。
ただ問題は、 libxml2 や libxslt がシステムに入っている場合でも、これらのビルドが行われることだ。
gem update するだけなら気にならないが、 bundle install にて nokogiri を利用するような環境の場合、繰り返しライブラリをビルドされるとさすがに時間がもったいない。

こういったケースでは、 `NOKOGIRI_USE_SYSTEM_LIBRARIES` 環境変数を設定しよう。この環境変数があれば、依存ライブラリのビルドは行われなくなる。これは Gemfile で設定してしまうと都合がいい。

```ruby:Gemfile
source 'https://rubygems.org'

ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] = 'YES'
gem 'nokogiri', '1.6.0'
```

なお、この問題は Linux や MacOS 上で起こる問題。
Windows 環境では Nokogiri 1.6.0 バイナリパッケージが準備されているのでこの問題にはぶち当たらない、ぶち当たらないと思う、ぶち当たらないんじゃないかな。
Unicode Han Databaseを使って簡体字を繁体字に切り替える

Qiitaを使うのは初めてなので、まずは気軽なネタを書こうと思う。

Wikipediaの中文（中国語）のページでは、[繁体字](https://ja.wikipedia.org/wiki/%E7%B9%81%E4%BD%93%E5%AD%97)と[簡体字](https://ja.wikipedia.org/wiki/%E7%B0%A1%E4%BD%93%E5%AD%97)を切り替えることが出来る。簡体字は主に中華人民共和国(Mainland China)で使われている文字で、繁体字は主に台湾や香港で使われている。簡体字と繁体字は等価交換できる。今回はそのコードを動かしてみよう。

簡体字の文字と繁体字の文字は、どちらもUnicode Character Database (UCD)に別々の文字として定義されている。「同じ文字」として同一のコードポイントが割り当てられているというようなことはない。Unicodeで定義されている膨大な漢字の情報は、Unicode仕様の一部として、[Unicode Han Database (unihan)](http://www.unicode.org/reports/tr38/)と呼ばれるデータベース上に定義されている。これはUnicodeコンソーシアムで行われた[Han Unification](https://en.wikipedia.org/wiki/Unihan)という活動の成果だ。unihanデーターベースは、zipファイルで5〜6MB近くある、それなりに大きいファイルだ。

このunihanデータベースでは、それぞれの文字について「フィールド」を定義している。フィールドの定義は[UTR #38](http://www.unicode.org/reports/tr38/)という文書にまとめられているが、その中にkTraditionalVariantとkSimplifiedVariantというものが定義されていて、これらには、その文字に対応する繁体字・簡体字の代替が規定されている。この情報は、unihanデータベースの中では、Unihan_Variants.txtというファイルで定義されている。例えば、U+343D (㐽) については、次のように定義されている。

U+343D	kTraditionalVariant	U+5051

'㐽'に対応する繁体字は'偑'ということになるわけだ。もちろん、これに対応する定義がU+5051にもある。

U+5051	kSimplifiedVariant	U+343D

というわけで、マッピングの情報をどうすればいいのかはわかった。ではコードにしてみよう。このUnihan_Variants.txtを読んで、簡体字-繁体字の2文字を繋げた文字列を作る。中にはUnicode BMP範囲外の文字もあるので、その場合はサロゲートペアを出力するようにする。

		static string GenerateTraditionalVariantsMap (string unihanVariantsFile)
		{
			StringBuilder sb = new StringBuilder ();
			int n = 0;
			foreach (var line in File.ReadAllLines (unihanVariantsFile)) {
				var ents = line.Split (null);
				if (ents.Length < 3 || ents [1] != "kTraditionalVariant")
					continue;
				AppendHexAsChar (sb, ents [0]);
				AppendHexAsChar (sb, ents [2]);
				if (++n % 16 == 0)
					sb.Append ('\n');
			}
			return sb.ToString ();
		}

		static void AppendHexAsChar (StringBuilder sb, string s)
		{
			int x = int.Parse (s.Substring (2), NumberStyles.HexNumber);
			if (x < 0x10000)
				sb.Append ((char) x);
			else
				sb.Append ((char) ((x - 0x10000) / 0x400 + 0xD800)).Append ((char) ((x - 0x10000) % 0x400 + 0xDC00));
		}

マッピングを読んで文字列から変換するコードは書いていないので今回はとりあえずここまで…じゃいくらなんでもアレなので一応。20万文字くらいあるstringからIndexOf()を呼んでいるので大変効率が悪いからKeyValuePairの配列を作ってArray.BinarySearch<T>を呼んだほうがいいと思う。

		static string ConvertToTraditional (string variantsFile, string textFile)
		{
			var sb = new StringBuilder ();
			var db = GenerateTraditionalVariantsMap (variantsFile);
			Console.WriteLine ("Database size: " + db.Length);
			char hs = '\0';
			int c = 0;
			foreach (var ch in File.ReadAllText (textFile)) {
				if (char.IsSurrogate (ch)) {
					if (hs == '\0')
						hs = ch;
					else {
						int l = 0;
						do {
							l = db.IndexOf (hs, l, db.Length - l);
							if (l < db.Length - 3 && db [l + 1] == ch) {
								sb.Append (db [l + 2]).Append (db [l + 3]);
								break;
							}
						} while (true);
						if (l < 0)
							sb.Append (hs).Append (ch);
					}
				}
				else {
					c = db.IndexOf (ch);
					sb.Append (c < 0 || c % 2 != 0 ? (char) ch : db [c + 1]);
				}
			}
			return sb.ToString ();	
		}
map をベースとした type の拡張 #golangjp

やりたいのは、 net/http の http.Header を拡張してメソッドを足したかった。
ちなみに http.Header は以下の定義になっている。

```go
var http.Header map[string][]string
```

## type の再定義

こんな感じにメソッドを追加したい。

```go
package main

import (
	"fmt"
	"net/http"
)

// MyHeader 型を定義
type MyHeader http.Header

// X- を付けるメソッドを付ける
func (mh MyHeader) AddWithPrefix(name, value string) {
	name = "X-" + name
	mh.Add(name, value) // can't call http.Header#Add
}

func main() {
	mh := MyHeader{}
	name, value := "Hello", "World"
	mh.AddWithPrefix(name, value)
}
```

これだと、以下のエラーが出る。

```
mh.Add undefined (type MyHeader has no field or method Add)
```

http://golang.org/ref/spec#Type_declarations によると

```
The declared type does not inherit any methods bound to the existing type, but the method set of an interface type or of elements of a composite type remains unchanged:
```

ということで、 http.Header#Add() が無い。どうするか。


## Cast してしまう

メソッドの中で、もとの型にキャストしてしまうと、一応呼べる。

```go
func (mh MyHeader) AddWithPrefix(name, value string) {
	name = "X-" + name
	http.Header(mh).Add(name, value) // can't call http.Header#Add
}
```

しかし、これだと MyHeader に対して http.Header のメソッドを呼ぶのに、
毎回キャストが必要。

## mixin

型を定義して mixin(?) する。

```go
// struct に mixin する。
type MyHeader struct {
	http.Header
}

// そこにメソッドを加える
func (mh MyHeader) AddWithPrefix(name, value string) {
	name = "X-" + name
	mh.Add(name, value)
}

func main() {
	mh := MyHeader{http.Header{}}
	name, value := "Hello", "World"
	mh.AddWithPrefix(name, value)
	fmt.Println(mh)
}
```

これで呼べる。


## range

ってところまではわかってたんだけど、問題は 2 つめの方法は
range が呼べないと思っていた。

つまり、 http.Header でできた以下ができない。

```go
for name, value := range mh {
	fmt.Println(name, value) // cannot range over mh (type MyHeader)
}
```

これができないと、 http.Header 使ってた部分を書き換えられないなと思っていた。

しかし、 http://golang.org/ref/spec#Struct_types に書かれているように
"Promoted fields act like ordinary fields of a struct"
なので、実は以下のようにすると range できる。

```go
for name, value := range mh.Header {
	fmt.Println(name, value)
}
```
vagrant で共有フォルダのマウントに失敗するときの対処


＝＝症状＝＝

Vagrantの仮想マシンの起動時に、仮想マシンとホストOSの共有フォルダのマウントに失敗してしまう。

$ vagrant up
:
[default] Mounting shared folders...
[default] -- /vagrant
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` /vagrant /vagrant
$


＝＝使用環境＝＝

Vagrant version ：　1.2.4
ホストOS　：　matchbook 13-inch, Late 2009
オラクルVirtualBox　：　4.2.16
使用したVagrant BOX　：　http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box

＝＝原因＝＝

起動メッセージにはこうでてる
　：
Guest Additions Version: 4.1.18
VirtualBox Version: 4.2
　：
このバージョンの不一致が問題らしい。Guest Additionsのバージョンが古い。

＝＝対処方法＝＝

オラクルVirtualBox のバージョンにGuest Additionsを合わせバージョンアップする。

＝＝実行手順＝＝

$ vagrant ssh 
[vagrant@localhost ~]$ whoami
vagrant

対応するバージョン4.2のisoイメージをダウンロードする
[vagrant@localhost ~]$ wget -c http://download.virtualbox.org/virtualbox/4.2.0/VBoxGuestAdditions_4.2.0.iso
：
[vagrant@localhost ~]$ ls
VBoxGuestAdditions_4.2.0.iso  postinstall.sh

isoイメージをCDドライブにマウントしインストーラーを実行
[vagrant@localhost ~]$ sudo mount VBoxGuestAdditions_4.2.0.iso -o loop /mnt
[vagrant@localhost ~]$ sudo sh /mnt/VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 4.2.0 Guest Additions for Linux..........
VirtualBox Guest Additions installer
Removing installed version 4.1.18 of VirtualBox Guest Additions...
Removing existing VirtualBox DKMS kernel modules           [  OK  ]
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]
Installing the Window System drivers                       [失敗]
(Could not find the X.Org or XFree86 Window System.)

Xserver関係をインストールしてないのでエラーは出るがこれでOKでした。あとはVagrantを再起動。

[vagrant@localhost ~]$exit
$ vagrant reload

＝＝確認＝＝

再び、vagrant ssh接続し、Vagrant内の/vagrantディレクトリがホスト側のVagrantディレクトリと共有している事を確認する

$ vagrant ssh
[vagrant@localhost ~]$ cd /vagrant
[vagrant@localhost vagrant]$ touch test.txt
[vagrant@localhost vagrant]$ exit
$ ls -l
-rw-r--r--  1 hogehoge  staff    test.txt
$

Guest Additionsをアップデートするプラグインがあるけども、トラブルシューティング中に知らないプラグインのイストールしたくなかったのと、使用するisoイメージは自分で選択したかったので、あえて自分で手動でアップデートする方法を選択。

ここらの管理方法はVmwareと良く似てる。
Go でプロファイリングして PDF で見る

プロファイルも標準だけでできる。

```go
import (
        "os"
        "flag"
        "fmt"
        "runtime/pprof"
)
```

```go
// main() の前にこれを 書く
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
 
func main() {
    // main() の頭にこれを書く
    flag.Parse()
    if *cpuprofile != "" {
        f, err := os.Create(*cpuprofile)
        if err != nil {
            fmt.Println("Error: ", err)
        }
        pprof.StartCPUProfile(f)
        defer pprof.StopCPUProfile()
    }
 
       // ... your main code here ...
 
}
```

main() はプロファイルを取るに十分なだけの時間処理を回す(for とか)。

その main をビルドしておく

```shell-session
$ go build main.go
```

プロファイルを取って、 PDF で出す。
ps2pdf と dot コマンドが必要。

```shell-session
$ brew update
$ brew install gts
$ brew install graphviz
$ brew install ghostscript
```

```shell-session
$ go tool pprof --pdf main cpu.pprof > callgraph.pdf
```

見方は、なんとなくしかわかってない。
CakePHPのValidationのエラー情報を取得


いつも忘れるのでメモ

Validationのエラーは`$model->validationErrors`に入っている
http://api.cakephp.org/2.4/class-Model.html#$validationErrors

```php
<?php

class UsersController extends AppController {
	public function add() {
		if ($this->request->is('post')) {
			$this->User->create();
			if ($this->User->save($this->request->data)) {
				$msg = __('The user has been saved.' );
				$this->Session->setFlash($msg);
				$this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('The user data could not be saved. Please, try again.'));

				// validationエラーをログに残す
				$this->log("validationErrors=" . var_export($this->User->validationErrors, true));
			}
		}
	}
}

```
第13回オフラインリアルタイムどう書くの参考問題。慣れない java による実装。


オフラインリアルタイムどう書く

第13回(9月6日) http://atnd.org/events/41603
第14回(9月28日) http://atnd.org/events/43076
の、参考問題「増やす減らす二倍する」
http://nabetani.sakura.ne.jp/hena/ord13updowndouble/
の実装例。

慣れない java で。

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

で。

```java
import java.util.Set;
import java.util.HashSet;
import java.util.Deque;
import java.util.ArrayDeque;

class Pair
{
  public final int value;
  public final int depth;
  Pair ( int v, int d ){
    this.value = v;
    this.depth = d;
  }
}
public class Ord13r
{
  static int solveImpl( int v )
  {
    Set<Integer> set = new HashSet<>();
    Deque<Pair> deque = new ArrayDeque<>();
    deque.addLast( new Pair( 0, 0 ) );
    for(;;){
      Pair c = deque.removeLast();
      for( int nv : new int[]{ c.value+1, c.value-1, c.value*2 } ){
        if ( nv==v ){
          return c.depth+1;
        }
        if ( nv<=0 || set.contains( nv ) ){
          continue;
        }
        set.add( nv );
        deque.addFirst( new Pair( nv, c.depth+1 ) );
      }
    }
  }
  static String solve( String src )
  {
    int value = Integer.valueOf( src );
    return Integer.toString( solveImpl( value ) );
  }
  static void test( String src, String expected )
  {
    String actual = solve( src );
    boolean ok = actual.equals( expected );
    System.out.printf( "%s %s -> %s ( %s )\n", ok ? "ok" : "***NG***", src, actual, expected );
  }
  public static void main( String[] args ){
/*0*/ test( "59", "9" );    
/*1*/ test( "10", "5" );    
/*58*/ test( "174763", "27" );
  }
}
```

順当な幅優先探索のつもり。
Deque じゃなくて Queue がよかったのかもしれないけど、C++ 脳 なので Deque で。

static 関数しかないという辺りが Java 文化圏からは酷評されそうな気がするけど、よくわからない。
`for( int nv : new int[]{ 略 } ){略}`
がJava文化圏でどう思われるのかにちょっと興味があったり。

動作確認は

* javac 1.7.0_07
* java version "1.7.0_07"

を使った。
[Ansible] dev.mysql.comのrpmでMySQL 5.6をインストール

playbookは
https://github.com/hnakamur/ansible-playbooks/tree/master/roles/mysql
にあります。mysql/serverロールはサーバのインストールで、mysqlロールを指定するとそれに加えて日時バックアップの設定も行います。

以下は試行錯誤のメモです。

## MySQL 5.6ではrootの初期パスワードが設定済みで期限切れになっているのでまず変更しないと使えない

手動の場合はmysql_secure_installationを実行して変更すれば良いのでしょうが、Ansibleから自動で実行したいのでmysql_secure_installationの中身を読んで、等価な処理を書きました。

こういうスクリプトを作るときは対話方式だけではなくて、コマンドラインオプションで指定すれば対話不要になるようにしていただけるとありがたいですね。

なお、対話方式のスクリプトに対してexpectを使って動かす記事がchefですけどあったので、貼っておきます。
[Codrspace - Automate the non-automated with expect and Chef by glenbot](http://codrspace.com/glenbot/automate-the-non-automated-with-expect-and-chef/)

個人的にはexpectを使うのは、依存する部品が増えるので最後の手段かなと思っています。

本題に戻すと、今回キモとなるのはmysqlの--connect-expired-passwordオプションです。
[MySQL :: MySQL 5.6 Reference Manual :: 4.5.1.1 mysql Options](http://dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html#option_mysql_connect-expired-password)

これを指定してmysqlに接続して以下の様なSQLでパスワードを変更します。

```sql
SET PASSWORD FOR root@localhost=PASSWORD('新しいパスワード');
```

初期パスワードは/root/.mysql_secretの中に書かれています。

mysqlのドキュメントには--passwordオプションでパスワードを指定するのは、psで他のユーザにパスワードを見られてしまうので安全ではないと書かれています。
[MySQL :: MySQL 5.6 Reference Manual :: 6.1.2.1 End-User Guidelines for Password Security](http://dev.mysql.com/doc/refman/5.6/en/password-security-user.html)

代わりに~/.my.cnfというファイルに以下の様な設定を書くのがお勧めらしいです。

```ini:~/.my.cnf
[client]
password=パスワード
```

また--defaults-file=/path/to/my.cnfのように指定すれば、~/.my.cnf以外のパスも設定できます。

--connect-expired-passwordオプションも以下のように書くことで~/my.cnfに含めることが出来ます。

```ini:~/.tmp.my.cnf
[client]
password=パスワード
connect-expired-password
```

これで--defaults-file=/root/.tmp.my.cnfと指定してmysqlに接続して、パスワードを変更し、新しいパスワードで~/.my.cnfを作るようにしました。するとその後はコマンドラインでパスワードを指定しなくても接続できます。

## 他のユーザに見せたくないファイルを作るときは作成後にchmodより先にumask 0077を実行するのがお勧め

なお、my.cnfは他のユーザから見えないように0400とか0600といったパーミションにします。ファイルを作成してからchmodで変更する手もありますが、変更までの間に読まれる危険があります。ので、先にumask 0077を実行してから作成するほうが良いです。この場合はchmodは不要です。
Monit 5.6 for CentOS5.x

#  monit-5.6 インストール

http://mmonit.com/monit/

```shell-session:
cd /usr/local/src/
wget http://mmonit.com/monit/dist/monit-5.6.tar.gz
cp -av monit-5.6.tar.gz /usr/src/redhat/SOURCES/
vi /usr/src/redhat/SOURCES/monit-rhel-config-name.patch
```
>
```diff:monit-rhel-config-name.patch
--- src/monit.h.renamed_config  2013-08-28 06:35:08.000000000 +0900
+++ src/monit.h 2013-09-07 14:56:04.000000000 +0900
@@ -87,7 +87,7 @@
 #include "util/StringBuffer.h"
>
>
-#define MONITRC            "monitrc"
+#define MONITRC            "monit.conf"
 #define TIMEFORMAT         "%Z %b %e %T"
 #define STRERROR            strerror(errno)
 #define STRLEN             256
```

```shell-session:
tar zxvf monit-5.6.tar.gz
cp -av /usr/local/src/monit-5.6/contrib/packages/redhat/monit.spec /usr/src/redhat/SPECS/
vi /usr/src/redhat/SPECS/monit.spec
```
>
```vim:monit.spec
Name: monit
Summary: Process monitor and restart utility
Version: 5.6
Release: 1.el5
Source: http://www.mmonit.com/monit/dist/%{name}-%{version}.tar.gz
Group: Utilities/Console
URL: http://www.mmonit.com/monit/
BuildRoot: %{_tmppath}/%{name}-buildroot
License: AGPL
BuildRequires: flex
BuildRequires: bison
BuildRequires: openssl-devel
Patch0: monit-rhel-config-name.patch
>
%description
Monit is a utility for managing and monitoring processes,
files, directories and filesystems on a Unix system. Monit conducts
automatic maintenance and repair and can execute meaningful causal
actions in error situations.
>
%prep
%setup
%patch0 -b .confname
>
%build
%{configure}
make
>
%install
if [ -d %{buildroot} ] ; then
  rm -rf %{buildroot}
fi
>
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_mandir}/man1
mkdir -p %{buildroot}/etc/init.d
mkdir -p %{buildroot}/etc/monit.d
install -m 755 monit %{buildroot}%{_bindir}/monit
install -m 644 monit.1 %{buildroot}%{_mandir}/man1/monit.1
install -m 600 monitrc %{buildroot}/etc/monit.conf
install -m 755 contrib/rc.monit %{buildroot}/etc/init.d/%{name}
>
%post
/sbin/chkconfig --add %{name}
/sbin/chkconfig %{name} off
>
%preun
if [ $1 = 0 ]; then
   /etc/init.d/%{name} stop >/dev/null 2>&1
   /sbin/chkconfig --del %{name}
fi
>
%clean
if [ -d %{buildroot} ] ; then
  rm -rf %{buildroot}
fi
>
%files
%defattr(-,root,root)
%doc CHANGES COPYING README
%config /etc/monit.conf
%config /etc/init.d/%{name}
%{_bindir}/%{name}
%{_mandir}/man1/%{name}.1.gz
>
%changelog
* Sat Sep  7 2013 monit-5.6 <hoge at example dot jp>
- Create the inital spec file
- Created a sample config file and a rc startup script
```

```shell-session:
cd /usr/src/redhat/SPECS/
rpmbuild -bb --clean monit.spec
rpm -ivh /usr/src/redhat/RPMS/x86_64/monit-5.6-1.el5.x86_64.rpm
```
第13回オフラインリアルタイムどう書く。ruby による実装。

オフラインリアルタイムどう書く

* 第13回(9月6日) http://atnd.org/events/41603

の問題「積み木の水槽」
http://nabetani.sakura.ne.jp/hena/ord13blocktup/
の実装例。

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

ちなみに次回は

* 第14回(9月28日) http://atnd.org/events/43076

です。

で。

```ruby
def create_field( src )
  # 左右と下に空間があるフィールドを用意する
  [[nil]*10]+src.chars.map{ |s|
    i=s.to_i
    [nil] + [:B]*i + [:W]*(9-i) # :B はブロック、:W は水
  }+[[nil]*10]
end

def solve(src)
  field = create_field( src )
  loop do
    done=false
    ( field.size * 10 ).times do |xy|
      x,y = xy.divmod(10)
      next unless field[x][y]==:W # 注目点が水でなければ何もしない

      #右と左と下を調べて、空間があったらその水は流れ去る
      unless [ field[x+1][y], field[x-1][y], field[x][y-1] ].all?
        done=true
        field[x][y]=nil
      end
    end
    return field.flatten.count(:W).to_s unless done
  end
end

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

__END__
0 83141310145169154671122 24  
31  268131111165754619136819109839402 102 
```

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

会場で思いついた実装。

コメントのとおりなんだけど

1. 入力データの外側に何もない空間をひとマス分用意。
1. 入力データのある辺りのブロックのない部分は水で満たす。
1. 水の左右又は下に何もない空間があったらそこを何もない空間にする。
1. やれることがなくなったら終了。水の数を数える。

`done` があるのがかっこ悪い気がするんだけど、マシにする方法が思いつかない。
rails new の瞬間から既に戦いは始まっている…！

```bash
rails new my-awesome-app -d postgresql
```

ではここで `config/database.yml` を見てみましょう．

```yaml
# (前略)
development:                   
  adapter: postgresql          
  encoding: unicode            
  database: my-awesome-app_development
  pool: 5
  username: my-awesome-app     
  password:
# (後略)
```

データベース名とユーザ名にハイフンが含まれていますね．ここを書き換える予定がある人とかならいいんですけど例えば初めて Heroku 使ってみる (PostgreSQL 自体初めてみたいな) 人とかこういういらんことで困りたくないです．

```bash
rails new my_awesome_app -d postgresql
```

まぁこうしておけば問題ないかと．

ダブルクォートでくくれば大丈夫とか色々 Google 先生が教えてくれますけど，そもそも SQL の Identifier にハイフンはあまり望ましいものじゃないとのことで．

## References

* http://www.postgresql.org/docs/9.2/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
JSON → Fluentd　→ MongoDB

環境はUbuntu13
1.公式サイトみてFluentdのインストール
  gemではなくtd-agentでインストール
　(公式サイトに大規模だったり初心者はその方がいいと書いてあった)

1.Fluentd で JSONを受け取る
　Fluentdのin_httpプラグインを使用


2.FluentdからMongoDBに書き込み
　Fluentdのout_mongoを使用
「積み木の水槽」をErlangで(横へな13)

[第13回オフラインリアルタイムどう書くの問題](http://qiita.com/Nabetani/items/936e7885f4c607472060)
[積み木の水槽 ～ 横へな 2013.9.6](http://nabetani.sakura.ne.jp/hena/ord13blocktup/)
「積み木の水槽」をErlangでやってみました。

穴(ブロックのない所)からヘリウムガスが吹き出すことを考えました。ガスは横または上に広がります。ガスのない場所＝窪んでいる場所＝水がたまる場所なので、その個数を数えています。

![図: ガスの広がり](http://cdn-ak.f.st-hatena.com/images/fotolife/p/paz3/20130907/20130907150638.png)

```erlang:blocktub.erl
-module(blocktub).
-compile(export_all).

%% 問題を解く
solve(Data) ->
  integer_to_list(pit_count([Digit - $0 || Digit <- Data])).

%% 窪みの数を計算する
pit_count(Data) ->
  Max = lists:max(Data),                    % 壁の最大高さ
  Walled = [Max, 0] ++ Data ++ [0, Max],    % 左右に穴と壁を追加
  lists:foldl(fun(Height, Count) ->
    pit_count(Walled, Height) + Count end, 0, lists:seq(1, Max)).

%% 指定された高さにある窪みの数を計算する
pit_count(Data, Height) ->
  Drain = [Idx || {Idx, Num} <- with_index(Data), Num =:= 0], % 穴
  Block = [Idx || {Idx, Num} <- with_index(Data), Num >= Height], % ブロック
  Gas = lists:usort([{                       % ガス範囲を求める
    lists:max([B + 1 || B <- Block, B < D]), % ガスの左端
    lists:min([B - 1 || B <- Block, B > D])  % ガスの右端
    } || D <- Drain]),
  GasCount = lists:foldl(                    % ガスの数を求める
    fun({L, R}, Count) -> Count + R - L + 1 end, 0, Gas),
  length(Data) - length(Block) - GasCount.   % 窪みの数 (=幅-ブロック-ガス)

%% インデックスを追加する [a,b,c] -> [{1,a},{2,b},{3,c}]
with_index(Data) -> lists:zip(lists:seq(1, length(Data)), Data).

test(Data, Expected) ->
  Result = solve(Data),
  OkNg = case Result =:= Expected of true -> ok; false -> ng end,
  io:fwrite("~s: ~s -> ~s~n", [OkNg, Data, Result]).

tests() ->
  test("83141310145169154671122", "24"), %0
  test("923111128", "45"), %1
  test("923101128", "1"), %2
  test("903111128", "9"), %3
  test("3", "0"), %4
  test("31", "0"), %5
  test("412", "1"), %6
  test("3124", "3"), %7
  test("11111", "0"), %8
  test("222111", "0"), %9
  test("335544", "0"), %10
  test("1223455321", "0"), %11
  test("000", "0"), %12
  test("000100020003121", "1"), %13
  test("1213141516171819181716151413121", "56"), %14
  test("712131415161718191817161514131216", "117"), %15
  test("712131405161718191817161514031216", "64"), %16
  test("03205301204342100", "1"), %17
  test("0912830485711120342", "18"), %18
  test("1113241120998943327631001", "20"), %19
  test("7688167781598943035023813337019904732", "41"), %20
  test("2032075902729233234129146823006063388", "79"), %21
  test("8323636570846582397534533", "44"), %22
  test("2142555257761672319599209190604843", "41"), %23
  test("06424633785085474133925235", "51"), %24
  test("503144400846933212134", "21"), %25
  test("1204706243676306476295999864", "21"), %26
  test("050527640248767717738306306596466224", "29"), %27
  test("5926294098216193922825", "65"), %28
  test("655589141599534035", "29"), %29
  test("7411279689677738", "34"), %30
  test("268131111165754619136819109839402", "102"). %31
```

結果の一部:

<pre>
ok: 83141310145169154671122 -> 24
ok: 923111128 -> 45
ok: 923101128 -> 1
ok: 903111128 -> 9
...
</pre>
FuelPHPでクロージャをバックグラウンド実行する

というパッケージを作りました。

https://github.com/hackoh/fuel-background

（注記：WinとLinuxでは動作確認しましたが、Macで動かしたことありません。）

バックグラウンド実行については、「exec()するやらなんやらで、出来るよ～」というノウハウは既に沢山ありますが、
このパッケージの特徴は、「クロージャやハンドラを直接バックグラウンド実行」 させます。
主な使い方は、以下の通り。

適用前

```php
<?php

// とても重く、時間がかかる処理
$object->very_heavy_process();
```

適用後

```php
<?php

Background::forge(function($object) {
    // とても重く、時間がかかる処理
    $object->very_heavy_process();
}, array($object))->run();

// もしくは
Background::forge(array($object, 'very_heavy_process'))->run();
```

イベントリスナも貼れます。

```php
<?php

Background::forge(array($object, 'very_heavy_process'))
->on('before', function() {
    \Log::info('very heavy process will start !');
})
->on('after', function() {
    \Log::info('very heavy process ended !');
})
->on('success', function() {
    \Log::info('very heavy process returned true !');
})
->on('error', function() {
    \Log::info('very heavy process returned false !');
})
->on('exception', function($e) {
    \Log::info('very heavy process threw a exception !');
})->run();

```

run()の代わりにqueue()を使うと、順に実行されます。

```php
<?php

// Normal running
	
	Background::forge(function() {
		for ($i = 0; $i < 2; $i++)
		{
			\Log::warning(1);
		}
	})->run();
	Background::forge(function() {
		for ($i = 0; $i < 2; $i++)
		{
			\Log::warning(2);
		}
	})->run();
	Background::forge(function() {
		for ($i = 0; $i < 2; $i++)
		{
			\Log::warning(3);
		}
	})->run();

	// 1
	// 2
	// 3
	// 1
	// 2
	// 3

	// - This means that three processes exist.


	// Queuing

	Background::forge(function() {
		for ($i = 0; $i < 2; $i++)
		{
			\Log::warning(1);
		}
	})->queue();
	Background::forge(function() {
		for ($i = 0; $i < 2; $i++)
		{
			\Log::warning(2);
		}
	})->queue();
	Background::forge(function() {
		for ($i = 0; $i < 2; $i++)
		{
			\Log::warning(3);
		}
	})->queue();

	// 1
	// 1
	// 2
	// 2
	// 3
	// 3

	// - This means that only one process exists.
```
Eclipseの生成するアクセサメソッドの名称について、対象のフィールド名の一部を無視する

## 概要
Eclipseでアクセサを自動生成するときに
アクセサメソッドの名称を、コードテンプレートを使って調整する。

## 目的
こんなフィールドについてアクセサを自動生成するときに、

```java:フィールド
private Integer _number;
```

こうではなく

```java:生成アクセサ(デフォルト)
	public Integer get_Number() {
		return _number;
	}

	public void set_Number(Integer number) {
		_number = number;
	}
```

こうしたい

```java:生成アクセサ(願望)
	public Integer getNumber() {
		return _number;
	}

	public void setNumber(Integer number) {
		_number = number;
	}
```

## 設定方法

  プロジェクトのプロパティより、

1. 左ペインで Java Code Style を選択。
1. 右ペインで VariableTypes:Fileds を選択
1. Edit ボタンをクリック
1. 出てくるダイアログで次を入力

    Prefix list: _
Ansibleのroleを使いこなす

Ansibleのroleを実際に使ってみてわかったことを共有します。さらに便利に活用するtips等ありましたら、ぜひコメントをお願いします。

## Ansibleのroleは単にインクルードの単位

最初roleという名前を聞いたときは、webserverとかdbserverといった役割を設定するのだろうと予想しました。が、[Rolesのドキュメント](http://docs.ansible.com/playbooks_roles.html#roles)を読んで、playbookの一部をインクルードして再利用するための仕組みだということがわかりました。つまり、playbookを分割・構成するコンポーネントという意味合いです。

もともとroleはなくてincludeの仕組みだけありましたが、より便利にするためにroleという仕組みが追加されたという経緯のようです。

例えばnginx, mysqlといった単位でroleを定義するのが良いです。さらにmysql/clientのように階層的なrole名を用いることも出来ます。下記で詳しく説明します。

roleを使わなくてもincludeでtaskから別のtaskのファイルを読み込むことはできます。が、roleを分けるほうが以下の利点があるため、他のroleから利用しやすくなります。

- roleが別になるのでrole_varsの内容も分割できる
- role間の依存関係を設定できる
- role間の依存関係には実行条件も設定できる

## roleのディレクトリ・ファイル構成

Ansibleのroleは以下の様なディレクトリ・ファイル構成になっています。ここではmysqlというroleを例に説明します。

- roles/mysql/tasks/main.yml
    - タスク定義のメインファイル。内容が多くなってきたら分割してtasks/foo.ymlのようなファイルを作ってtasks/main.ymlからincludeすることもできます。
- roles/mysql/handlers/main.yml
    - notifyに対するハンドラ定義のメインファイル。もう少し詳しく言うと、ファイルを変更した場合にAnsibleの実行の最後にサービスを再起動やリロードさせるためのnotificationの仕組みで呼び出されるハンドラ定義のメインファイルです。notificationについて詳しくは[Running Operations On Change](http://www.ansibleworks.com/docs/playbooks.html#running-operations-on-change)を参照してください。
- roles/mysql/vars/main.yml
    - role単位の変数定義のメインファイル。
- roles/mysql/meta/main.yml
    - roleの依存関係の定義ファイル。

## 階層的なrole名も使えますが注意が必要です

Ansibleのroleにはmysqlといったシンプルな名前の他に、mysql/clientといった階層的な名前をつけることもできます。

ただし、roleの定義フォルダにはtasks, handlers, vars, metaというフォルダがあるので、これらの名前は避ける必要があります。また将来roleの定義フォルダとして追加されそうな名前も避けておいたほうが無難です。

## roleのデフォルト変数

[Role Defaults Variables](http://docs.ansible.com/playbooks_roles.html#role-default-variables)によると、roleから別のroleをインクルードしたり依存関係を設定するとそちらのrole_varsに定義された変数がデフォルト値として設定されます。それを自分のrole_varsで上書き変更することも可能です。

この仕組を使うと場合によっては変数定義を一箇所にまとめることもできます。例えば、mysql/clientでクライアント・サーバ共通用のrpmをインストールし、mysql/serverではサーバ専用のrpmをインストールする場合、mysql/serverからmysql/clientに依存させておいて、rpmのバージョンの変数定義をmysql/clientのほうにまとめて書くといったことができます。

# role間の依存関係を設定できる

例えばmysql/serverがmysql/clientに依存する場合は以下のように書きます。

```yaml:roles/mysql/server/meta/main.yml
---
dependencies:
  - { role: mysql/client }
```

依存関係を設定すると、依存先のroleが先に実行されるようになります。依存関係は再帰的に辿られます。また、依存関係で複数回参照されても通常は最初の1回だけが実行されます。allow_duplicatesキーをtrueに設定すれば毎回実行することも出来ます。

詳細は[Role Dependencies](http://docs.ansible.com/playbooks_roles.html#role-dependencies)にドキュメントがありますので参照してください。

## role間の依存関係には実行条件も設定できる

依存関係の定義にはwhenキーで条件を設定することも出来ます。これを使えばOSのディストリビューションに応じて実行するサブroleを切り替えることが出来ます。例えばlxcがlxc/redhat, lxc/debianに依存している場合は以下のように書けます。

```yaml:roles/lxc/meta/main.yml
---
dependencies:
  - { role: lxc/redhat, when: "ansible_os_family == 'RedHat'" }
  - { role: lxc/debian, when: "ansible_os_family == 'Debian'" }
```

## 実際のplaybookでの例

CentOS 6.4 x86_64用のroleの実例は拙作のplaybookを参照してください。まだまだ非互換な変更が入る予定なので、その点はご留意ください。
https://github.com/hnakamur/ansible-playbooks/tree/master/roles
cURL を Windows で使う場合、SSL のサイトにアクセスするとエラーが出る

Windows 上で cURL を使うと、SSL サイトで証明書の検証に失敗する。
ググったら以下の URL を見つけた。

* http://superuser.com/questions/442793/why-cant-curl-properly-verify-a-certificate-on-windows

curl.exe とバンドルして配布してくれればいいと思うんだけど…
bashで複数コマンドのエイリアス


bashで複数コマンドをエイリアスに仕様としたら詰んだ。

もともとこんなのを作ってた。

~~~~bash:
alias runMKKN='cd ~/Dropbox/docRoot/mkkn2013;php -S localhost:9100 -t public'
~~~~

わざわざ`cd`するのはbashのプロンプトメッセージのため。要するに`;`で区切れば複数コマンドをaliasに登録できる、そう思っていた。

んで次に`mkdir`したらまぁ大抵は`cd`するよねぇと思って、

~~~~bash:
alias mkcd='mkdir $1;cd $1'
~~~~
ってしたら動かない。謎。

とりあえず以下の形で解決

~~~~bash:
function mkcd() {
    mkdir $1;
    cd $1;
}
alias mkcd=mkcd
~~~~

参考は[ITのハキダメ: [bash] cdと同時にlsするエイリアスコマンド](http://it-scrap.blogspot.jp/2009/12/bash-cdls.html)

なんで`'mkdir $1;cd $1'`がダメなのかは結局さっぱりわからずじまい。
mod_rewriteでurlのpathにindex.phpを非表示にする。

設定前 : http://localhost/index.php/apps/calc/
↓
設定後 : http://localhost/apps/calc/

$ vim /var/www/.htaccess

```apache:以下追記
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^index.php/(.*) $1 [L]
</IfModule>
```
第13回オフラインリアルタイムどう書く。groovy による実装。

オフラインリアルタイムどう書く

* 第13回(9月6日) http://atnd.org/events/41603

の問題「積み木の水槽」
http://nabetani.sakura.ne.jp/hena/ord13blocktup/
の実装例。

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

ちなみに次回は

* 第14回(9月28日) http://atnd.org/events/43076

です。

で。

```groovy
//Groovy Version: 2.1.5 JVM: 1.7.0_07 Vendor: Oracle Corporation OS: Mac OS X
int solver( String src )
{
  blocks = src.collect{ it.toInteger() }
  (1..(blocks.size()-2)).sum{ ix -> 
    if ( ix<0 || blocks.size()<=ix || blocks[ix]==0 ){
      return 0;
    }
    int left=0;
    for( int i=ix-1 ; 0<blocks[i] && 0<=i ; --i ){
      if ( left<blocks[i] ){
        left = blocks[i]
      }
    }
    int right=0
    for( int i=ix+1 ; 0<blocks[i] && i<blocks.size ; ++i ){
      if ( right<blocks[i] ){
        right = blocks[i]
      }
    }
    int height = Math.min( left, right )
    Math.max( 0, height - blocks[ix] )
  }
}

def test( src, expected )
{
    String actual = solver( src ).toString();
    println( [expected==actual ? "ok" : "***NG***", src, actual, expected ] )
}
/*2*/ test( "92308", "1" );    
/*3*/ test( "90328", "1" );    
/*0*/ test( "83141310145169154671122", "24" );    
/*1*/ test( "923111128", "45" );    
/*2*/ test( "923101128", "1" );    
```

いつも通り、テストデータの大半は省略。

で。

その場で書いたもの。
なんかつまんないバグ（詳細失念）に引っかかって時間がかかってしまい、ソースが整理できていない。

方針は：

* 左から順に調べる。
* 自分より左にあって「0の列又は左端」まで調べて、最大値(`left`)を得る。
* 自分より右にあって「0の列又は右端」まで調べて、最大値(`right`)を得る。
* `left` と `right` の小さいほうが水面の高さ。
* 自分の場所を引くと水の量になるけど、マイナスにならないように手を加える
* というような値の総和を取る

というもの。関数が長すぎるし、重複もあるのでリファクタリングするべきだと思う。` ix -> ` などとせずに `it` がいいとか、この for文はないだろうとか、いろいろ。

苦し紛れに C言語のような for 文を書いてしまったが、こういうループの時 groovy では普通どうするんだろう。
virt-manager使う際のport forwarding設定

[Forwarding ports to KVM clients](http://secomputing.co.uk/2012/02/21/Forwarding-ports-to-KVM-clients/)というのもあるようだ

|端末 | IP |
|:--|:--|
| サーバー | 2.2.2.2 |
| サーバー上のlxc | 192.168.111.2 |

の場合、 `2.2.2.2:10080 のアクセスを 192.168.111.2:80` にフォワーディングしたい。

* virt-manager起動

接続の詳細 -> 仮想ネットワーク
==========================
仮想ネットワーク"network_routing"の作成
------------------------------
1. 編集メニュー -> 接続の詳細 -> 仮想ネットワーク
1. 新しい仮想ネットワークの作成 -> Forward
1. 仮想ネットワークの名前の指定 -> ネットワーク名`network_routing` -> Forward
1. IPv4アドレス領域の指定 -> ネットワーク `192.168.111.0/24` -> Forward
1. DHCP範囲の選択 -> DHCPを有効に -> `ON`, 開始-> `192.168.111.128`, 終了 -> `192.168.111.254`
1. 物理ネットワークへの接続 -> `物理ネットワークにフォワード` ,宛先 -> `いずれかの物理デバイス`, モード -> `ルーティング` -> Forward
1. ネットワークを作成する準備ができました -> 完了

最初からある`default`のネットワークは自動起動を`OFF`にしておいて大丈夫です。

サーバー上のlxcのIP固定設定
------------------------------
* /var/lib/lxc/コンテナ名/rootfs/etc/network/interfaces

```bash:
iface eth0 inet static
    address 192.168.111.2
    netmask 255.255.255.0
    gateway 192.168.111.1
    dns-serch local
    dns-nameserver 8.8.8.8 8.8.4.4
```

* /var/lib/lxc/コンテナ名/config にlxc用の設定を記載しても変更できません。

サーバー(2.2.2.2)にてiptablesでforwarding設定
------------------------------

```bash:/etc/iptables.lxc.forwarding.sh
#!/bin/sh
# 変数
PUBLIC_IP=2.2.2.2
LXC_IP=192.168.111.2
HOST_PORT=10080
GUEST_PORT=80
# ルーティング
sudo iptables -t nat -A PREROUTING -p tcp -d $PUBLIC_IP --dport $HOST_PORT -j DNAT --to-destination ${LXC_IP}:${GUEST_PORT}
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
# 確認
sudo iptables-save
```

```bash:
$ sudo chmod +x /etc/iptables.lxc.forwarding.sh
$ sudo /etc/iptables.lxc.forwarding.sh
```

外部から`telnet 2.2.2.2 10080`で応答があることを確認。

```bash:サーバー起動時にiptablesに追加されることを確認。
$ sudo vim /etc/rc.local
/etc/iptables.lxc.forwarding.sh
exit 0
```
オフラインどう書く第13回回答例 ( Scala )

勉強会当日は時間内に解けなかったので、家で解き直しました。
もっと精進します。

```scala
object Hena {
  def makeBox(src:String, w:Int, h:Int) = { 
    src.map(arg => {
      val i = arg.toString.toInt
      List.fill((i - h).abs)('0') ++ List.fill(i)('1')
    }).toList.transpose
  }

  def overflowFromLeft(i:Int, l:List[Char]) = { 
    List.fill(i)(' ') ++ l.mkString.drop(i).toList
  }

  def overflowFromRight(i:Int, l:List[Char]) = { 
    l.mkString.dropRight(i).toList ++ List.fill(i)(' ')
  }
  
  def overflow(arg:List[Char]) = { 
    val l = overflowFromLeft(arg.indexOf('1'), arg)
    overflowFromRight(l.size - arg.lastIndexOf('1') - 1, l)
  }

  def solve(src:String) = { 
    val items = src.split("0").filter(!_.isEmpty)
    items.map(item => {
      val (w, h) = (item.length, item.max.toInt)
      makeBox(item, w, h).map(arg => arg match {
        case _ if(arg.head == '0' || arg.last == '0') => overflow(arg)
        case _ => arg 
      }).flatten
    }).mkString.count(_ == '0').toString
  }

  def test(src:String, expected:String) = { 
    val actual = solve(src)
    println(if(expected == actual) "ok" else "***NG***")
  }

  def main(args:Array[String]) = { 
    /*0*/ test( "83141310145169154671122", "24" ) 
    // 以下略
  }
}
```
第13回オフラインリアルタイムどう書くの問題をRubyで解く、その２

問題はこちらのリンクから。
http://qiita.com/Nabetani/items/936e7885f4c607472060

会場では、時間制限があるので
http://qiita.com/nidouchi/items/ea73c5fee91228842b3f
こんなのしか出来なかったのですが懇親会で酒を飲んで色々な話をすると、ましな実装を思いつきます。

```rb
def solve(q)
  walls = q.chars.map(&:to_i)
  pool = walls.map{|sz| sz==0 ? ['H']*walls.max : ['B']*sz + ['X']*(walls.max-sz)}.transpose.map(&:join)
  pool.map{|line| line.gsub(/(BX+)+B/){|s| s.gsub('X','W')}}.join.count('W')
end

DATA.readlines.each do |line|
  no,q,a,d = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	83141310145169154671122	24	
1	923111128	45	
2	923101128	1	
```
第３回 オフラインリアルタイムどう書く解答(C++)

問題：http://nabetani.sakura.ne.jp/hena/ord3ynode/

```cpp
#include <iostream>
#include <algorithm>
#include <sstream>

using namespace std;

typedef pair<char, char> position;

void move(position & pos, char d)
{
  string m("DBC" "AEC" "ABF" "EAF" "DFB" "CED" + (pos.second - 'A') * 3, 3);
  string::size_type ix = m.find(pos.first);
  pos = make_pair(pos.second, //first
      m[(ix + string("brl").find(d)) % 3] // second
      );
}

string calc(string const & src)
{
  position pos = std::make_pair('B', 'A');
  std::stringstream ss;
  ss << pos.second;
  for (size_t i = 0; i < src.size(); ++i) {
    move(pos, src[i]);
    ss << pos.second;
  }
  return ss.str();
}

void test(string const & src, string const & dest, int line)
{
  string res = calc(src);
  if (res != dest) {
    cout << "NG [" << line << "] " << dest << " != " << res << endl;
  }
  else {
    cout << "OK [" << line << "] " << endl;
  }
}

int main()
{
#define TEST(s,d) test((s), (d), __LINE__)
  TEST("b", "AB");
  TEST("l", "AD");
  TEST("r", "AC");
  TEST("bbb", "ABAB");
  TEST("rrr", "ACBA");
  TEST("blll", "ABCAB");
  TEST("llll", "ADEBA");
  TEST("rbrl", "ACADE");
  TEST("brrrr", "ABEDAB");
  TEST("llrrr", "ADEFDE");
  TEST("lrlll", "ADFEDF");
  TEST("lrrrr", "ADFCAD");
  TEST("rllll", "ACFDAC");
  TEST("blrrrr", "ABCFEBC");
  TEST("brllll", "ABEFCBE");
  TEST("bbbrrlrl", "ABABEDFCB");
  TEST("rbllrrrr", "ACABCFEBC");
  TEST("lbrlrrblr", "ADABCFEFCA");
  TEST("rlbrrrrbl", "ACFCADFCFD");
  TEST("bllrlrbrrb", "ABCADEFEBCB");
  TEST("rllrllllbb", "ACFDEBADEDE");
  TEST("blblrlrrlbr", "ABCBEDFCABAC");
  TEST("lrlrrrrrbrb", "ADFEBCFEBEDE");
  TEST("rblllrlrrlrr", "ACABCADEFDABE");
  TEST("rbrrlrblrllb", "ACADFEBEFDACA");
  TEST("lrrrlrllrrllr", "ADFCABEFCADEBC");
  TEST("rrlblllrrlrrb", "ACBEBADEFDABEB");
  TEST("brbllrrbbrlrll", "ABEBADFCFCABEFC");
  TEST("rrrbbrlbrlblrb", "ACBABACFCABADFD");
  TEST("lllllllllllblrr", "ADEBADEBADEBEFDE");
  TEST("llllllrllrlbrrr", "ADEBADEFCBADABED");
#undef TEST
  return 0;
}
```
オフラインリアルタイムどう書く第5回の参考問題(C++)

C++でゴルフに挑戦！

問題：http://nabetani.sakura.ne.jp/hena/ord5railsontiles/
解答例：http://qiita.com/Nabetani/items/0ddde0164a745cd09c34

```cpp
#include <iostream>
int main() {
  char s[99], c;
  std::cin >> s;
  for (size_t x = 1, y = 0, d = 0;
    x < 3 & y < 3;
    d = 3 & 1815012 >> 8 * s[x + 3 * y] - 384 + 2 * d,
    ( d & 1 ? x : y ) += 1 - ( d & 2 ) )
    std::cout << (c = 65 + x + 3 * y);
}
```
RailsでAjaxやるメモ

通常のフォームを非同期通信でやるのはこっち:

* [フルAjaxで動くRailsアプリを作ってみたよ。 | Ginpen.com](http://ginpen.com/2011/11/28/ajax-on-rails/)

本稿はフォームとかなし、普通に`jQuery.ajax()`で送信してどうこうっていうパターンについて。メモ。そのうち清書してブログ記事にしたい。

```html
<div class="item" data-item-id="<%= item.id %>"></div>
```

```coffeescript
  _save: ($item) ->
    id = $item.attr('data-chair-id')
    ($.ajax {
      url: "/chairs/#{id}.json"
      method: 'PATCH'
      data: $.param({
        item: {
          # …
        }
      })

    })
      .error (xhr, status, subject) ->
        alert('ERROR')
        console.error(arguments)
      .complete () =>
        @_stop_loading($item)
    @_start_loading($item)
```

ほとんどCoffeeScriptを書いただけだけど、Railsっぽいところについて:

* [$.param(obj)](http://api.jquery.com/jQuery.param/)で標準的なリクエストパラメーターの形式にする
* 送信情報は`data`じゃなくて`data.item`とかそういうのにする
* `method`は更新なので`"PATCH"`（Rails3までは`"POST"`）、削除時は`"DELETE"`
* 本当はURLもerbとかそういうのでやりたい（このままだと`root_path`が"/"でないとしぬ）
* 関数を呼ぶところは頑張れ
続・F#でモンテカルロ法　Async.Parallel編

#Async.Parallelを使いたかった
Async.ParallelとThreadLocalを使ってみた。
もう少しスッキリした感じに直したいが、とりあえず書き残しておく

#コード

```fsharp

open System.Threading
    
let mean H omega =
    omega
    |> Array.map (fun x ->
        async{
            let! (o, mu) = x
            return H o * mu
        })
    |> Async.Parallel
    |> Async.RunSynchronously
    |> Array.sum
    
let monte H (rv_gen:unit->(unit->'a) ref) =
    let rv = new ThreadLocal<_>(rv_gen)
    let N = 10000
    let a = [|for _ in 1..N -> async{
                return ((!rv.Value)(), 1.0)
    }|]
    (mean H a) / float N

[<EntryPoint>]
let main argv = 
    let uid = ref System.Environment.TickCount
    let rv_gen = fun () ->
        let seed = Interlocked.Increment(uid)
        let r = new System.Random(seed)
        let c = fun () ->
            (r.NextDouble(), r.NextDouble())
        ref c
    
    let pi_q = monte (fun (x, y) -> ceil (1.0 - (x ** 2.0 + y ** 2.0))) rv_gen
    printfn "%A" (pi_q * 4.0)
    0

```
Composer の オートローダーだけ Phalcon に差し替える

残念ながら **「爆速フレームワークの爆速オートローダーを使って爆速オートロードする方法」** ではありません。むしろこんな方法では低速になると思います。

---

次のようなディレクトリ構成だとします。

```
 Root/
   composer.json           composer.json
   src/
     **/                   いろいろ
   vendor/
     autoload.php          autoload.php
     **/                   いろいろ
   tests/
     bootstrap.php         PHPUnit の bootstrap (後述)
     ClassLoader.php       差し替えオートローダー (後述)
     **/                   いろいろ
```

`Composer\Autoload\ClassLoader` を差し替えるクラスを作成します。
`vendor/composer/autoload_real.php` で必要となる最小限のメソッドだけ定義します。

```php:ClassLoader.php
<?php
namespace Composer\Autoload;

class ClassLoader extends \Phalcon\Loader
{
    public function addClassMap(array $classMap)
    {
        $this->registerClasses($classMap);
    }

    public function set($prefix, $paths)
    {
        $this->registerDirs(array_merge((array)$this->getDirs(), (array)$paths));
    }

    public function add($prefix, $paths)
    {
        $this->registerDirs(array_merge((array)$this->getDirs(), (array)$paths));
    }

    public function register()
    {
        parent::register();
    }
}
```

本物の `Composer\Autoload\ClassLoader` がロードされる前に差し替えクラスをロードします。

```php:bootstrap.php
<?php
// 差し替えクラスをロード
require_once __DIR__ . '/ClassLoader.php';

// Composer\Autoload\ClassLoader
$loader = require __DIR__ . '/../vendor/autoload.php';

// テストとかで使う名前空間を追加
$loader->add('Tests', __DIR__);
```

### 何故こんなアホなことを？

大きめのフレームワークの内部の動作を追いたいとき、デバッガでステップ実行するととても便利ですが、普通にステップ実行するとオートローダーの中まで追跡してしまいかなりうざいです。そこ興味ないんで飛ばしてほしいです。

Eclipse PDT の「ステップフィルター」というものを使えば部分的に飛ばすことができそうな気がしたのですが、上手く動作する気配がありませんでした（デバッガが ZendDebugger でなければならない？）。

なので *「拡張モジュールならステップ実行されないから、拡張モジュールで PSR-0 なオートローダーないかなー」* とか考えていました。

.
.
.

ありました「[Universal Class Loader — Phalcon 1.2.2 documentation](http://docs.phalconphp.com/en/latest/reference/loader.html "Universal Class Loader — Phalcon 1.2.2 documentation")」
redisでmysqldumpのようなダンプツールを使う

mysqldumpのように既存データベースに対しての追記形式でダンプできたほうが都合が良いこともある
そんな時にはredis dump

http://code.google.com/p/redis-dump/

```
redis-dump -u 127.0.0.1:6371 > db_full.json
< db_full.json redis-load 
```

DB単位でダンプもできる

```
redis-dump -u 127.0.0.1:6371 -d 15 > db_db15.json
```

centos6.4にインストールするには以下のパッケージを入れる

```
sudo yum install ruby-devel ruby rubygems
sudo gem install redis-dump
```

ひとつだけ注意書きがあってまだアルファバージョンだから運用に使うなよとある。

```
NOTE: This is alpha software. DO NOT RELY ON IT FOR PRECIOUS THINGS!!
```
Safari ではプライベートブラウジング時に SessionStorage/LocalStorage に書き込めない

正確には QUOTA_EXCEEDED_ERR 例外が発生する。

http://stackoverflow.com/questions/14555347/html5-localstorage-error-with-safari-quota-exceeded-err-dom-exception-22-an

http://www.kc-webdesign.co.uk/web_design_tips_tricks/web-design-kent-private-browsing-in-safari-mobile-and-javascript-localstorage

とりあえず以下のような関数を作って、判定すればよいのではないかと。

※ 9/8 コメントを受けて、コードを一部修正。

```js
function isLocalStorageSupported() {
  if (!window.sessionStorage) return false;
    
  var testKey = 'test';
  try {
    window.sessionStorage.setItem(testKey, '1');
    window.sessionStorage.removeItem(testKey);
    return true;
  } catch (error) {
    return false;
  }
}
```
bashスクリプトでデバッグログの出力行を明示

logger等でログを吐く際に、ログ出力ファイルと行番号を明示する方法。
ファイル名を${0##*/}とすればうまくいくように思えるが、関数を共通化して共通定義にまとめた場合などに上手く行かない。

BASH_SOUCEは現在のmanでは確認できない模様…。

```bash:Bash
# $0は実行プロセス名。
# BASH_SOURCEは実行中のファイルを配列に格納する。現在ファイルが[0]。
# FUNCNAMEは関数名。関数内でなければ空白
# LINENOは行番号。

/usr/bin/logger -p local0.info -t ${0##*/} FILE=${BASH_SOURCE[0]##*/} FUNC=${FUNCNAME} LINENO=${LINENO}
```
ローカルファイルに有るapkファイルを端末にインストールする。

windowsOSで開発していた際に、
Eclipse上から複数端末にインストールするのが面倒だったので
超簡単なbatファイルを作っていたのでその中身を公開してみた。

使い方はapkファイルをbatにドラック＆ドロップでOK

下記の内容を元にbatファイルを作成して
「adb.exe」のディレクトリが置いてある場所にbatを設置するか、
フルパス指定や、環境変数等でadb.exeを叩けるように各自設定してみてください。

一台ずつ接続してインストールしてください。

@echo off
"adb.exe" -d install %1
jsfiddleで3DなCSSを試すテンプレート

（主に自分用メモ）

これをForkして使う事にする。

* http://jsfiddle.net/ginpei/G6RA6/

例:

* http://jsfiddle.net/ginpei/aLTp4/

![space_box.gif](https://qiita-image-store.s3.amazonaws.com/0/10765/17a70b6c-4bf9-cabe-a47a-38fb53f0091a.gif)
IE以外のブラウザでドロップダウンリストの各項目に色を付けたいとき

**【2021/10/15 追記】**
**この記事は更新が停止されています。現在では筆者の思想が変化している面もありますので，過去の記事として参考程度にご覧ください。**

```html
<select name="color">
<option style="color:black;" selected>選択してください</option>
<option style="color:red;">赤</option>
<option style="color:yellow;">黄</option>
<option style="color:blue;">青</option>
</select>
```

InternetExplolerは選択後のselect要素自体の色も自動的に変更してくれるようですが、FirefoxやGoogleChromeではselect要素を直接操作しない限りデフォルト色のままになってしまうようです。
これを解決するためにJavaScriptド素人の私なりに思いついたのが以下のコードです。
既出だったら申し訳ないというか多分既出だと思いますが。

```js
function changeColor() {
    var e = document.getElementById("color");
    e.style.color = e.options[e.selectedIndex].style.color;
}
```

```html
<select name="color" id="color" onchange="changeColor()">
<option style="color:black;" selected>選択してください</option>
<option style="color:red;">赤</option>
<option style="color:yellow;">黄</option>
<option style="color:blue;">青</option>
</select>
```

とりあえずGoogleChromeではこれで動作確認できました。
「こうしたほうがいい」等指摘があれば生暖かいコメントお願いします（（（
ruby 2.0.0-p247環境構築memo

### rvm がruby２系に対応していない。
ので、

```shell-session
# rvm削除（調べてわらう
rvm seppuku

# rbenvを入れる。homebrewは導入済み。
brew update
brew install rbenv
brew install ruby-build
```

```shell-session
rbenv  install -l # 一覧をみる
rbenv  install 2.0.0-p247
rbenv rehash
rbenv local 2.0.0-p247

# rubyの準備
gem install bundler --pre
gem install rake

# あとはproject にて
cd ${RAILS_ROOT}
rbenv exec bundle install
```


#### ついでに入れたもの
```shell-session
brew install mysql 
brew unlink mysql
brew install percona-server # いつも間違う。
````