OmniAICreator/Qiita-1.07M huggingface dataset:
[ez gui] 定型パーツ(1) リスト形式アイテム

```lang:ListView.cs
using UnityEngine;
using System;
using System.Collections;

public class ListView : MonoBehabiour
{
 [SerializeField]
 GameObject listItemPrefab = null;
 [SerializeField]
 UIScrollList scrollList = null;
 public void Start()
 {
  for(int i = 0; i < list.Length; i++)
  {
    var item = Utility.InstantiateGetComponent<ListItem>(null, listItemPrefab);
    UIListItemContainer container = item.GetComponent<UILisItemContainer>();
    scrollList.AddItem(container);
    item.SetData("ListItem" + i);
  }
 }
}
```
```lang:ListItem.cs
using UnityEngine;
using System.Collections;

public class ListItem : MonoBehaviour
{
 [SerilizeField]
 SpriteText label = null;

 public void SetData(string labelText)
 {
 label.Text = labelText;
 }
}
```
TwitterBootstrap3対応のCakePluginはTwitterBootstrapではない


2系によく使われていたCakeのプラグインにTwitterPluginがあったが、3系にバージョンアップした時に当然そのままではページネーションが効いてなかった。
TwitterBootstrapのGithubを見に行くと1年近く更新がなかったので、他のプラグインが無いか探していたら同じ方が3系と2系に対応したプラグインを開発していたので、ありがたく使わせていただきました。

### BoostCake インストール手順
1.以下のURLに置いてあるリポジトリをCakeのPluginディレクトリにcloneしてくる。
http://slywalker.github.io/cakephp-plugin-boost_cake/
2.プラグインを読み込む
Config/bootstrap.phpに下記コードを追加

```PHP:bootstrap.php
CakePlugin::load('BoostCake');
// または
CakePlugin::loadAll();
```

3.利用するControllerからプラグインを読み込む

```PHP:HogeController.php
class HogeController extends AppController {
	public $name = 'Hoge';

	// BoostCakeを読み込み
	public $helpers = array(
		'Html' => array('className' => 'BoostCake.BoostCakeHtml'),
		'Form' => array('className' => 'BoostCake.BoostCakeForm'),
		'Paginator' => array('className' => 'BoostCake.BoostCakePaginator'),
	);
}
```

これで準備OK

### BoostCake ページネート
入れ替えた時にぱっと見で崩れていたのがページネートくらいだったので、ひとまずページネートのみ
他にも修正が必要な箇所があれば適宜追加して行きます。

```PHP:before_view
<?php
	echo $this->Paginator->pagination(array(
		'div' => 'pagination'
	));
?>
```

```PHP:after_view
<?php
	echo $this->Paginator->pagination(array(
		'ul' => 'pagination'
	)); 
?>
```
Cygwinのknife solo cookがconnection closed by remote hostでコケル件

Windows版のChef-DKが出れば意味がなくなると思うのですが。

cygwinでknife soloを実行したところ以下のようなエラーが出ました。

```shell-session
$ knife solo cook sample
Running Chef on sample...
Checking Chef version...
Uploading the kitchen...
ERROR: Net::SSH::Disconnect: connection closed by remote host
```

こちらで報告されている事象のようです。
https://github.com/matschaffer/knife-solo/issues/332

knife-soloが0.4.1では以下のようなワークアラウンドが紹介されていました。
https://github.com/keeruline/knife-solo/commit/d57894b671fa25a791d8302e2ada7b6be2d7d72f

0.4.2では該当コードが編集されておりましたが、不具合はまだ直っていないようです。
よくわからないのですが、以下のようにコメントアウトしたら動きました。

```shell-session
$ vi /usr/lib/ruby/gems/1.9.1/gems/knife-solo-0.4.2/lib/knife-solo/ssh_connection.rb
```

```ruby:solo/ssh_connection.rb
    def session(&block)
+#      @session ||= begin
-      @session ||= begin
        if connection_options[:gateway]
          co = connection_options
          gw_user,gw =  co.delete(:gateway).split '@'
          Net::SSH::Gateway.new(gw, gw_user).ssh(host, user, co, &block)
        else
          Net::SSH.start(host, user, connection_options, &block)
        end
+#      end
-        end
    end
```
WebViewClient#onPageStarted() が二回呼ばれることがある


インターネット接続を切った状態でWebViewで適当なページヘアクセスすると、`WebView#setWebViewClient()` でセットしたクラスの `onPageStarted()` が二回呼ばれてしまいます。

[stackoverflow](http://stackoverflow.com/questions/5476797/webviewclient-onpagestarted-called-twice-when-specifying-non-existent-url-via)によると、どうやらアクセスに失敗した時は以下の順でメソッドが呼ばれる模様。

```
onPageStarted()
onLoadResource()
onReceivedError()

onPageStarted()
onLoadResource()
onPageFinished() 
```

_`onPageStarted()` の中で初期化処理をしているので、何度も呼ばせたくない！_
のですが、こればかりは如何ともし難い。

`onReceivedError()` は一度しか呼ばれないので、このタイミングでフラグを立てて初期化処理をスキップすることで、どうにか解決する事が出来ました。
大体こんな感じ。どこか再試行のタイミングでフラグを折ってやる必要がある。

```HogeActivity.java

// （前略）

private boolean mErrored;

@Override
public void onCreate(Bundle savedInstanceState) {
	// エラーのフラグ。これがtrueのときは初期化処理を行わない
	this.mErrored = false;
	
	// （中略）
	
	webView.setWebViewClient(new WebViewClient(){
		@Override
		public void onPageStarted (WebView view, String url, Bitmap favicon) {
			if (!mErrored) {
				// 初期化処理
			}
		}

		@Override
		public void onReceivedError (WebView view, int errorCode, String description, String failingUrl) {
			mErrored = true;
		}
	});
}

// （後略）
```
ImplicityUnwrapOptional型な戻り値の関数の扱い方


Class Referenceを見てて

```swift
// ImplicityUnwrapOptional<View>な型を返す関数
func hoge(_ identifier: String!) -> View!
```

こういう定義の関数がわりと良くあるんですが、nilをunwrapしようとすると'nilはunwrapできないぜ'的なランタイムエラーを吐くので、ああ、戻り値がImplicityUnwrapOptional型な関数は絶対値を返すという意味なんだと思ってました。

ところが、とあるAPIが普通にこのエラーで落ちたので、どうしたものかと悩んでいたのですが、対策法を見つけたのでメモします。

```swift
// hoge関数が戻り値nilの場合はimplicitryUnwrapでランタイムエラーになる
var hogeView = hoge()

// Optional Chainingでアンラップしてやると、ランタイムエラーの代わりにnilを返す
var hogeView = hoge()?
// hogeViewはnilなので、ここでnilチェックが発生する
```

## ここまで書いておいて
やっぱりImplicityUnwrapOptionalな型を返すと定義している関数がコールしただけでランタイムエラーっていうのは微妙なので、Option型を返すって定義するべきなんじゃないかなぁと思いました。(つまりバグやと思うんですが。毎回こんなん恐れるんだったらOption採用した意味ないしね。)
WAVをAsterisk用のGSMへ変換する

メモ

# WAV to GSM
```bash:
# 準備
brew install sox

# 再生確認
afplay in.wav

# 変換
sox in.wav -r 8000 -c 1 out.gsm
```

# GSM to WAV
```bash:
# 準備
brew install ffmpeg

# 変換
ffmpeg -i in.gsm out.wav

# 再生確認
afplau out.wav
```

# Asteriskの音声ファイル置き場
`/var/lib/asterisk/sounds/ja/`
widgets can only be called when ZLE is active とは何だったのか

## tl;dr

`zle -N` してからの `bindkey` を使え。

## きっかけ

* http://shibayu36.hatenablog.com/entry/2013/10/07/185048

こちらで紹介されている

```zsh
function percol-cdr () {
    local selected_dir=$(cdr -l | awk '{ print $2 }' | percol --query "$LBUFFER")
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N percol-cdr
```

これを読み込んで、おもむろに `percol-cdr` という **関数を** 呼び出し、やった！ これでぼくもナウいpercolユーザだ！ ってやろうとすると

```bash
$ percol-cdr
percol-cdr:zle:4: widgets can only be called when ZLE is active
percol-cdr:zle:6: widgets can only be called when ZLE is active
```

って言われてcdできない。

## `when ZLE is active` is when?

なんかzshのソースコードを追いかけたり無駄なことをしていたんですけど、記事にもある通り要するに

```zsh
bindkey '^@' percol-cdr
```

をして `^@` すれば想定したように動く。

### zle の組込みコマンドはシェルから直接呼び出せない

```zsh
BUFFER="ls -l"
zle accept-line
```

とシェルに打ち込んでも、同じようにエラーになる。一方で、デフォルトでは `<ESC>-x` に割り当てられている `execute-named-cmd` を呼び出し、

```shell-session
udzura@localhost ~$ <ESC>-x
execute: accept-line_
```

であればエラーにはならない（BUFFERは指定できないけど）。

### zle、bindkeyの中でzshっぽい動きを呼び出すのに使う感じある

ZLE がアクティブになるのは、要するに「bindkeyで呼び出されたwidgetの内部処理のコンテクスト」である、ということと考えられる。

簡単な例で。

```zsh
$ ls-l () { BUFFER='ls -l'; zle accept-line }
$ ls-l
ls-l:zle: widgets can only be called when ZLE is active

$ zle -N ls-l
$ bindkey '^[l' ls-l
$ <ESC>-l
# ls -l の結果がズラー
```

なので、zleのウィジェットを呼び出したりして色々操作したい時は、こんな感じが定石みたい。

* 関数作る
* 関数を `zle -N` でウィジェット登録する
* ウィジェットを `bindkey` して使う

`BUFFER` のような変数もそのコンテクストでのみ使えるものであるようだ。

## つーか

まあ [man zshzle](http://linux.die.net/man/1/zshzle) の長ったらしい英文をちゃんと読めば分かる気がするけど...

この辺日本語情報ググっても出なくて、zshマスター各位はみんなちゃんと読んでるのだろうか...と思った。

## まとめ

zsh弱者はoh-my-zshでも使ってろということなのだろう...

しかしこの辺の挙動が分かったので、今後はカスタムウィジェット作りまくってしまう気もする。
連続型確率分布を可視化する

[以前に書いた連続確率分布](http://qiita.com/ynakayama/items/42ece37f040c45863d9a)について R を利用して可視化してみます。

## コード

```R
n = 1000
df = 1
shape = 1
shape1 = 1
shape2 = 1
rate = 10
df1 = 10
df2 = 20

draw <- function (x, image) {
  png(image, width = 480, height = 480, pointsize = 12, bg = "white", res = NA)
  hist(x)
  dev.off()
}

x = runif(n, min=0, max=1)
draw(x, 'runif.png')
x = rnorm(n, mean=0, sd=1)
draw(x, 'rnorm.png')
x = rlnorm(n, meanlog = 0, sdlog = 1)
draw(x, 'rlnorm.png')
x = rgamma(n, shape, rate = 1, scale = 1/rate)
draw(x, 'rgamma.png')
x = rbeta(n, shape1, shape2)
draw(x, 'rbeta.png')
x = rchisq(n, df, ncp=0)
draw(x, 'rchisq.png')
x = rt(n, df)
draw(x, 'rt.png')
x = rf(n, df1, df2)
draw(x, 'rf.png')
x = rcauchy(n, location = 0, scale = 1)
draw(x, 'rcauchy.png')
x = rcauchy(n, location = 0, scale = 1)
draw(x, 'rcauchy.png')
x = rexp(n, rate = 1)
draw(x, 'rexp.png')
x = rlogis(n, location = 0, scale = 1)
draw(x, 'rlogis.png')
x = rweibull(n, shape, scale = 1)
draw(x, 'rweibull.png')
```

### 連続一様分布

![runif.png](https://qiita-image-store.s3.amazonaws.com/0/38501/189e045f-aa48-a451-4fe7-c83f0a270795.png)

### 正規分布

![rnorm.png](https://qiita-image-store.s3.amazonaws.com/0/38501/13dbe84b-9240-4a6e-87b0-7c33b968a5e1.png)

### 対数正規分布

![rlnorm.png](https://qiita-image-store.s3.amazonaws.com/0/38501/3d9da225-d19e-9315-2aba-2df455a22785.png)

### ガンマ分布

![rgamma.png](https://qiita-image-store.s3.amazonaws.com/0/38501/5790874d-5cd1-6805-ee6e-4079cdb14e56.png)

### ベータ分布

![rbeta.png](https://qiita-image-store.s3.amazonaws.com/0/38501/e4535f31-e9b1-23b5-da76-7b6774601182.png)

### カイ二乗分布

![rchisq.png](https://qiita-image-store.s3.amazonaws.com/0/38501/96990610-3ea6-614d-3edc-7d65f053a5e9.png)

### t 分布

![rt.png](https://qiita-image-store.s3.amazonaws.com/0/38501/8c38dc53-f629-0aee-1b3a-a4eeacf45121.png)

### F 分布

![rf.png](https://qiita-image-store.s3.amazonaws.com/0/38501/0906c934-6e47-1e0b-b8e0-f4afe92e2fe8.png)

### コーシー分布

![rcauchy.png](https://qiita-image-store.s3.amazonaws.com/0/38501/0549a06a-4780-d06e-f4ea-e30f2c533cea.png)

### 指数分布

![rexp.png](https://qiita-image-store.s3.amazonaws.com/0/38501/16a31841-999e-27d8-fd21-967e355e1a94.png)

### ロジスティック分布

![rlogis.png](https://qiita-image-store.s3.amazonaws.com/0/38501/3adfa8b5-8507-ae56-acaf-0ab52fe3b8b3.png)

### ワイブル分布

![rweibull.png](https://qiita-image-store.s3.amazonaws.com/0/38501/6f65eaf8-ee7e-3f1e-5cf4-83ba5b80cfb1.png)

## まとめ

可視化してみると確率分布についてのイメージがよりとらえやすくなったかと思います。

## 参考

R の確率分布システム
http://www.okada.jp.org/RWiki/?R%A4%CB%A4%AA%A4%B1%A4%EB%B3%CE%CE%A8%CA%AC%C9%DB

確率分布と乱数
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/60.html
lsで特定のファイルだけ除外して色を付ける


`--color`で色が付く。`--ignore`は複数指定可能。

```
ls --ignore hoge1 --ignore hoge2 --color
```

こういうのに頼り始めたら、それはろくでもない管理スクリプトになり始めていると思うので気を付けましょう。
How to install curl 7.37.0 with CentOS 6.5

curl のバージョンを上げたのでメモ。

> 仮想 PC 上でやってるので、Guest Additions をインストールした段階で gcc とかはインストールされるんで、そういう前提で書いてます。
> そうでないヒトはとりあえず `yum groupinstall "Development Tools"` をすればオッケーだと思います。
> c.f. [CentOSのDevelopment Tools - Qiita](https://qiita.com/n-yamanaka/items/756f5c337769483778bc)

# openssl のライブラリが要ります

```shell-session
$ sudo yum install openssl-devel
```

# ソースのダウンロード

http://curl.haxx.se/latest.cgi?curl=tar.bz2 から適当なミラーを選んでダウンロードします。

```shell-session
$ wget http://curl.haxx.se/download/curl-7.37.0.tar.bz2
```

# configure

```shell-session
$ tar xf curl-7.37.0.tar.bz2
$ cd curl-7.37.0
$ ./configure --enable-libcurl-option
```

`--enable-libcurl-option` を付けることによって、`libcurl` もコンパイルしてくれるみたいです。

以下 `configure` の出力です。
ssl がサポートされていることが分かります。
ssh とか、サポートされてない機能も沢山あるけど、僕は今のところ要らないので…。

```text
  curl version:     7.37.0
  Host setup:       x86_64-unknown-linux-gnu
  Install prefix:   /usr/local
  Compiler:         gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      no      (--with-libssh2)
  zlib support:     enabled
  GSS-API support:  no      (--with-gssapi)
  SPNEGO support:   no      (--with-spnego)
  TLS-SRP support:  no      (--enable-tls-srp)
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  ipv6 support:     enabled
  IDN support:      no      (--with-{libidn,winidn})
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   /etc/pki/tls/certs/ca-bundle.crt
  ca cert path:     no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     enabled
  RTMP support:     no      (--with-librtmp)
  metalink support: no      (--with-libmetalink)
  HTTP2 support:    disabled (--with-nghttp2)
  Protocols:        DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMTP SMTPS TELNET TFTP
```

# コンパイルとインストール

```shell-session
$ make
$ sudo make install
```

# バージョンチェック

```shell-session
$ curl --version
curl 7.37.0 (x86_64-unknown-linux-gnu) libcurl/7.37.0 OpenSSL/1.0.1e zlib/1.2.3
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz
```
lessとgrepに色を付けてコードを読みやすく

コードを眺める時って結局grepとlessだけ使ってたりする。たまにvimとかviewとか使うかもしれない。そういう時に読みやすい設定を作ろう。

まず[GNU Source Highlight](http://www.gnu.org/software/src-highlite/)を入れる。

* yumの場合

```
# yum install source-highlight
```

* aptの場合

```
$ sudo apt install source-highlight
```

これでlessにコードハイライトを付けられるのだが、色シーケンスを解釈させるようlessに`-R`オプションを追加する必要がある:

```
LESS=' -R '
LESSOPEN='| src-hilite-lesspipe.sh %s'
```

環境変数で設定してある。Ubuntuの人はフルパス`/usr/share/source-highlight/src-hilite-lesspipe.sh`を書いて下さい。

次に、grepが寂しいので少しオプションを追加:

```
grep --with-filename --line-number --color=always
```

alias張るとかGREP_OPTIONS変数に入れるなどする。`--with-filename`でファイル名を出力、`--line-number`で行番号を出力、`--color=always`でlessにも色シーケンスを出力。

```
grep -R hoge * | less
```

とかすると色付きで長いgrepを見れるようになる。

レガシーでかっこ悪さMAXのfuxkingな糞ツールと思われがちなlessやgrepですが、オプションで見た目整えることでシンプルでいいツールになると思います。

#参考文献
* [漢(オトコ)のコンピュータ道: lessでソースコードに色をつける](http://nippondanji.blogspot.jp/2011/11/less.html)
文字列のベクトルの検索や比較 grep( )辺り

文字列からなるベクトル`string`があり、ある要素`pattern`がそのベクトルに含まれているかを知りたい。検索したい。

## grep( )
`grep(pattern,x)`関数を使うと、ある文字列`pattern`を`x`で指定されたstringから検索する。

`grep(x=c("美しい","日本","の"),pattern="美")
[1] 1  `
xの1つめの要素"美しい"だけが、patternとマッチ

引数`x`には文字列のベクトルをとることができるが、`pattern`にベクトルを指定すると、
`引数 'pattern' は 1 を超える長さなので、最初の要素だけが使われます `というエラーメッセージがでる。

## match( )
`pattern`に複数の要素を含むことができる。
`match(pattern,string)`で、完全一致で検索する。
`match(c("美しい","国"),c("美しい","日本","の","美しい"))
[1]  1 NA`
一致した最初の要素が何番目かを返す。string[1]に一致しているが、[4]は無視。

## charmatch( )
文字列がアルファベットだと部分一致で判断する。

`charmatch(pattern,string)`で、部分一致で検索する。
`charmatch(c("m","med","n"), c("mean", "median", "mode"))
[1]  0  2 NA`
pattern[1]の`m`は複数ヒットしているので、0になってしまう。

## str_detect( )
`library(stringr)`の`str_detect(string,pattern)`関数は、`string`と`pattern`の要素数が同数なら、`pattern`にベクトルを使える。
同数でないときは、`pattern`の最初の要素が使われる。
ベクトルの要素同士で、部分一致しているかどうかの判断ができる。

`str_detect(c("美しい","日本","の"),c("美","日本","国"))
[1]  TRUE  TRUE FALSE`

## `is.element( )`の場合
ベクトルの要素同士で、完全一致で比較する。`%in%`でも同じ。
`is.element(pattern,string)`
`is.element(c("美しい","日本","の"),c("美","日本","国"))
[1] FALSE  TRUE FALSE`


# まとめ。
`grep( )`：`pattern`となる要素が1つの時、部分一致で検索。
`match( )`：`pattern`となる要素が複数の時、完全一致で検索。
`charmatch( )`：`pattern`となる要素が複数の時、部分一致で検索
`is.element( )`：`pattern`となる要素が複数の時、完全一致で検索。
`str_detect( )`：`pattern`となる要素が1つの時か、`pattern`と`string`の要素の数が同数の時、部分一致で検索。


`pmatch( )`は宿題。
`stringr`パッケージには、他にも関数がある。
Gruntjsでutf-8のhtmlをshift-jisにして出力する方法

shift-jisのhtmlを出力したいとき、
出力元htmlはutf8にして出力先htmlをshift-jisにすれば、
includereplaceなどでhtml結合しても文字化けなどに悩まされずに済みます。


package.json

```js
{
  "name": "grunt_encoding",
  "version": "0.0.0",
  "description": "file encofing sample",
  "author": "svartalfheim",
  "license": "MIT",
  "devDependencies": {
    "grunt": "^0.4.5",
    "grunt-contrib-copy": "^0.5.0",
    "iconv-lite": "^0.4.3"
  }
}
```

Gruntfile.js

```js
var iconvLite = require('iconv-lite');

module.exports = function(grunt) {

  var pkg = grunt.file.readJSON('package.json');

  // Project configuration.
  grunt.initConfig({
    copy:{
        html:{
            options:{
                encoding:'utf8',
                process:function( content ){
                  return iconvLite.encode(new Buffer(content),'shift_jis');
                }
            },
            files:{
                'dst/index.html':'src/index.html'
            }
        }
    }
  });

  // These plugins provide necessary tasks.
  Object.keys(pkg.devDependencies).forEach(function (devDependency) {
      if (devDependency.match(/^grunt\-/)) {
          grunt.loadNpmTasks(devDependency);
      }
  });

  grunt.registerTask('default', ['copy']);

};

```

ポイントはiconv-lite (https://github.com/ashtuchkin/iconv-lite) を用いてgrunt-contrib-copyのoptions.processで文字コードの変換処理をいれてコピーしてあげることです。
Laravelプロジェクト内のviewsのキャッシュクリアコマンドを追加する

ページを表示した際にapp/storage/views直下にキャッシュが溜まっていきますが、
これを削除するコマンドがデフォルトでありませんでしたので追加しました。


# 方法

キャッシュクリアのコマンドの実装自体はこちらにコードがありましたので、行いません。

https://gist.github.com/cjonstrup/8228165


なので、これをコマンドとして追加していきますー。


## コマンドの追加方法

まずは、app/start/artisan.php内に追加するコマンド名を記述します。

    <?php

    /*
    |--------------------------------------------------------------------------
    | Register The Artisan Commands
    |--------------------------------------------------------------------------
    |
    | Each available Artisan command must be registered with the console so
    | that it is available to be called. We'll register every command so
    | the console gets access to each of the command object instances.
    |
    */
    
    Artisan::add(new ViewsCommand);


次に、先ほどのキャッシュクリアコマンドのファイルをapp/commands/ViewsCommand.phpとして
配置します。


これで完了です！簡単ですね〜


## 実行してみる

あとは、php artisan listでviews:clearが追加されていることを確認して、
php artisan views:clearするとapp/storage/views以下がクリアされているはずです！


他にもartisanコマンドは色々と改造できますので、
http://laravel4.kore1server.com/docs/42/commands
を参考にやってみてください！
続編 - RubyにHaskellよりも強力なパターンマッチを実装した

一ヶ月ほど前に、[RubyにHaskellなどのような関数型言語のパターンマッチよりも強力なパターンマッチを実装したという記事](http://qiita.com/egisatoshi/items/38f7f8aef32ac67ccd4b)を書きました。
その後、大きな進捗があったので、そのことについて書きたいと思います。

本ライブラリのソースコードは[GitHub](https://github.com/egison/egison-ruby)に公開しています。

## ストリーム (無限リスト) に対するパターンマッチ

[antimon2さん](https://github.com/antimon2)の[プルリクエスト](https://github.com/egison/egison-ruby/pull/5)により、ストリーム (無限リスト) に対するパターンマッチが行えるようになりました。
パターンマッチの結果もストリームとして返されるので無限の結果を持つパターンマッチを実行することもできます。
例えば、以下のように素数の無限列の中から双子素数をすべて取り出すパターンマッチを記述することができます。

```rb
require 'egison'
require 'prime'

include Egison

twin_primes = match_stream(Prime) {
  with(List.(*_, _x, __("x + 2"), *_)) {
    [x, x + 2]
  }
}

# print the first 10 prime twins
p twin_primes.take(10)
#=>[[3, 5], [5, 7], [11, 13], [17, 19], [29, 31], [41, 43], [59, 61], [71, 73], [101, 103], [107, 109]]
```

このコードもとても美しいと思いませんか？
初めて[Egison](https://github.com/egison/egison)で無限のパターンマッチを行えるようにして[これに対応するコード](http://www.egison.org/demonstrations/sequence.html)を動かした時、僕はとても感動しました。
既存の言語でも無限リストに対するパターンマッチは書けますが、全ての双子素数を直接列挙するようなパターンを簡単に書くことができません。
既存の言語では簡潔に記述できないプログラムを、本質的でかつ一般的な新たな構文を考えることによって簡潔に記述して動かすことは、プログラミングをしていて一番おもしろいことのひとつだと僕は思っています。

## 反響と今後の活動

[Twitter上でも多くの反応](http://togetter.com/li/673312)があり、その後、1ヶ月の間に[Hacker News](https://news.ycombinator.com/)上でも2度も話題になり、日本だけでなく世界的にEgisonのパターンマッチについて知ってもらうことができました。([1回目](https://news.ycombinator.com/item?id=7924168)、[2回目](https://news.ycombinator.com/item?id=7992661))
それにより、[antimon2さん](https://github.com/antimon2)のようなEgisonを理解して貢献してくださる方も現れてとても嬉しかったです。
また、[Ruby Weekly](http://rubyweekly.com/issues/200)でもEgisonが取り上げられたようです。
さらに、今年の9月開催の[RubyKaigi 2014](http://rubykaigi.org/2014)で、Egisonのパターンマッチについて発表させていただけることにもなりました。
より多くの方に面白いと思ってもらえるように良いプレゼンをしたいと思います。

OSSを広めるのは本当に大変だといつも思います。
日々少しずつでも開発も進めていきたいと考えています。

Egisonの理論を多くの方に理解してもらいたいと考え、[Egisonについての論文](http://arxiv.org/pdf/1407.0729.pdf)も公開しています。
ぜひ読んでみてください。

最後に、Rubyistの皆さん、[egison-ruby](https://github.com/egison/egison-ruby)を使うのにぜひ挑戦してみてください。
laravel4 helper関数の追加

#専用のhelper関数を作りたい

##composer.jsonの編集

```composer.json
    "autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php",
            "app/extensions"
        ],
        "files": [ // <- 追加
            "app/helpers.php" // <- 追加
        ] // <- 追加
```

###dump-autoloadを実行

```zsh
%composer dump-autoload
```

##app/にhelpers.phpを作成

```app/helpers.php
<?php

function temp_path()
{
    return storage_path() . '/temp';
}

function backup_path()
{
    return storage_path() . '/backup';
}

function restore_path()
{
    return storage_path() . '/restore';
}
```

##確認

```app/views/index.blade.php

{{backup_path()}}

```

表示された。

OK
Rubyハマりメモ：CSV::Tableのヘッダ名指定

##ハマったコード（の一部）
CSV::Tableを使ってヘッダ名を指定して配列を作ろうとすると中身がnilになってしまう。

```ruby:read_csv.rb
person_list = CSV.table('person_list.csv', encoding: 'UTF-8:UTF-8')
id_array = person_list["id"]
name_array = person_list["name"]
```

```text:console
p id_array
=> [nil,
nil,
nil,
...
```


##解決策
ヘッダ名をStringでなくSymbolで指定しないとダメっぽかった。

```ruby:read_csv.rb
person_list = CSV.table('person_list.csv', encoding: 'UTF-8:UTF-8')
id_array = person_list[:id]
name_array = person_list[:name]
```

```text:console
p id_array
=> [1001,
1002,
1003,
...
```
How to install bash 4.3.0 with CentOS 6.5

CentOS 6.5 のデフォルトの bash が少々古いのでインストールしました。

# ソースのダウンロード

`http://www.gnu.org/software/bash/#download` から適当なソースをダウンロードします。今回は `http://mirror.jre655.com/GNU/bash/bash-4.3.tar.gz` を使いました。

```shell-session
$ wget http://mirror.jre655.com/GNU/bash/bash-4.3.tar.gz
```

# コンパイルとインストール

```shell-session
$ tar xf bash-4.3.tar.gz
$ cd bash-4.3
$ ./configure
$ make
$ sudo make install
```

# バージョンチェック
```shell-session
$ bash --version
GNU bash, バージョン 4.3.0(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

インストール先は `/usr/local/bin` なんでシクヨロ。
CakePHP に findOrCreate() を実装する

### 概要

Laravel の Eloquent ORM で提供されているメソッド、findOrCreate() を CakePHP に移植する。

### 使い道

User に hasOne や hasMany で依存するテーブルが存在する（Profile など）場合で、User レコードのデータを元に Profile のレコードを新規作成／更新する場合にレコードの存在の有無を気にせずに取得して更新、といった使い方ができる。

### コード

モデル内で実行されることを想定しています。 AppModel のような基底クラスを作成して継承させるか、ビヘイビアで実装するかはお好みで。

```php
/**
 * レコードを検索し、該当するレコードが存在しない場合には
 * 検索した情報でレコードを新規作成する
 *
 * @access public
 * @param  Array $params 検索するカラム名と値の配列
 * @return Array 該当した、もしくは新規作成されたレコード
 */
public function findOrCreate( $params = array() ) {
	$options = array(
		'fields' => array( '*' ),
	);

	// 検索するカラム名、値を conditions 配列に格納する
	if ( false === is_array( $params ) ) {
		$params = array( 'deleted' => 0 );
	}

	if ( false === array_key_exists( 'deleted', $params ) ) {
		$params['deleted'] = 0;
	}

	if ( is_array( $params ) ) {
		$options['conditions'] = array();
		foreach ( $params as $column_name => $param ) {
			$options['conditions'][ $this->name . '.' . $column_name ] = $param;
		}
	}

	$record = $this->find( 'first', $options );

	// レコードが存在する場合はレコードを返して終了
	if ( is_array( $record ) && 1 <= count( $record ) ) {
		return $record;
	}

	// レコードが存在しない場合はレコードを作成する
	$this->create();
	if ( array_key_exists( $this->primaryKey, $params ) ) {
		unset( $params[ $this->primaryKey ] );
	}
	$params['created'] = date( 'Y-m-d H:i:s' );
	$this->save( $params );

	return $this->find( 'first', $options );
}
```
Android4.xでplaceholderのline-heightが効かない問題

備忘録的な。

Android4.x において、placeholderを使用した際、
line-heightの値を変更しても何も変化が起きなくてハマり。

input type="text"の上の方に、placeholderがびたーっと張り付く問題。

下記サイトに書いてあったのを試したら解決した。

```lang:css
.hoge {
  line-height: normal;
}
```

参考：http://diao.it/blog/2014/01/07/android-4-placeholder-line-height/

自分ひとりじゃ、これに辿り着ける気がしない。。
ありがとう、上記サイトの人。
Unity 4.5 選択中のゲームオブジェクトの子に空のゲームオブジェクトを生成する

#Unity 4.5 選択中のゲームオブジェクトの子に空のゲームオブジェクトを生成する
　
## いままで

- Create Emptyでは、プレビューのカメラ位置に影響したpositionの値が初期値で設定されていました
- まっさらのオブジェクトが作りたいのに、地味にpositionの値が邪魔
- ヒエラルキー上で親子関係を変更すると、親に影響されてスケールの値が変わったり

　
## Unity 4.5から

- Hierarky上でゲームオブジェクトを選択し、以下をメニューから選択するだけ


```
GameObject/Create Empty Child
```


- 選択したオブジェクトの子に、空のオブジェクトが追加されます

- 何も選択せずに実行すれば、原点に生成されます
JDK、JREをwgetでダウンロード

#はじめに
備忘録的な記述です。メールアドレス登録がめんどうなので。
oracle側の仕様が変われば使えなくなるTipsレベルなので、ご利用は適当に。

#手順
##ブラウザから
Oracle Java Archiveを開きます
http://www.oracle.com/technetwork/java/javase/archive-139210.html

![スクリーンショット 2014-07-09 14.39.11.png](https://qiita-image-store.s3.amazonaws.com/0/12362/ee00749a-b32f-28dd-5254-3c0150908581.png)

###Agreementを受け入れていない場合
リンクの表示部はvoid(0)とでています。

![スクリーンショット 2014-07-09 14.43.44.png](https://qiita-image-store.s3.amazonaws.com/0/12362/610a86ba-6cff-738e-91b3-a8ed16c30c87.png)


###Agreementを受け入れる
リンクの表示部はダウンロードするURLが表示されます。
![スクリーンショット 2014-07-09 14.44.04.png](https://qiita-image-store.s3.amazonaws.com/0/12362/75495bd1-8b00-8579-cec5-300d1f0c72e6.png)

##Terminalから
Agreementを受け入れたときに表示されたURLを使い、URLに含まれるパスは下記のように変更します。

```
http://download.oracle.com/otn/
↓
http://download.oracle.com/otn-pub/
```


##例
>$ wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin

--no-cookies はサイトでのCookieを回避するために
--no-check-certificateは、私の環境ではつけなくてもダウンロードできました。たぶん出来ない場合もあるからついているんだと思います。

##リネームがいる
ダウンロードしたファイルのお尻に
>?AuthParam=・・・

からはじまる余計なパラメータがついている場合がありますので
mvなどで名前を変更して下さい
#参考URL
http://qiita.com/hajimeni/items/67d9e9b0d169bf68d1c9
https://gist.github.com/P7h/9741922
https://ivan-site.com/2012/05/download-oracle-java-jre-jdk-using-a-script/

#さいごに
 oraclelicense=accept-securebackup-cookie
が変わってしまえば、使えなくなります・・・
proxyっぽいオブジェクトで思いつきを実装

思いつきで実装したらできたので。
あまり試してないので、どの程度汎用的かはわかりません。

http://www.binarylogic.com/2009/08/07/how-to-create-a-proxy-class-in-ruby/ を参考にしました。


```rb
class TraversalProxy
  instance_methods.each { |m| undef_method m unless m =~ /(^__|^send$|^object_id$)/ }

  def initialize(x)
    @x = x
  end
  
  def method_missing(method_name, *args)
    @x.map do |x|
      x.__send__(method_name, *args)
    end
  end
end

module Enumerable
  def traversal
    TraversalProxy.new(self)
  end
end
```

こんなふうにするとmapの代わりに使えます。

```
p [:a, :b, :c].traversal.to_s
```

引数を渡すときなんかにはmapより直感的な気がします。要素ごとに引数を変更したりはできませんが。

同様にこんなものも作ってみました。

```rb
class NullableProxy
  instance_methods.each { |m| undef_method m unless m =~ /(^__|^send$|^object_id$)/ }

  def method_missing(method_name, *args)
    return nil
  end
end

class Object
  def z?
    self
  end
end

class NilClass
  def z?
    NullableProxy.new
  end
end
```

```rb
a = nil
b = :hello

p a.z?.to_s
p b.z?.to_s
```

モナド風？
emacs package-list-packagesの操作一覧

# 概要
package-list-packagesで実行する操作一覧．
# 操作一覧
|操作|内容|
|------|------|
|x|マークの実行|
|i|インストールマーク|
|d|削除マーク|
|u|マーク解除|
|U|アップグレード|
|h|ヘルプ表示|
|r|一覧の更新|
|~|古いパッケージに削除マーク|
|q|終了|
UbuntuソフトウェアセンターでMySQLをインストールする

「Ubuntuソフトウェアセンター」を使えば、MySQLのサーバ・クライアント、及びGUIツールが簡単にインストールできます。（私の環境は、Ubuntu 14.04LTSです。）

# インストール
「Ubuntuソフトウェアセンター」を起動し、mysqlで検索します。検索結果の中から、以下をインストールします。（下図参照）

- MySQLワークベンチ（MySQLのGUIクライアント）
- MySQLサーバ
- MySQLクライアント

![スクリーンショット_070914_034309_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/d8ea1f22-df9c-79c3-917e-fc8f36eeb49b.jpeg)

以上で終わりです、簡単ですね。

# セットアップ

端末を開き、以下のコマンドを実行します。

```bash:
$mysql_secure_installation
```

不必要なユーザの削除や、rootパスワードの設定など、最低限対応しておきたい項目を対話形式で設定できます。

```bash:
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't exist
 ... Failed!  Not critical, keep moving...
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!
```
Rails で データベースに index を張る時に Index name 'xxx' on table 'table name' is too long. が出た時の対処法


# Rails で データベースに index を張る

例えばこんな感じに張ろうとした場合、

```20140709055450_add_index_table
    add_index :models, [:sex, :age, :region, :position, :rank, :constellation, :blood_type ], :unique => true
```

下記のように起こられてしまいます。index の名前の長さに制限があるようです。

```
Index name '---' on table 'models' is too long; the limit is 64 characters
```

# index に名前を付ける

index の名前は独自でつけることが可能なので短い名前をつけて回避。

```20140709055450_add_index_table
    add_index :models, [:sex, :age, :region, :position, :rank, :constellation, :blood_type], :unique => true, :name => 'model_setup_index'
```
Goでファイルを読んで別のgoroutineに渡す

Go言語で以下の頻出操作を行うスニペットを書いた。

- ファイルをバイト列として読む
- ファイルの内容をチャンネルで別のゴルーチンに渡す(そこで標準出力する)
- チャンネルのクローズを検出しゴルーチンの終了処理を適切に行う

```go
package main

import (
        "flag"
        "fmt"
        "io"
        "log"
        "os"
)

func main() {
        flag.Parse()
        in_file := flag.Arg(0)

        f, e := os.Open(in_file)
        if e != nil {
                log.Fatal(e)
        }
        defer f.Close()

        ch := make(chan []byte)
        done := make(chan struct{})

        // 標準出力用ゴルーチン起動
        go func() {
        loop:
                for {
                        select {
                        case b, ok := <-ch:
                                if !ok { // selectでchanのクローズを検知する方法
                                        fmt.Println("ch is closed")
                                        break loop
                                }
                                fmt.Println(b)
                        }
                }
                fmt.Println("End of goroutine")
                done <- struct{}{}
        }()

        // ファイルRead用forループ
        for {
                buf := make([]byte, 32)
                if n, e := f.Read(buf); e != nil {
                        if e != io.EOF {
                                log.Fatal(e)
                        }
                        break
                } else {
                        ch <- buf[0:n]
                }
        }
        close(ch) // ファイル終端でchをcloseする

        // 非同期に実行されているゴルーチンの終了を待つ。
        <-done
        fmt.Println("End of main")
}
```

```
$ go run main.go ./test.txt
[158 224 103 77 111 33 95 39 188 146 170 235 91 131 179 220 242 230 54 155 28 133 74 173 244 247 31 51 64 3 46 156]
[39 169 91 192 127 169 65 225 11 114 59 49 216 115 158 55 93 79 55 47 160 40 233 23 131 217 80 41 92 149 101 103]
[218 177 14 79 225 93 123 229 14 65 68 242 84 59 118 198 52 73 215 50 136 189 20 225 87 240 156 178 175 85 102 45]
[34 124 209 135 158 151 224 165 7 3 209 220 45 87 47 115 123 98 32 10 217 172 149 26 41 78 88 186 116 87 251 218]
ch is closed
End of goroutine
End of main
```
Mac + IntelliJ 13でScalaのHello Worldまで

#### HomeBrewでscalaとsbtをインストール
> brew install scala
> brew install sbt

#### IntelliJのscalaプラグインとsbtプラグインをインストール
Intellij -> Preference -> plugins -> browse repositories
scalaプラグインとsbtプラグインを入れて再起動

#### HelloWorld実行
Intellij -> Create new project -> Scala -> SBT -> Helloworldとか適当に名前を付ける
Project SDKはJDKで良い?

生成されたプロジェクトのsrc>main>scalaの上で右クリック (srcフォルダが生成されるまで少し時間がかかります)
new>scala classでHelloScalaというクラスを作って以下をコピペ

```scala
import util.Properties

object HelloScala {
  def main(args: Array[String]) :Unit = {
    println("Hello, Scala!")
    println(Properties.versionString)
  }
}
```

HelloScalaを右クリック -> Runで実行
Migration時のログを黙らせる

# 発端

データベースを動的に作成するような某自作ツール。
通常使ってる分にはどちらでもいいが、テスト結果にDB作成のログが出るので黙らせたくなった。
ログレベル変えても効果なかったので調べようとしたが、中々マッチする記事に出会えなかった。
ので、メモを残しておく。

※公式ドキュメントに書いてあった...

 * http://guides.rubyonrails.org/migrations.html#changing-the-output-of-running-migrations


# 結果

## 黙らせる前

```bash
$ ruby quiet_migrate_log.rb
-- create_table(:users)
   -> 0.2256s
```

## 黙らせた後

```bash
$ ruby quiet_migrate_log.rb
```

# やりかた

## rakeで黙らせる

```bash
$ rake db:migrate VERBOSE=false
```

## 実行ファイルで黙らせる

```rb
require 'active_record'

dbfilename = 'db/test.sqlite3'

ActiveRecord::Base.establish_connection(
  adapter:  'sqlite3',
  database: dbfilename
)
ActiveRecord::Base.connection

ActiveRecord::Migration.verbose = false
ActiveRecord::Migration.create_table :users do |t| 
  t.string  :name
  t.string  :email
  t.timestamp :created_at, :null => false
end
```

# おまけ

## マイグレーション時に他のことも喋らせたい場合

公式ドキュメントの同じ章に載っている通りなので詳細は省略するが、
sayやsay_with_time、suppress_messages等を使えば以下のようにログにメッセージを追加することができる

```rb:say_migrate_log.rb
require 'active_record'

dbfilename = 'db/say_migration.sqlite3'

ActiveRecord::Base.establish_connection(
  adapter:  'sqlite3',
  database: dbfilename
)
ActiveRecord::Base.connection

class MyMigration < ActiveRecord::Migration
  def create_users_table
    suppress_messages do
      create_table :users do |t| 
        t.string  :name
        t.string  :email
        t.timestamp :created_at, :null => false
      end 
    end

    say "Created Table"

    suppress_messages { add_index :users, :name }
    say "and an index!", true  #<= trueがあると字下げされる

    # ブロックの実行時間と共にメッセージを出力
    say_with_time 'With time' do
      sleep 3
    end 
  end 
end

MyMigration.new.create_users_table
```

実行結果

```bash
$ ruby say_migrate_log.rb
-- Created Table
   -> and an index!
-- With time
   -> 3.0001s
   -> 3 rows
```
WebStormでGurntを実行する方法

## Gruntfile.jsを右クリック

![Screen Shot 2014-07-09 at 14.27.19.png](https://qiita-image-store.s3.amazonaws.com/0/5559/e705b960-0678-17d0-5a75-1cf5faa13ec9.png)

## Open Grunt Console選択

実行したいタスクを選択
PhpStorm + Xdebug でリモートデバッグ


Android や Java EE で開発していたりすると、デバッグ実行によくお世話になる。ステップ実行で 1 つ 1 つ追っていくと、それでバグの原因が見つかったりするので重宝するものだ。

PHP では Xdebug を使用して同様の事が出来るのだが、設定が面倒だったり、Java ほど使い勝手が良くなかったりするので 結局 `var_dump` や `print_r` で問題箇所で変数の内容を出力する事でデバッグしてしまう。しかもそれで殆ど何とかなってしまう。

とはいえ、折角なので PhpStorm でステップ実行してみる。以下自分用メモ。

## 前提

最近は開発環境といってもデスクトップ OS (Windows / OS X / Linux) に直接 (W,M,L) AMP 環境を構築する事は少なくなってきた。 VM 上に Linux の環境を構築した方がスナップショットを撮っておけば失敗してもすぐに前の環境に戻せるし、 構築した環境を他の開発者に直接渡したりして同一環境での作業も容易となるからだ。

なので、今回は PhpStorm が稼働しているクライアントと実際に Apache が稼働しているサーバが別という前提で手順を記す。 クライアント OS が OS X という前提で記述するが、適宜読みかえれば恐らく Windows / Linux でも同様に使えるだろうと思われる。

## OS X のデフォルト PHP に Xdebug を認識させる

![5.png](https://qiita-image-store.s3.amazonaws.com/0/32812/9cf910ef-45a7-cc7c-e18e-a64f5b12965d.png "5.png")

PhpStorm のメニューから Preferences -> PHP で OS X 側の PHP のインタプリタを指定するが、ここでデフォルトの `/usr/bin/php` を指定しても左画像のように `Debugger: Not installed` と表示されてしまう。Xdebug が認識されていない。

ターミナルを開き、以下のように `mdfind` コマンドで `xdebug.so` の位置を特定する:

```bash
mdfind -name xdebug.so
 
/usr/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
```

`mdfind` は `find` コマンドに似ているが、`mdfind` は Spotlight のコマンド版という所が違う。 Spotlight は予めインデックスを張っている為高速に動作する。

さて、これを php.ini に定義する。OS X の php.ini はデフォルトで存在しないが、テンプレートが php.ini.default として用意されているのでこれをコピーして使用する。

```bash
cd /etc
sudo cp php.ini.default php.ini
sudo chmod 600 php.ini  # 何故か owner でも read-only になっているので
sudo vi php.ini
```

```
[xdebug]
zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"
```

設定が完了したら Apache を再起動する。

```
sudo /usr/sbin/apachectl restart
```

OS X のデフォルト PHP に Xdebug が認識されたかどうかを確認する。 OS X の Apache のデフォルトの DocumentRoot は `/Library/WebServer/Documents` なので、 元々ある index.html 若しくはそれに準ずるものを削除し、直下に index.php として以下を配置:

```php
<?php
phpinfo();
```

`http://localhost/` にアクセスし、phpinfo の内容を表示する。xdebug の項目が正しく表示されているのを確認する。

## サーバ側に Xdebug を設定する

サーバ側にも Xdebug をインストールする。以下 Ubuntu とするが、Ubuntu だと `apt-get install php5-xdebug` で入るので、 同様に xdebug.so の位置を確認する。

```bash
find /usr/lib/php5 -name 'xdebug.so'
 
/usr/lib/php5/20100525/xdebug.so
```

同様に php.ini を書くが少し書くことが多い:

```
zend_extension = "/usr/lib/php5/20100525/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_port="9001"  # 何故かデフォルトの 9000 だとうまくいかないことが多い
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/tmp"
xdebug.max_nesting_level=1000
xdebug.idekey = "phpstorm"  # PhpStorm 側で指定する IDE の識別子
xdebug.remote_connect_back=1
xdebug.remote_autostart=1
xdebug.remote_handler=dbgp
```

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

## PhpStorm の設定

Preferences->PHP->Servers でデバッグサーバが作成されていなければ＋ボタンで追加する。デバッガに Xdebug を指定。 Use path mappings にチェックを入れ、ローカルの File/Directory とサーバの Absolute path on the server をあわせる。 可能ならば Validate remote environment で Xdebug の有効性をチェックできる。

次に Preferences->PHP->Debug で Xdebug の port を 9001 番に変更する。 その次にその下の Preferences->PHP->Debug->DBGp Proxy にサーバの php.ini に指定した IDE Key, port (9001), サーバのホスト名 or IP を指定する。

最後に、Run->Edit Configurations... で上の＋ボタンを押して「PHP Remote Debug」を追加、追加したウィンドウのサーバ及び IDE Key を指定する。 そして、PhpStorm の上部ツールバーに何やら電話のようなアイコンがあるので、これを押して Xdebug からの通信をリスンするようにする。 後は適当な箇所にブレークポイントを張り、正しくデバッガがその位置で停止してステップ実行できることを確認する。
外部キーがカンマ区切りテキストなテーブルにJOINする

チェックリストを作るなどの目的で、複数のテーブルをJOINしてSELECTした結果が欲しい時があります。が、データベースの設計がちょっと残念で、多対多の関連で外部キーが親テーブルのカラムにカンマ区切りのテキストで入っていたりする場合があります。

普通ならもうSQLだけではどうにもなりませんが、MySQLなら[FIND_IN_SET()](http://dev.mysql.com/doc/refman/5.1/ja/string-functions.html#function_find-in-set)関数を使うことでJOINできます。
以下の例ではbookが親テーブルで、authorが子テーブル、authorsカラムにauthorテーブルのキーがカンマ区切りで入っている想定です。

```SQL
SELECT * FORM book JOIN auther IN FIND_IN_SET(author.id, book.authors) >= 1
```

``` FIND_IN_SET(str,strlist) ``` 関数は、strlistをカンマ区切りの値として解釈して、strで指定した値が何番目にあるのかを返す関数です。たとえば``` FIND_IN_SET(5, '1,3,5,7,11') ``` なら3が返ります。見つからなかった場合はNULLを返します。

bookテーブル1行に対してauthorテーブルのauthorsカラムにキーが含まれる行が選択されてくるのでJOIN出来るわけです。

ちなみにbookテーブルの行数×authorテーブルの行数分だけスキャンが走るはずなので猛烈に遅いはずです。
Gitリポジトリの内容をmirrorして移行する

既存のgitリポジトリから、他のgitリポジトリへ内容を丸々コピーする方法
例としては社内gitからgithubへの移行などが考えられる。

gitのmirrorオプションを利用する

```
$ git clone --mirror <SOURCE_REPOSITORY_URL>
$ cd <REPOSITORY>
$ git push --mirror <DESTINATION_REPOSITORY_URL>
```
Ubuntu で MySQL


## インストール

```bash
sudo apt-get install mysql-server
```

インストール手順中、 root に対するパスワード設定画面が表示されるので、 適切に設定しておく。

## 日本語 (UTF-8)

以下を入力してみる:

```bash
mysql -u root -p  # ユーザとしてrootを指定し、パスワードを要求する
Enter password:  # 先ほど設定したパスワードを入力
```

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 5.5.28-0ubuntu0.12.10.2 (Ubuntu)
  
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
  
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
  
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  
mysql> status;  # 左記のようにコマンド入力
--------------
mysql  Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (x86_64) using readline 6.2
  
Connection id:      41
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.28-0ubuntu0.12.10.2 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1  # サーバ内で扱う文字コードがlatin1(iso8859-1)になっている
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         1 min 26 sec
```

これだと、サーバサイドアプリ側 (PHP, Java, etc...) から日本語を含んだデータを投入したりすると文字化けが発生してしまう。 全て UTF-8 で統一すれば良いので、まず MySQL から抜けて以下を書く:

```bash
sudo vi /etc/mysql/my.cnf  # MySQLの設定ファイルを変更する
```

以下のように各ディレクティブに記述を追加する:

```
[mysqld]
character-set-server=utf8
skip-character-set-client-handshake
default-storage-engine=INNODB

[mysqldump]
default-character-set=utf8
 
[mysql]
default-character-set=utf8
```

MySQL を再起動し、 全て UTF-8 に変更されている事を確認する。

```bash
sudo /etc/init.d/mysql restart
mysql -u root -p
...
status;
...
Server characterset:    utf8  # UTF-8になっている事を確認する
Db     characterset:    utf8
```

## ユーザ作成

開発環境であれば root ユーザのみでも良いかもしれないが、 全て同じユーザで作業をするのはセキュリティ上宜しくないので、 各個人のユーザを作成して作業をする。 MySQL に root でログインし、 以下のように入力しユーザを作成する:

```
-- 全ての権限を与える. 制限を加える場合は変更する
GRANT ALL PRIVILEGES ON *.* TO (ユーザ名)@localhost IDENTIFIED BY '(パスワード)' WITH GRANT OPTION;
FLUSH PRIVILEGES;
```

作成したユーザで MySQL にログインできるか確認する。

```
mysql -u (ユーザ名) -p
Enter password:  # 先ほど設定したパスワードを入力
```

## PHPMyAdmin

有名な Web アプリ型の MySQL クライアント。 便利なので開発環境等では入れておいても損はないが、 本番には入れないか、 若しくは Basic 認証などを入れておいた方が良い。

```bash
sudo apt-get install php5-mysql phpmyadmin
```

これで `/usr/share/phpmyadmin` に PHPMyAdmin がインストールされるのだが、 Apache に `/usr/share/phpmyadmin` を有効な URL として設定しなければならない。 が Ubuntu の場合既に `apt-get` した時にこの設定ファイルが作成されているので、 以下のように `mods-enabled` にリンクを張ってやれば良い:

```bash
sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/mods-enabled/phpmyadmin.conf
sudo service apache2 reload  # 設定ファイルを読み込む
```

`http://localhost/phpmyadmin/` にアクセスし、 正しく PHPMyAdmin が表示される事を確認する。
正規表現で定型的なコンストラクタをすぐに書く方法

# 最初に
[budougumi0617さんがコメントで教えてくださった方法](http://qiita.com/arai-wa/items/d125a1303089027dde4a#comment-fd02c0c7de79d4bd51ac)のほうが明らかに早いので、そちらを使うことをお勧めします。

#ここから下はコメントで教えていただく前に私が書いた内容。
正規表現を使えば定型的なコンストラクタをあっというまに作成することができます。
さらに、フィールドの宣言も作成することができます。

`User`クラスに次のコンストラクタを定義するとします。

```java
User(String name, int tel, String email, String department) {
}
```

上のコンストラクタの中で`this.name = name;`という具合にフィールドに値を詰めていく

```java
User(String name, int tel, String email, String department) {
	this.name = name;
	this.tel = tel;
	this.email = email;
	this.department = department;
}
```

というコンストラクタにしたい、けれども

* 引数が多すぎる（引数が多すぎるのはたいていオブジェクト指向的じゃないコードになっていることが原因なので根本的に解決したほうがいいですが・・・・）
* 単にめんどくさい

といった理由で手動で書きたくないときは、正規表現で書くことができます。

# `this.name = name;`を自動で作る
コンストラクタの引数

```java
String name, int tel, String email, String department
```
の
`(^|, )([^ ]*) ([^( |,)]*)`を`\nthis\.\3 = \3;`に置換すると

```java
this.name = name;
this.tel = tel;
this.email = email;
this.department = department;
```
となります。これをコンストラクタ内に書けばフィールドに代入するコードが一発でできあがります。

# `private String name;`とフィールドも新規に定義して`this.name = name;`も作る

先ほどの正規表現のうち、置換先を`\nthis\.\3 = \3;\nprivate \2 \3;`とすると

```java
this.name = name;
private String name;
this.tel = tel;
private int tel;
this.email = email;
private String email;
this.department = department;
private String department;
```

となります。
あとは、これを、テキストエディタの機能で行単位でソートすると、（Windowsのサクラエディタなら全選択して Alt + a。ほかにはSublime Text やAtomで同じくソートの機能を使えた気がします）

```java
private String department;
private String email;
private String name;
private int tel;
this.department = department;
this.email = email;
this.name = name;
this.tel = tel;
```

上半分がフィールド、下半分がコンストラクタの中でフィールドへの代入を行うコードになりました。
あとはこれをコピペすれば使えます。
仮引数の順序と、フィールドや`this.foo = foo`の順序とが、一致していないのは、許してください。

これくらいIDEでうまくやる方法がありそうだと思ったのですが、なさそうだったので、正規表現でやりました。
twilio APIを使ってcurlやPHPでSMSを送信する


世の中には便利なサービスがあるものですね。携帯電話の端末認証をしたくて、ユーザに電話番号を入力してもらい、SMSで認証キーを送信。その認証キーをユーザに入力してもらうことで、端末認証完了。みたいな。

## twilioに登録

twilioにはトライアルがあり、twilioのAPI使い勝手を試すレベルであれば、色々できる。

- http://twilio.kddi-web.com

ある程度、日本語化されているので迷うことはないと思うけど、普通にサインアップ。

## トライアルでSMS送信するときの注意点

### 送信先電話番号は、検証済み電話番号じゃなきゃダメ

![twilio_1.png](https://qiita-image-store.s3.amazonaws.com/0/2152/25f5f854-fa3a-1eff-a11a-6142b06beff1.png "twilio_1.png")

トライアルだと、1つの電話番号しか登録できないっぽい。なお、検証済み電話番号の検証方法で、通話方式とSMS方式があるが、なぜか通話方式は正常に完了できなかった。

### SMS送信には、アメリカ(+1)の電話番号を取得する必要がある

![twilio_2.png](https://qiita-image-store.s3.amazonaws.com/0/2152/2392452f-d129-daab-1a93-c86882f236ab.png "twilio_2.png")

ここに騙されやすい（誰も騙してない）。

サインアップして、最初に割り当てられる電話番号は、おそらく日本の国番号（+81）が付いたものだと思うけど、それをリリースして、アメリカの国番号（+1）の電話番号を再取得しなおす。

番号をリリースして、新しく電話番号を購入（トライアルなので実際は課金されない）

![twilio_3.png](https://qiita-image-store.s3.amazonaws.com/0/2152/47caa0af-c3fd-11f0-a76c-fb1c83e6baa1.png "twilio_3.png")

勝手にアサインされる電話番号は使わない

![twilio_4.png](https://qiita-image-store.s3.amazonaws.com/0/2152/80abaaa2-295a-802a-938f-51f82c0116b0.png "twilio_4.png")

左上の国でアメリカを選択

![twilio_5.png](https://qiita-image-store.s3.amazonaws.com/0/2152/befd9a94-1340-4c0c-3727-b3729cb5027c.png "twilio_5.png")

(+1)がついていれば、電話番号は何でもいい

![twilio_6.png](https://qiita-image-store.s3.amazonaws.com/0/2152/2d1b5e89-85ab-e2bb-db01-f5c91a1e2ae6.png "twilio_6.png")


## curlでSMS送信APIを叩く

- https://jp.twilio.com/user/account/developer-tools/api-explorer/message-create

curl / Ruby / PHP / Python / Node.js / Java / C# がサポートされている。テストするだけなら、ライブラリとか必要ないcurlが楽。

非常にわかりやすいサンプルが付いているので、迷うことはないが1点だけ注意が。 **curlの下記サンプルコマンド、実はAPIのURLが間違っている。** なので、サンプルのまま実行しても、404 not foundのエラーが返ってくるだけ…。

```
# これは実行できない
curl -X POST 'https://jp.twilio.com/2010-04-01/Accounts/[ACCOUNT SID]/Messages.json' \
--data-urlencode 'To=+818000000000'  \
--data-urlencode 'From=+100000000'  \
--data-urlencode 'Body=test' \
-u [ACCOUNT SID]:[AuthToken]
```

```
jp.twilio.com
↓
api.twilio.com
```

こっちのホスト名が正しい。

```
# これが実行できる
curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/[ACCOUNT SID]/Messages.json' \
--data-urlencode 'To=+818000000000'  \
--data-urlencode 'From=+100000000'  \
--data-urlencode 'Body=test' \
-u [ACCOUNT SID]:[AuthToken]
```

これで電話番号など設定があっていれば、検証済み電話番号にSMSが送信されているはず。
ASP.NET MVC 5.2 で、ReSharper が機能しなくなる問題（解決済み）

この問題は [ReSharper.ExternalAnnotations 8.2.1001](https://resharper-plugins.jetbrains.com/packages/ReSharper.ExternalAnnotations/) で修正されました。
拡張機能と更新プログラムからアップデートすると ASP.NET MVC 5.2 でも利用できました。

-----------

ASP.NET MVC 5.2 がリリースされました。
軽い気持ちでアップデートしたところ、ReSharper の F12 で定義に移動する機能が使えなくなってしまいました。

![クリップボード01.png](https://qiita-image-store.s3.amazonaws.com/0/46109/b605c605-2e29-aa79-d56d-e57a673f76dd.png)

どうやら既知の不具合らしいので、アップデートが出るまで待ちましょう。
[RSRP-417526 Support for ASP.NET MVC 5.2](http://youtrack.jetbrains.com/issue/RSRP-417526)
CentOS7でGlusterFSのレプリケーション

[CentOS6.5でDRBD 8.4を試してみた - Qiita](http://qiita.com/tukiyo3/items/bba1b939fcf150b2cb56)

CentOS7に~~drbdが無い~~[CentOS7用drbdパッケージ用意されました](http://elrepo.org/tiki/tiki-index.php)

レプリケーションはどうしようかと思ったがglusterfsがあったので使ってみた。

* glusterfsはxfsである必要があります。
* GlusterFSを商用化し、エンタープライズ向けに提供するのが「Red Hat Storage」
* ~~CentOS6ではglusterfsは外部リポジトリを追加しなくても用意されている~~ glusterfs-serverがない

参考:

* [CentOS - GlusterFS - Qiita](http://qiita.com/mykysyk@github/items/ec5979c1c0a0b49a736b)
* [インフラ本舗 - オープンソース Linux Webアプリ Windows 構築](http://infra.makeall.net/)

# DRBDとの比較

* DRBDは2台で構成。
* GlusterfSは3台以上で構成

# テスト環境

* 192.168.100.11 server1
* 192.168.100.12 server2

## リポジトリ追加

```bash:リポジトリ追加
# wget -P /etc/yum.repos.d/ \
 http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-epel.repo
```

## パッケージインストール

```bash:パッケージインストール
# yum install -y glusterfs-server
```

## glusterd起動

```bash:glusterd起動
# systemctl start glusterd
# systemctl enable glusterd
```

## glusterのpeer登録

```bash:
# gluster peer status
# gluster peer probe 192.168.100.11
192.168.100.12側で実施
# gluster peer status
```

## volume作成

```bash:
# gluster volume create mysql_volume \
 replica 2 \
 192.168.100.11:/srv/glusterfs/ \
 192.168.100.12:/srv/glusterfs/ \
 force
```

```bash:
# gluster volume start mysql_volume
# gluster volume info
# gluster volume status
```

# 実際に使ってみる

```bash:両方のサーバで実施
# mount -t glusterfs localhost:/mysql_volume /var/lib/mysql/
```

```bash:192.168.100.11で実施
# date > /var/lib/mysql/a.txt
```

```bash:192.168.100.12で実施
# ls /var/lib/mysql/
a.txtが存在すること。
```

# glusterに3台目を追加

* 192.168.100.13

```bash:192.168.100.11にて実施
# gluster peer probe 192.168.100.13
# gluster volume add-brick mysql_volume replica 3 192.168.100.13:/srv/glusterfs/ force
```

```bash:192.168.100.13にて実施
# gluster volume start mysql_volume
# mount -t glusterfs localhost:/mysql_volume /var/lib/mysql/
```

# 障害テスト

1. 192.168.100.11を再起動させる
2. 192.168.100.11と通信が取れない時は他のpeerから/var/lib/mysql/に62秒間アクセス出来ない・・・。
 * 以下は`watch date >> /var/lib/mysql/a.txt`の結果

```bash:障害テスト
2014年 7月 9日 水曜日 13:21:55 JST
2014年 7月 9日 水曜日 13:21:57 JST
2014年 7月 9日 水曜日 13:21:59 JST
2014年 7月 9日 水曜日 13:23:05 JST
2014年 7月 9日 水曜日 13:23:07 JST
2014年 7月 9日 水曜日 13:23:09 JST
```

# proxmoxでの利用例

![スクリーンショット 2014-07-09 13.31.13.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d6f0b5bd-cec7-7762-b21d-22122dcfe822.png)

![スクリーンショット 2014-07-09 13.32.03.png](https://qiita-image-store.s3.amazonaws.com/0/25728/99e46a29-ffa0-c053-d4c3-daabe619fd96.png)
Glassfishでバンドルされるライブラリを置き換える


たまにしかやらないのですぐ忘れてしまうのでメモしておきます。

1. glassfishを停止する
1. jarファイルを置換

	`<GLASSFISH_ROOT>/glassfish/modules`以下に存在するファイルを置き換えます。

2. felix-cacheを消す

	`<GLASSFISH_ROOT>/glassfish/domains/domain1/osgi-cache/felix`を消してfelixのキャッシュをクリアします。

以上です。