OmniAICreator/Qiita-1.07M huggingface dataset:
BashでCIDR表記からネットワークアドレスを計算する

Bashでネットワークアドレスを計算する関数を書いてみた。
あまりシェルスクリプトを書いていなかったので、配列やdeclare、readの使い方など勉強になった。

```bash
network_address() {
    declare address prefix_length
    IFS=/ read address prefix_length <<< "$1"

    declare -a octets
    IFS=. read -a octets <<< "$address"

    declare mask
    mask=$( printf "%08x" $(( (1 << 32) - (1 << (32 - prefix_length)) )) )

    declare -i i
    for i in {0..3}; do octets[$i]=$(( octets[i] & 16#${mask:2*i:2} )); done

    echo $( IFS=.; echo "${octets[*]}" )
}

address="255.255.255.255"

for i in {0..32}
do
    printf "$address/$i:\t%s\n" $(network_address "$address/$i")
done
```

結果は以下の通り。

```text
255.255.255.255/0:      0.0.0.0
255.255.255.255/1:      128.0.0.0
255.255.255.255/2:      192.0.0.0
255.255.255.255/3:      224.0.0.0
255.255.255.255/4:      240.0.0.0
255.255.255.255/5:      248.0.0.0
255.255.255.255/6:      252.0.0.0
255.255.255.255/7:      254.0.0.0
255.255.255.255/8:      255.0.0.0
255.255.255.255/9:      255.128.0.0
255.255.255.255/10:     255.192.0.0
255.255.255.255/11:     255.224.0.0
255.255.255.255/12:     255.240.0.0
255.255.255.255/13:     255.248.0.0
255.255.255.255/14:     255.252.0.0
255.255.255.255/15:     255.254.0.0
255.255.255.255/16:     255.255.0.0
255.255.255.255/17:     255.255.128.0
255.255.255.255/18:     255.255.192.0
255.255.255.255/19:     255.255.224.0
255.255.255.255/20:     255.255.240.0
255.255.255.255/21:     255.255.248.0
255.255.255.255/22:     255.255.252.0
255.255.255.255/23:     255.255.254.0
255.255.255.255/24:     255.255.255.0
255.255.255.255/25:     255.255.255.128
255.255.255.255/26:     255.255.255.192
255.255.255.255/27:     255.255.255.224
255.255.255.255/28:     255.255.255.240
255.255.255.255/29:     255.255.255.248
255.255.255.255/30:     255.255.255.252
255.255.255.255/31:     255.255.255.254
255.255.255.255/32:     255.255.255.255
```
Windows8.xのmodern.IEで日本語を入力、表示できるようにする。

# はじめに

[VirtualBox - modern.IEのWindows 7で日本語の表示と入力をできるようにする - Qiita \[キータ\]](http://qiita.com/hnakamur/items/5f2f9e817dd0de60abb2)に続いてWindows 8.xでも日本語環境をセットアップします。今回はIE11 - Win8.1のVMで試しました。

手順は[言語やキーボードを追加する - Microsoft Windows ヘルプ](http://windows.microsoft.com/ja-jp/windows-8/add-language-keyboard)に説明がありました。

なお、以下の手順では[キーボード ショートカット - Microsoft Windows ヘルプ](http://windows.microsoft.com/ja-jp/windows-8/keyboard-shortcuts)で見つけたショートカットキーを使っています。

# タイムゾーン設定

1. Windows+Iキーを押して設定チャームを開き、画面右下の[Change PC settings]をクリックします。
1. [PC Settings]画面左の[Time and language]をクリックします。
1. [Time and language]画面左で[Date and time]が選択された状態で、画面右の[Time zone]ドロップダウンで[(UTC+09:00) Osaka, Sapporo, Tokyo]を選びます。

# 日本語環境をセットアップ

1. Windows+Iキーを押して設定チャームを開き、画面右下の[Change PC settings]をクリックします。
1. [PC Settings]画面左の[Time and language]をクリックします。
1. [Time and language]画面左で[Region and language]をクリックします。
1. 画面右の[Country and region]ドロップダウンを[Japan]に変更します。
1. [Language]セクションで[Add a language]をクリックします。
1. [Add a language]画面で[日本語]をクリックします。
1. [Time and language]画面に戻ると[Languages]セクションに[日本語]が追加され、その下の表示が[language pack available]に切り替わります。
1. [日本語]をクリックし、[Set as primary]ボタンを押します。
1. 再度[日本語]をクリックし、[Options]ボタンを押します。
1. [日本語]画面の[Download language pack]の下の[Download]ボタンを押します。
1. Windowsキーを押してStart画面を表示し、右上のIEUserをクリックし、ポップアップメニューの[Sign out]を押します。
1. マウスをクリックして、サインイン画面を表示し、パスワード欄にPassw0rd!と入力してエンターキーを押します。
1. Start画面のStartが日本語で「スタート」と表示されていればOKです。

これで、日本語を入力、表示できるようになりました。
Vagrant内のCentOS6.5にてDockerのWebUIであるShipyardを使ってみる


Dockerに興味があったけど中々手をだせていなかったので、お手軽そうなWebUIと併せて試してみた記録。

# 環境

| Item | Version |
|:--:|:--|
| Vagrant | 1.4.1 |
| CentOS | 6.5 |
| Docker | 0.7.0 |
| Shipyard | 245e80 |

利用したVagrantのboxは[こちら](https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box "centos65-x86_64-20131205.box")。

# VagrantとCentOSのセットアップ

box追加とかその辺りは割愛。

下準備として、外部から内部の8000番ポートへ接続可能にしておく。あと、メモリを標準よりは多めに使えるようにしておく。
(私は、2GB確保して動作確認した。)

# Dockerのセットアップ

完全に以下をそのまま。

[CentOS 6.5 に Docker をインストールしてみた](http://www.1x1.jp/blog/2013/12/docker_on_centos65.html)

# Shipyard

[Shipyard](https://github.com/shipyard/shipyard "Shipyard")

上記のオフィシャルサイト上にある [QuickStart](https://github.com/shipyard/shipyard/wiki/QuickStart "QuickStart") をだいたいなぞる感じ。ただし、少し手を加える。

## Docker Host Configuration

起動オプションの指定内容はそのままだが、CentOSの場合オプションの保存先に工夫が必要。

`"/etc/init.d/docker"`の中身を参考に、以下のように記述する。

```/etc/sysconfig/docker
other_args="-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock"
```

QuickStartに記述無いけど、dockerの再起動が必要な気がする。

## Shipyard

pullするのは、QuickStart通り。

起動は、`-p 80:80`を抜いた形で起動する。

```command
% sudo docker run -i -t -d -p 8000:8000 shipyard/shipyard
```

起動したら、母艦側のブラウザから8000番ポートを叩けばShipyardが無事に使えるようになっているはず。

# 今後の課題

Dockerの使い方自体に慣れること。
慣れれば、仮想環境のコントロールをより簡単にできるようになりそう。
rack-rewriteでURLの末尾に強制的にスラッシュを付ける


rackを使ったアプリケーションで
rewriteし、末尾に強制的にスラッシュを付ける方法。(英語ではtrailing slashというみたい）

Apacheでいう
`Rewrite ^(.+[^/])$ $1/ [L,R]`
これです

## まえがき
※ここは読み飛ばして構いません

なぜ、これが必要になったかというと、jekyllのアプリケーションを作成ている時、
通常の

```
$ jekyll serve
```
を実行しアクセスしたときは`http://0.0.0.0:5000/blog`にアクセスしても自動的に末尾にスラッシュがつきます。

一方、unicornなどをrackを使った場合だと末尾にスラッシュはつかなくなり、リンクが上手く設定されない現象に困りました。

で、Apacheの用に、Rewrite Ruleを作ればできるのではいいのかなと。
通常であれはApacheやnginxなどで設定するのですが、herokuに上げるという事情があり、どうしてもアプリケーション側でやらないといけないということで、rack-rewriteを選択しました。

## gemをインストール
rack-rewriteをインストール

```Gemfile
gem 'rack-rewrite'
```


## 設定
config.ruに以下を追記

```
require 'rack/rewrite'
use Rack::Rewrite do
  r301 %r{^([^.]+[^/])$}, '$1/'
end
```

`.`を含むファイル(cssファイルとか）の場合にはrewriteしないようにしてます。


---
参考：逆に末尾のスラッシュを外す方法
http://www.itsupportnewcastle.org.uk/rack-rewrite-remove-urls-trailing-slash/
upstartでデーモン化してみる


デーモン化するのに[deamontools](http://cr.yp.to/daemontools.html,”deamontools”)を使っていたが、設定が簡単そうな[upstart](http://upstart.ubuntu.com/,”upstart”)を使ってみる

#特徴

* タスクとサービスはイベントによって起動・停止される
* イベントは、タスクやサービスを起動・停止する時に生成される
* イベントは、システム上の他のプロセスから受ける
* サービスは、予期せずプロセスが死んだ時に再起動される
* 親プロセスと別の監視と再起動デーモン
* D-Busを超えてinit deamonで通信
* ユーザがプロセスを起動・停止できる

#対応環境

* Ubuntu 6.10 以降
* Red Hat Enterprise Linux 6 以降
* Fedora 9 ～ 14
* Debian 6.0（Squeeze) 以降
* Maemo
* WebOS
* Chromium OS
* Chrome OS


#設定

```/etc/init/upstart-sample.conf
# nginx

description "nginx http daemon"
author “my@localhost.com”

start on runlevel [2345]
stop  on runlevel [!2345]

env DAEMON=/opt/nginx-x.x.x/sbin/nginx
env PID=/var/run/nginx.pid
env CONFIG=/etc/nginx/nginx.conf

respawn

pre-start script
  ${DAEMON} -t
  if [ $? -ne 0 ]; then
    exit $?
  fi
end script

console output

exec ${DAEMON} -c "${CONFIG}"
```

#コマンド

### 起動

`# sudo initctl start nginx`

### 確認

`# sudo initctl list|grep nginx`
or
`# sudo ps auxwwf|grep nginx`

### 停止

`# sudo initctl stop nginx`

### 再起動

`# sudo initctl restart nginx`

#まとめ

deamontoolsよりもディレクトリを作ったり設定ファイルが少なくて導入が楽かも
emacs ctags の設定

emacs で rails のコードを触っていて定義への移動を実現する方法が知りたくなったのでその時のめも。

## tag の作成

tagsの機能を使う
apt-get install ctags

ctags-exuberant -a -e -f TAGS --tag-relative -R *

## emacs の設定
毎回 TAGS の位置を聞かれるのが面倒なので

; tags                                                                                   
(setq rinari-tags-file-name "TAGS")

M-. で定義へ飛べる。
vim2hsのラムダ式をかわいくしてくれる機能をとめる

![](http://gyazo.com/c93674b1dceaa5b6e5bc0d62057e50c1.png)

https://github.com/dag/vim2hs

デフォルト設定で使うと `(\x y -> x + y)` の先頭のエスケープがlambda記号に動的に表示されてしまってかわいいのはいいんだけど編集中にカーソルの位置がズレたりして不便なので停止する……

```vim
let g:haskell_conceal = 0
```
Storyboard使用時に、コードでNavigationCotrollerを使用して遷移する。




```obj-c
①
UIStoryboard *sb = [UIStoryboard storyboardWithName:@“YourStoryBoardName” bundle:nil];
②
hogeViewController  *hvc = [sb instantiateViewControllerWithIdentifier:@“hoge”];
③                    
[self.navigationController pushViewController:wc animated:YES];

```

①Storyboardのインスタンスを作成する。
YourStoryBoardNameの部分をご自身のStoryboardのファイル名に変更

②遷移先のViewControllerを作成。

③pushViewする。
MMS入門

**この記事の内容は古いです。最新のMMSについては[別途投稿した最新情報](http://qiita.com/fetaro/items/f1655240e917828a66cb)を見てください**

みなさんMMSをご存知ですか？
MMSはMongoDB Management Serviceの略で、MongoDBの開発元であるMongoDB,Incが提供している、
MongoDBを管理するためのアプリケーションです。

昔はMongoDB Monitoring Serviceとであり、そのころは監視(Monitoring)が中心だったのですが、最近はバックアップ等の機能が追加されて、管理(Management)と名実ともに一回り機能拡張しています。

MMSの主な特徴は以下の通り。

<ul>
<li>アカウントを登録すれば、無料で使える</li>
<li>アカウントでログインすると、MSSコンソールにブラウザでアクセスでき、ここでいろいろできる</li>
<li>いろいろな統計情報を見ることができる</li>
<li>閾値を決めてメールアラートを送れる</li>
<li>独自のダッシュボートが作れる</li>
<li>バックアップもできる</li>
</ul>

画面は以下のような感じです。（ちょっと古くて、社名がまだ昔の10genですけど）

![MMS2.png](https://qiita-image-store.s3.amazonaws.com/0/33447/fc4afa9c-4777-098d-6466-d729f14f5b0e.png)

仕組みとしては以下の様な感じです。

<ul>
<li>MMSはクラウド上(AWS上)にあり、手元のマシンにMMS-Agentをいれて、MMS-Agent経由でMMSにデータを送る</li>
<li>一つのMMS-Agentを設置すれば、手元の環境のMongoDBを何台でもつなげる</li>
<li>MMS-AgentからAWSにつなぎに行く方向の通信であるため、手元の環境がNAT配下にあっても問題なし</li>
</ul>

![MMS1.png](https://qiita-image-store.s3.amazonaws.com/0/33447/b1ec74ad-0eec-a813-d81d-1556db58f9c0.png)

オンプレでMMSサーバを構築することもできます！（ただし本番運用する場合はMongoDB Enterprise版を買う必要があります。）

<a href=https://www.mongodb.com/products/mongodb-management-service>このページ</a>から使い始められます。皆さんもぜひ試してください！
cakephp2.3 Authログイン

CakePHPでログイン処理を実装したとき嵌ってしまったのでメモ。

Controllerのログイン処理部分

```cakephp
$this->Auth->login()
```

ではなく

```cakephp
$this->Auth->login($this->request->data)
```

で動きました。
こんなので手間取ってしまいました…
Simple HTML DOM Parserを使ったスクレイピング




# Simple HTML DOM parserのインストール
ここ(http://sourceforge.net/projects/simplehtmldom/files/)から
simple_html_dom.phpをダウンロードしてスクリプトと同フォルダ内に保存する。

``` php
<?php
include "simple_html_dom.php";
$html = file_get_html('http://www.google.com/');
foreach($html->find('img') as $element){
       echo $element->src . "<br>";
}

```

# Simple HTML DOM parserの使い方
http://simplehtmldom.sourceforge.net/manual.htm 


1.URLからDOMを作成

``` php
$html = file_get_html(‘http://www.google.com/'); 
```

2.DOMから特定要素の抽出

``` php
// img要素のソースURLの抽出
foreach($html->find(‘img’) as $element){
	echo $element->src.’<br>’;
}

// a要素のhref属性の抽出
foreach($html->find(‘a’) as $element){
	echo $element->href.’<br>’;
}


//属性による抽出対象の指定
foreach($html->find(‘a[title=top]’) as $element){
	echo $element->href.’<br>’;
}

//classによる抽出対象の指定
$es = $html->find(‘table.hello td’);



//階層の指定
$es = $html->find(‘table td[align=center]’);


//ネスト
foreach ($html->find(‘div[id=new]’ as $div1){
	foreach($div1->find(‘p[title]’ as $p1){
		echo $p1->plaintext;
	}
}


```

3.DOMに属性の設定

``` php
// img要素の拡張子をjpgからpngに変更
foreach($html->find(‘img’) as $img){
	$img->src = str_replace(“jpg”,”png”,$img->src);
}

```
Gruntのtaskの実行にかかる時間を劇的に短縮する方法の記述をシンプルにするjit-grunt

# Gruntのtaskの実行にかかる時間を劇的に短縮する方法の記述をシンプルにするjit-grunt

[Gruntのtaskの実行にかかる時間を劇的に短縮する方法](http://qiita.com/makotot/items/bf7e8a4d704b2e977fed)を先日投稿しましたが、その中では

```js
grunt.registerTask('lint', [], function () {
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.task.run('jshint');
});
```

というように`registerTask`のコールバックで`loadNpmTasks`を実行するようにしたので、記述の冗長さが問題だなと感じるものでした。
加えて、個別のtaskを実行するには毎回taskを定義する必要がありました。
可読性も低下しているし、運用面でも問題があるように思います。

そこで[jit-grunt](https://github.com/shootaroo/jit-grunt)を使えばその問題が解消されます。

## jit-grunt
npmでインストールします。

```zsh
$ npm i jit-grunt --save-dev
```

[load-grunt-tasks](https://github.com/sindresorhus/load-grunt-tasks)と同じような使い方で

```js
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-browserify');
```

のかわりに

```js
require('jit-grunt')(grunt);
```

と記述します。そうすると、`loadNpmTasks`の遅延読み込みを実現した上で、シンプルに1行で記述できます。
以下のルールで、taskの名前から自動的に使用するプラグインを探し出すようになっています。

- `grunt-contrib-<task name>`
- `grunt-<task name>`
- `<task name>`

そのルールに沿わない場合、手動でマッピングすることも出来ます。

```js
require('jit-grunt')(grunt, {
  bower: 'grunt-bower-task'
});
```

jit-gruntを利用すると、Gruntタスクの実行時間を短縮しつつ、Gruntfileもシンプルな状態にすることができるので、[Gruntのtaskの実行にかかる時間を劇的に短縮する方法](http://qiita.com/makotot/items/bf7e8a4d704b2e977fed)で紹介した手法の煩雑さに不満がある場合に試してみるといいと思います。
zookeeper とは

年末年始、まとまった時間が取れるので、zookeeper お勉強を進めようと思う
勉強したことをここにメモしておく
間違っていたら指摘してほしい

まずはここから
http://zookeeper.apache.org/doc/trunk/zookeeperOver.html

# Zookeeper とは

分散アプリケーション向けの高パフォーマンスな協調サービスである.
なんのこっちゃ.
もう少し噛み砕くと,,,

Zookeeper は分散アプリケーションを構築する上で必要となる,
同期, 設定管理, グルーピング, 名前管理, などの機能を提供するサービスである.

分散アプリケーションを作成する上では, 上記で述べた, 同期, 設定管理, ... 等の機能は必須となる.
上記で述べた機能を実装することは難しい...というか真面目に作ろうとすれば死ぬほど面倒くさい.
Zookeeper は, これらの面倒くさい機能を肩代わりしてくれるんですな.

# 動作環境
Java で作成されているので, jvm 上で動作可能である.

# API
Java, C 言語

# License
Apache License 2.0

# Zookeeper が目指すゴール

## シンプルさ
Zookeeper を使えば, 複数のサーバに分散しているプロセスは、（通常のファイルシステムを扱うように）階層的な名前空間を共有しながら、分散処理を進めることができる.

しかしながら, Zookeeper はストレージではなくメモリ上にデータを保存する.
これにより, 高スループット, 低レイテンシーが実現される.

また, 高可用性, アクセス制限も備えている.
それらは大規模な分散システムで動作することを前提として構築されており, これにより単一障害点になることを避けられる.

## レプリケーション
Zookeeper 自身はホストの集合上でレプリケートされる. Zookeeper がインストールされたサーバは, 他のすべてのサーバの状態を知っていなければならない.

クライアントは 1 つの Zookeeper サーバーへ接続する. リクエスト送信, レスポンス受信の際, クライアントは TCP コネクションを張る. コネクションが切断されたとしても, 別のサーバへの接続を試みる.

# データモデル
Zookeeper で提供される名前空間は, 通常のファイルシステムと類似している. 名前はスラッシュ(```/```) で区切られている. ノードとノードが繋がれた木構造である. 通常のファイルシステムのファイルパスのようである. このファイルパスを用いて, データを識別する.

## ノードの分類

通常のファイルシステムと異なる点は, Zookeeper の名前空間内の各ノードへ数バイト～数キロバイトの小規模なデータを持つ, znode と呼ばれる子ノードを持てる点である. これらの小規模なデータは, 分散アプリケーションにおける協調動作を進めるために配置されると予想される(つまりは, 設定ファイルとか何かの定義ファイルとかテンプレートファイルとか)ため, 数バイト～数キロバイトということが想定されているんでしょう....

znode は stat structure を保持している. stat structure にはバージョン番号が含まれる. これらのバージョン番号は以下が更新されると更新される.
* ノードのデータが変化した
* ノードの ACL が変化した
* ノードのタイムスタンプが変化した

znode で保持されているデータはアトミックに読み書きがされる. 読み込みの際には znode に保持されているすべてのデータを取得し, 書き込みの際にはすべてのデータを置き換える. 各ノード毎にアクセス制限を設けることができる.

# まとめ
要は, Zookeeper は以下の機構を提供してくれる, 協調アプリケーション向けに開発された, 分散型のメタストアである.(←これは完全に個人的な解釈であるため, 間違っているかもしれないが, 自分の中ではそんな感じのイメージである.)

* Sequential Consistency - クライアントからの更新を順番に1つずつ適用する.
* Atomicity - 成功 or 失敗. 中途半端な結果になることを避けてくれる.
* Single System Image - 高可用性を備えた分散型のメタストアなので複数のサーバを用いるが, 利用者から見ると透過的な1つのファイルシステムのように扱うことができる.
* Timelines - クライアントから読めるデータは常に最新のものである.
systemdで画面を閉じてもスリープに入らないようにする

systemd-logindの管理下にあるようなので、`/etc/systemd/logind.conf`を編集：

```
HandleLidSwitch=ignore
```

`man logind.conf`で各オプションの説明が読める。親切。

http://d.hatena.ne.jp/yamidori98/20131014/1381766244
upowerは効かないようなので注意。
RubyでFizzBuzz

奥が深いFizzBuzzをやってみる。
やってみると面白い、おそらくたくさんの書き方があるんだろうけどなかなか浮かんでこないもの、、、

条件: 

* 3の倍数で割り切れれば<strong>Fizz</strong>
* 5の倍数で割り切れれば<strong>Buzz</strong>
* 3と5の公倍数で割り切れれば<strong>FizzBuzz</strong>
* 範囲は1以上100以下

##1
```:fizzbuzz.rb
def fizzbuzz(num)
  case
  when number % 15 == 0
    "FizzBuzz"
  when number % 3 == 0
    "Fizz"
  when number % 5 == 0
    "Buzz"
  else
    "No!"
  end
end

[*1..100].each do |num|
print "#{num} : #{fizzbuzz(num)}"
end
```

##2
```:fizzbuzz.rb

 def fizzbuzz(num)
  if num % 15 == 0
    puts "FizzBuzz"
  elsif num % 3 == 0
    puts "Fizz"
  elsif num % 5 == 0
    puts "Buzz"
  else
    puts "No!"
  end
end
```

##3
```:fizzbuzz.rb
def fizzbuzz
  [*1..100].each_with_index do |number, i|
    case
    when number % 15 == 0
      puts "#{i + 1} : FizzBuzz"
    when number % 3 == 0
      puts "#{i + 1} : Fizz"
    when number % 5 == 0
      puts "#{i + 1} : Buzz"
    else
      puts "#{i + 1} : No!"
    end
  end
end

```

##4
```:fizzbuzz.rb
def fizzbuzz
  [*1..100].map do |num|
  puts "#{num}: fizzbuzz" if num % 15 == 0
  puts "#{num}: fizz" if num % 3 == 0
  puts "#{num}: buzz" if num % 5 == 0
  puts num unless (num % 3 == 0) && (num % 5 == 0) && (num % 15 == 0)
  end
end
```

##5
```:fizzbuzz.rb
class Integer
  def fizzbuzz
    case
      when self % 15 == 0
        "FizzBuzz"
      when self % 3 == 0
        "Fizz"
      when self % 5 == 0
        "Buzz"
      else
        self
    end
  end
end

(1..100).map { |num| puts num.fizzbuzz }

```

FizzBuzzの別の書き方、変な書き方あったらコメントをお待ちしております！
画面をタップしたらキーボードを非表示にする


1.Tap Gesture RecognizerをView Controllerに追加する。
2.Tap Gesture RecognizerのActionをView Controllerに接続する。
3.endEditing:YESメッセージをビューに対して送る。

```objectivec:
- (IBAction)bkgTapped:(id)sender {
    [self.view endEditing:YES];
}
```
テキストフィールドの文字数制限


1.TextFieldのデリゲート設定で、View Controllerに処理を委託する。
2.TextField:shouldChangeCharactersInRange:replacementString:デリゲートメソッドを実装する。

```objectivec:
- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSMutableString *tmp = [_myTextField.text mutableCopy];
    [tmp replaceCharactersInRange:range withString:string];
    return ([tmp doubleValue] <= 100 && [tmp length] <= 4);
}
```
Unity2D+NGUIでゲーム作るよ！ その1 Scene

前記事
[Unity2D+NGUIでゲーム作るよ！ その0](http://qiita.com/keidroid/items/23b6bed567f96af55715)

## 1.1 Scene
Unity3Dで既出の機能なのでUnity2Dのみ興味のある方はとばして..

### 1.1.1 Sceneの作成

以下の様なタイトル画面->ゲーム画面->ゲーム結果->タイトル画面->..を作ります。

![imaaa.png](https://qiita-image-store.s3.amazonaws.com/0/19692/f9b8aeed-30ef-e709-4587-fa971e251470.png)

UnityでのScene追加はFile>New Sceneで行います。
今回は「Title」「GameStage」「Result」を作成しました

![スクリーンショット 2013-12-29 3.00.24.png](https://qiita-image-store.s3.amazonaws.com/0/19692/6a099ccb-1be9-0a38-8057-550f9ccba808.png)

### 1.1.2 Sceneの遷移
Unityではアプリケーション全体に関するアクセスはApplicationクラスで行われます。
http://docs.unity3d.com/Documentation/ScriptReference/Application.html

(ApplicationクラスではPathやLocale、Platform判別やFPSも管理している..!)
Sceneの遷移に関するメソッドは以下のとおりです

|メソッド|概要|
|:--|:--|
|LoadLevel|レベルか名前を指定してSceneを遷移する|
|LoadLevelAdditive|レベルか名前を指定して現在のSceneに新しいSceneを追加する|
|LoadLevelAdditiveAsync|Pro専用。非同期で現在のSceneに新しいSceneを追加する|
|LoadLevelAsync|Pro専用。非同期でSceneを読み込む|

というわけで実際に遷移させます。
File>Build Settingで使用するSceneをAddCurrentによって追加します。
(右に表示されているのがLevelです)

![スクリーンショット 2013-12-29 3.04.48.png](https://qiita-image-store.s3.amazonaws.com/0/19692/1671d4f4-5a8c-461e-326c-71b575153322.png)

タイトルのSceneに以下のScriptを作成して追加します

````C#:Title.cs
using UnityEngine;
using System.Collections;

public class Title : MonoBehaviour
{
	void Start ()
	{
	}
		
	void Update ()
	{
		//マウスの左ボタンをクリック
		if(Input.GetMouseButtonUp(0)){
			Application.LoadLevel("GameStage");
		}
	}
}
````

↓こんな感じ
![スクリーンショット 2013-12-29 3.37.38.png](https://qiita-image-store.s3.amazonaws.com/0/19692/d8e5061e-6881-5d81-dd51-3217db0855e5.png)

同じ要領でGameStageにResultへの遷移、ResultでTitleへの遷移を書くと、
タイトル画面->ゲーム画面->ゲーム結果->タイトル画面->..のSceneの遷移が実現できます。やった！

次はSprite使ってさっくりキャラ表示..!
browserifyを試してみる

# browserifyを試してみる
既にアドベントカレンダーの投稿予定の日は過ぎ去っていますが、、書きました。

最近まで[browserify](http://browserify.org/)に関して、substackが作った何か、ぐらいのことしか知りませんでした。
今回、クライアントサイドでJavaScriptのモジュール管理が可能にできるツールだと人から教わり、実際に試してみました。
(nodeのコアライブラリが利用できる点などは特に触れません。)

## browserifyとは何か

[browserify](http://browserify.org/)とは、クライアントサイドのJavaScriptでモジュールシステムを実現する[npm](http://npmjs.org/)です。

[公式サイト](http://browserify.org/)には、

> `require('modules')` in the browser

とあります。

具体的には、

```js
var hoge = require('./hoge');
```

という形でモジュールの読み込みが出来るようになります。
(モジュールシステムを提供する点では[Require.js](http://requirejs.org/)と似ているようで、実際はだいぶ違うように思います。)

単純にこれだけだと、browserifyで可能になることのイメージがつきにくいと思います。僕はこの説明を読んだだけでは、それを具体的にどう利用するのか分かりませんでした。

## browserifyで実現するモジュールシステム

`require('modules')`が可能になると何が良いのかというと、サイト全体のJavaScriptファイルや機能の管理を考えると分かってきます。

大抵、ウェブサイトにおいてJavaScriptのファイルは複数あり、ページ毎に様々なJavaScriptを使っていると思います。その管理や構成に関しては悩むことがあると思います。
個人的にサイト全体のJavaScriptの管理・構成で悩ましい点は、以下の点だと思います。

- リクエスト数を減らす為JavaScriptの各機能をなるべく1つのJavaScriptファイルにまとめるようにする
- JavaScriptファイルに幾つかの機能をまとめて記述すると、そのうち一部はあるページで読み込むだけで実行される事のない無駄な部分になってしまったりする
- ページ毎にどのJavaScriptファイルを読み込ませるかを考えていると、どのJavaScriptファイルに何を記述するかを検討することに多大な労力が必要になる

こういった懸念点を解消するのが、browserifyだと思います。

Aというページに必要なJavaScriptの機能は、モジュールを用意して

```js
var tab = require('./tab'),
    slideshow = require('./slideshow');
```

というように必要に応じて`require()`で読み込んで利用すればいいだけです。こうすることで、リクエスト数を増やす心配は不要になり、どの機能をどのJavaScriptファイルに記述してということで悩む必要はなくなると思います。
モジュールを用意して、画面に応じて必要なモジュールを`require()`すればいいだけです。

## 実際に試してみました

[https://github.com/makotot/browserify-sample](https://github.com/makotot/browserify-sample)で簡単なサンプルを作ってみました。

indexとsampleの画面でそれぞれ以下の機能をJavaScriptファイルにモジュールとして読み込んで、各画面で利用するようにしています。

- index : タブ切り替え、ツールチップ
- sample : ツールチップ、ページ最上部へスクロール

browserifyを利用せずにJavaScriptを作る場合、これぐらいの小規模な構成であっても構成・管理に悩むことになると思います。
モジュール管理がbrowserifyによって可能になることで、それぞれの画面で必要な機能だけが読み込まれるようになりました。

このサンプルに関して、もしご意見や疑問などあれば[issue](https://github.com/makotot/browserify-sample/issues)や[pull request](https://github.com/makotot/browserify-sample/pulls)頂きたいです。


nodeスタイルの記述を多少必要としますが、学習コストがかかるものでも無いように思います。
Python DictShieldを使用してJSONオブジェクトのバリデーションを行う


**書いた時はさっぱり気付いていませんでしたが、現在は[`schematics`](https://github.com/j2labs/schematics)に移行しているそうです。そのうち`schematics`版も書く…かも。**

----

`dictshield`はJSONオブジェクトをバリデーションするためのライブラリ。

クラスで定義出来るので、普段使っている`django`のモデルやフォームクラス、`mongoengine`のドキュメントクラスなどと似ていること、コードベースがコンパクトで見通しが良いことから、使いやすそうだったのでお試し。コードの中を追っていくと、MongoDBやJSON Schemaも考慮されているみたい。

# 使い方

## 基本編
```python:documents.py
from dictshield.document import Document
from dictshield.fields import StringField, IntField, FloatField, BooleanField, DateTimeField

class SampleDocument(Document):
    id = IntField(min_value=0)
    name = StringField()
    gps_attached = BooleanField()
    temperature = FloatField()
    created_at = DateTimeField()
```

JSONオブジェクトの検査は、JSONオブジェクトを`dict`に変換してからドキュメントクラスに放り込む。

```python
import json

json_data = '{"id": 1, "name": "foo", "gps_attached": true, "temperature": 23.5, "created_at": "2013-01-01T12:34:56" }'

data = json.loads(json_data)

document = SampleDocument(**data)
document.validate()  # Trueが返ってくる
```

## ネストした（？）JSONオブジェクトのハンドリング

ネストした（？）JSONオブジェクトを使用するには`EmbeddedDocument`クラスを使用する。周辺センサの情報を分離してみる例。

```python:documents.py
from dictshield.document import Document, EmbeddedDocument
from dictshield.fields import StringField, IntField, FloatField, BooleanField, DateTimeField
from dictshield.fields.compound import EmbeddedDocumentField


class PeripheralEmbeddedDocument(EmbeddedDocument):
    gps_attached = BooleanField()
    temperature = FloatField()

class SampleDocument(Document):
    id = IntField()
    name = StringField(max_length=5)
    created_at = DateTimeField()
    peripheral = EmbeddedDocumentField(PeripheralEmbeddedDocument)
```

```python
data = {
    u'created_at': u'2013-01-01T12:34:56',
    u'id': 1,
    u'name': u'foo',
    u'peripheral': {
        u'gps_attached': True,
        u'temperature': 23.5
    }
}

document = SampleDocument(**data)
document.validate()  # Trueが返ってくる
```

## 例外

バリデーションに失敗するとShieldExceptionが飛んでくる。

```python
data = {
    u'created_at': u'2013-01-01T12:34:56',
    u'id': 1,
    u'name': u'hogheoge',  # 長い
    u'peripheral': {
        u'gps_attached': True,
        u'temperature': 23.5
    }
}

document = SampleDocument(**data)
document.validate()
```

```
---------------------------------------------------------------------------
ShieldException                           Traceback (most recent call last)
<ipython-input-76-8d15894a526a> in <module>()
----> 1 document.validate()

/somewhere/lib/python2.7/site-packages/dictshield/document.pyc in validate(self, validate_all)
    333                 # NB: raising a ShieldDocException in this case would be more
    334                 # consistent, but existing code might expect ShieldException
--> 335                 raise err
    336
    337         if errs:

ShieldException: String value is too long - name:hogheoge
```

----

# 気付いたこと

* `IntField`の`max_value`, `min_value`オプションが動いていないような…。

----

# 参考

* [dictshield](https://github.com/j2labs/dictshield)
* [Schematics](https://github.com/j2labs/schematics) こっちに移行してるみたい…
Elasticsearchのデバッグのお供にelasticsearch-inquisitorが便利

Elasticsearchに登録されているインデックスを調べたくなってツールを探した結果、elasticsearch-inquisitorというpluginを見つけました。

https://github.com/polyfractal/elasticsearch-inquisitor

インストールするにはElasticsearchのディレクトリにある `bin/plugin` コマンドを使うだけです。Homebrew経由でインストール場合は/usr/local/Celler/elasticsearch/0.90.2/bin/pluginとかにあるあるはずです。

```bash
bin/plugin -install polyfractal/elasticsearch-inquisitor
```

今までElasticsearchにこんな機能があることを知らなかったんですが便利ですね。

そして http://localhost:9200/_plugin/inquisitor/ にアクセスしたら既に使えるようになっています。インデックスの情報を簡単に確認することができます。ローカルでの開発のお供によさそうです。
名前付きパイプからリダイレクトする時のワナ

# いきなり問題

さて問題です。次のコードを実行した時、どうなるでしょうか？

```sh:問題
$ mkfifo "HOGEPIPE"
$ { cat < "HOGEPIPE" >/dev/null; } &
$ killall cat
```

1. `cat`コマンドプロセスが終了され、サブシェルとなっている括弧プロセスが終了する。（その結果、`[1]+  Done { cat < "HOGEPIPE"; }`などのメッセージが出る）

1. `cat`コマンドプロセスが見つからず、`killall`コマンドがエラーを返す。

1. 名前付きパイプ`"HOGEPIPE"`が使えなくなり、一旦削除して作り直すしかなくなる。

## 正解

1番、と見せかけて、実は2番です。あたりましたか？

# 理由

2番の「`killall`コマンドがエラーを返す」とは一体どういうことでしょう？`cat`コマンドが名前付きパイプからデータが流れてくるのを今か今かと待ち構えているのではないのでしょうか。

じつはこの時、`cat`コマンドはまだ起動していないのです。いくら待とうがダメです。後で`"HOGEPIPE"`にデータを流し込むその時、はじめて起動するのです。

## 名前付きパイプが空のうちは、シェルはリダイレクション先のプロセスを起動しない

では名前付きパイプにまだデータが流し込まれていない時、
`{ cat < "HOGEPIPE" >/dev/null; } &`
はどういう状態なのでしょうか？

上記のサブシェル`{ cat < "HOGEPIPE" >/dev/null; }`自体は立ち上がっています。しかしそのサブシェルが、catコマンドをまだ起動していないのです。リダイレクションなので、サブシェルがまず名前付きパイプ`"HOGEPIPE"`を開こうとしますが、その結果まだデータが到来していないのでサブシェル自身がブロック状態になってしまっているのです。

その様子を観察してみましょう。冒頭の「問題」のコマンドを打ち込んだ後に、さらに次のコマンドを打ち込んでみてください。今、この議論に関係するプロセスのみが表示されます。

```sh:関係するプロセスを列挙
$ ps -Ao pid,ppid,command | egrep $$'|'cat | egrep -v grep'|'ps
27488 27487 -bash ← (親)今コマンド打ち込んでいるシェルのプロセス
27673 27488 -bash ← (子)catを呼びだすサブシェルのプロセス
```

このように、コマンドを打ちこんでいるシェルのプロセスと、`{ cat < "HOGEPIPE" >/dev/null; }`のサブシェルの2つしか居ません。

では、パイプにデータを流し始めてみたらどうなるか見てみましょう。まずは次のコマンドを打ちこみ、データを流し始めてみてください。

```sh:名前付きパイプにデータを流し始める
$ yes > "HOGEPIPE" &
```

そして、もう一度関係するプロセスを列挙してみましょう。

```sh:改めて関係するプロセスを列挙
$ ps -Ao pid,ppid,command | egrep $$'|'cat | egrep -v grep'|'ps
27488 27487 -bash ← (親)今コマンド打ち込んでいるシェルのプロセス
27673 27488 -bash ← (子)catを呼びだすサブシェルのプロセス
27674 27673 cat   ← (孫)上記のサブシェルから呼びだされたcat
27686 27488 yes   ← (子)名前付きパイプ経由でcatにデータを送っているyes
$ killall yes # 余計な負荷を掛けぬよう、確認後、yesはすぐに止めましょう
```

というわけでようやく`cat`コマンドが起動しましたね。

## 起動しないのはリダイレクションで受け取る場合だけ

ただし、次のようにして入力リダイレクション表記を使わない場合はちゃんとkillできます。

```sh:冒頭の「問題」を入力リダイレクション無しでやり直し
$ mkfifo "HOGEPIPE"
$ { cat "HOGEPIPE" >/dev/null; } &
$ killall cat
```

理由は、最初に名前付きパイプ`"HOGEPIPE"`を開くのがサブシェルでななく、`cat`コマンドに任せられるからです。
zshでaws-cliのコマンド補完を利用する


`bin/aws_zsh_completer.sh`が用意されている．

`easy_install`でaws-cliをインストールしている場合は下記のパスから利用可能．

	source /usr/local/bin/aws_zsh_completer.sh


## zsh以外のshellでコマンド補完を利用する場合

aws-cliの[README](https://github.com/aws/aws-cli/blob/develop/README.rst#command-completion)に導入方法が書かれている．
zshでknifeのコマンド補完を利用する


[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)を使っている場合[knifeのコマンド補完プラグイン](https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/knife/_knife)が利用できる．
jekyllをheroku(w/unicorn)で動かす


[himynameisjonas/jekyll-heroku-unicorn](https://github.com/himynameisjonas/jekyll-heroku-unicorn)
を参考に設定します。

バージョンは
ruby 2.0.0
jekyll 1.4.2
です。


### Gemのインストール
```ruby:Gemfile
ruby '2.0.0' #herokuでruby 2.0を利用にするために設定

gem 'jekyll'
gem 'rack-jekyll', github: 'adaoraul/rack-jekyll', ref: '6a4b832c5b2350c8c1263b534ebf02135deb6363'
gem 'unicorn'
````

### unicorn.rbの作成
unicornの設定ファイルを作成します。（細かい説明は端折ります）

```ruby:unicorn.rb
worker_processes 1 
timeout 30   
preload_app true
```


### config.ruの作成
config.ruを作成します。

```config.ru
require "bundler/setup"
Bundler.require(:default)

run Rack::Jekyll.new(:destination => '_site')
```





### _config.ymlの設定
jekyllの_config.ymlファイルに以下のように
（サイトに必要のない）不要なファイルを表示します。

```_config.yml
exclude: ["vendor",".rbenv-version", ".gitignore", "README.md", "Gemfile", "Gemfile.lock", "Procfile", "unicorn.rb", "config.ru"]
```

※`vendor`を入れないと、herekuでサーバを立ち上げる時に
「Post 0000-00-00-welcome-to-jekyll.markdown.erb does not have a valid date. (Jekyll::FatalException)」のエラーが発生します。





### Procfileの作成
herokuで起動するためにProcfileを作成します。

```cpp:Procfile
web: bundle exec unicorn -p $PORT -c ./unicorn.rb
```

`$ foreman start`で起動することが確認できればOK

```bash
$ foreman start                                                                                                                                                                                             
01:07:26 web.1     | started with pid 83446
01:07:27 web.1     | I, [2013-12-29T01:07:27.402502 #83447]  INFO -- : Refreshing Gem list
01:07:28 web.1     | Configuration file: /***/****/_config.yml
01:07:28 web.1     | I, [2013-12-29T01:07:28.181070 #83447]  INFO -- : listening on addr=0.0.0.0:5000 fd=9
01:07:28 web.1     | I, [2013-12-29T01:07:28.181171 #83447]  INFO -- : worker=0 spawning...
01:07:28 web.1     | I, [2013-12-29T01:07:28.183126 #83447]  INFO -- : master process ready
01:07:28 web.1     | I, [2013-12-29T01:07:28.184675 #83582]  INFO -- : worker=0 spawned pid=83582
01:07:28 web.1     | I, [2013-12-29T01:07:28.189126 #83582]  INFO -- : worker=0 ready
```

## herokuの作成と開始
ここからはいつものherokuの開始と同じ。

```
$ git init 
$ git add .
$ git commit -m ‘first commit’
$ heroku create 
$ git push heroku master
$ heroku open
```
で、うまく行けばxxxx.herokuapp.comで表示できるかと思います。
Mac でターミナルから画面共有をONにする方法 メモ



リモートのMac OS Xなマシーンにssh できるけど、画面共有をONにするの忘れてた時の対処メモ

## コマンド


```
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -access -on -clientopts -setvnclegacy -vnclegacy yes -clientopts -setvncpw -vncpw mypasswd -restart -agent -privs -all
```

参考URL

[Enabling Remote Desktop VNC on OSX via Terminal Command Line | Ernies Flores Blog](http://www.ernieflores.net/osx-page-4/enabling-remote-desktop-vnc-on-osx-via-terminal-command/ "Enabling Remote Desktop VNC on OSX via Terminal Command Line | Ernies Flores Blog")


## 接続する方法

### コマンドラインから

```
open vnc://URL:ポート番号
```

### Finderから

Finder -> 移動 -> サーバに接続 -> vnc://192.168.x.x

接続方法の参考に

[【便利】MacをMacで離れたところから操作する画面共有 - NAVER まとめ](http://matome.naver.jp/odai/2133218146563100601 "【便利】MacをMacで離れたところから操作する画面共有 - NAVER まとめ")

## 検索用語

Mac, Mac OS, Mac OS X, ssh, terminal, screen sharing, vnc, VPN
マック,画面共有,ターミナル,リモートログイン
ElasticSearch 検索方法まとめ



## 一般的なテキストサーチ

```
curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "query_string": {
            "query": "検索テキスト！"
        }
    }
}'
```

公式ドキュメント
[Query String Query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html)


## インデックス・クエリー

```
{
    "indices" : {
        "indices" : ["index1", "index2"],
        "query" : {
            "term" : { "tag" : "wow" }
        },
        "no_match_query" : {
            "term" : { "tag" : "kow" }
        }
    }
}
```

[Indices Query](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-indices-query.html#query-dsl-indices-query)


## クエリーの形

```
{
        size: # number of results to return (defaults to 10)
        from: # offset into results (defaults to 0)
        fields: # list of document fields that should be returned - http://elasticsearch.org/guide/reference/api/search/fields.html
        sort: # define sort order - see http://elasticsearch.org/guide/reference/api/search/sort.html

        query: {
            # "query" object following the Query DSL: http://elasticsearch.org/guide/reference/query-dsl/
            # details below
        },

        facets: {
            # facets specifications
            # Facets provide summary information about a particular field or fields in the data
        }

        # special case for situations where you want to apply filter/query to results but *not* to facets
        filter: {
            # filter objects
            # a filter is a simple "filter" (query) on a specific field.
            # Simple means e.g. checking against a specific value or range of values
        }
}
```


## 検索用語

ElasticSearch, query, search, text, string, schema, filter
クエリー, サーチ, 検索, テキスト,
ElasticSearch 系の関連ツール



## elasticsearch-head

WebベースのElasticSearch操作アプリ


## kibana 3

集計ツール


## ElasticSearch Data Browser

ExtJS製。チャートもある。

[Home · OlegKunitsyn/elasticsearch-browser Wiki](https://github.com/OlegKunitsyn/elasticsearch-browser/wiki)

## Chrome拡張: Sense

Chrome からREST API操作ができる

[Chrome Web Store - Sense](https://chrome.google.com/webstore/detail/sense/doinijnbnggojdlcjifpdckfokbbfpbo)


## logstash, fluentd

ログ収集、送信ツール


## 検索用用語

ElasticSearch, tools, ツール, Webアプリ, コマンドライン, 拡張, プラグイン, エクステンション, ブラウザ
CoffeeScriptでkoaを使う

話題のkoaをCoffeeScriptで試してみようと思ったところ

function *() { } をどのように書いたらいいのかわからず
https://github.com/jashkenas/coffee-script/pull/3240
にpull requestがあったので早速試してみた

```
git clone https://github.com/alubbe/coffee-script
cd coffee-script 
npm install 
```

node v0.11では yieldを有効にするために bin/coffee に--harmonyを付ける

```
#!/usr/bin/env node --harmony
```

公式のサンプルをCofeeScriptで書いてみた

```coffeescript
koa = require('koa')
app = koa()

app.use ->*
  @body = "Hello, World"

app.listen 3000
```

```coffeescript
koa = require('koa')
app = koa()

# x-response-time
app.use (next) ->*
  start = new Date
  yield next
  ms = new Date - start
  @set 'X-Response-Time', "#{ms}ms"

# logger
app.use (next) ->*
  start = new Date
  yield next
  ms = new Date - start
  console.log "#{@method} #{@url} - #{ms}"

# response
app.use (next) ->*
  @body = 'Hello World'

app.listen 3000
```
GoogleMaps v2でGoogleのロゴの位置を変更する

![スクリーンショット 2013-12-29 0.28.35.png](https://qiita-image-store.s3.amazonaws.com/0/16185/0afad6d4-41d0-708e-b2fa-6fc41af10c6f.png)

#GoogleMaps v2でGoogleのログを移動する
上図のように、Map上に何らかのオブジェクトを追加や半透明な何かをオーバーレイしたい場合、
Googleのロゴが隠れないように工夫する必要があります。
このロゴの動かし方がiOSとAndroidで違うので、Android版を備忘録も兼ねて。

##GoogleMapオブジェクトにpaddingを付ける
もはやタイトルだけで全てを表した様なものですが、GoogleMapオブジェクトにpaddingを付ける事によってロゴが動きます。
公式にもよく見ると書いてあるので公式よく見ろって話しなんですが。

http://developer.android.com/reference/com/google/android/gms/maps/GoogleMap.html

実際には、onGlobalLayoutの後にでもpaddingを指定してあげればいい感じになります。

```java:
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int height = hoge.getHeight();
                map.setPadding(0, 0, 0, height);
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
```

余談ですが、viewTreeObserverは取得し直さないとぬるぽで怒られるようなのでその辺りも要注意。
インストール直後のfluentdでエラーが多発する時の対処法

fluentdの設定をはじめたらよくわからないエラーが出続けてfluentdが起動できない場合があります。設定ファイルはfluentdが作成してくれるconfを指定してもエラーが出ます。


たとえば

```

2013-12-28 23:14:43 +0900 [warn]: emit transaction failed  error_class=NoMethodError error=#<NoMethodError: undefined method `write' for nil:NilClass>

```

とか

```

2013-12-28 23:09:33 +0900 [error]: unexpected error error_class=ArgumentError error=#<ArgumentError: invalid event type: '' (must be 'r', 'w', or 'rw')>

```

こんなの。
fluentdのバージョンを下げてもエラーでるしなんだろ？とおもったら依存ライブラリーのバージョンの問題でした。

```

yajl-ruby
cool.io

```

あたりのバージョンが古い場合があるのでuninstallして最新版を入れてみましょう。
私はこれで直りました！
[Ruby] caller を利用してメソッド呼び出しをログに記録させる。

ruby でメソッドの呼び出し状況をログ出力するのにこんな方法は如何？

Util::Trace という module を定義し、
メソッド定義の先頭に　Util::Trace.trace() を追加するだけ。

```ruby:1.rb
# -*- coding: utf-8 -*-
require 'logger'

module Util
  class Trace
    @@enable = true
    @@log = nil

    def self.log=(log)
      @@log = log
    end

    def self.enable=(bool)
      @@enable = bool
    end

    def self.trace(*arg)
      @@log.debug "#{caller.first} (#{arg.join(',')})" if @@enable && @@log
    end
  end
end

def sub
  Util::Trace.trace
end

def sub2(x, y)
  Util::Trace.trace(x, y)
end

log = Logger.new(STDOUT)
log.level = Logger::DEBUG
Util::Trace.log = log

sub
sub2('a', 'b')
sub2('x', a: 1, b: 10)

Util::Trace.enable = false
puts '----- trace off'
# 以下のメソッド呼び出しは TRACE 情報が表示されなくなる。
sub
sub2('c', 'd')
sub2('y', a: 2, b: 20)

Util::Trace.enable = true
puts '----- trace on'
# 以下のメソッド呼び出しは TRACE 情報が表示されるようになる。
sub
sub2('e', 'f')
sub2('z', a: 3, b: 30)
```

実行させると

```
$ ruby 1.rb
D, [2013-12-29T09:04:46.005960 #59602] DEBUG -- : 1.rb:24:in `sub' ()
D, [2013-12-29T09:04:46.006628 #59602] DEBUG -- : 1.rb:28:in `sub2' (a,b)
D, [2013-12-29T09:04:46.006753 #59602] DEBUG -- : 1.rb:28:in `sub2' (x,{:a=>1, :b=>10})
----- trace off
----- trace on
D, [2013-12-29T09:04:46.007036 #59602] DEBUG -- : 1.rb:24:in `sub' ()
D, [2013-12-29T09:04:46.007190 #59602] DEBUG -- : 1.rb:28:in `sub2' (e,f)
D, [2013-12-29T09:04:46.007287 #59602] DEBUG -- : 1.rb:28:in `sub2' (z,{:a=>3, :b=>30})
```
CoffeeCollider:ブラウザ上でサンプルコードを鳴らす

引きつづき、ブラウザ上でテキストベースで音を出せる言語 CoffeeCollider の記事です。

前回でセットアップが完了しワンライナー程度のコードで音出しできました。

今回は、もう少し複雑なコードを書いてみよう！
・・・ということでエディタ (ブラウザ画面) 上でサンプルコードを実行・編集してみます。

(ちなみに今回の記事の内容は WWW上で実行できるので、前回やったローカルのセットアップは踏まえておく必要がありません)

## 用意するもの

- ウェブブラウザ (Google Chrome 31など)

必ずしも Chrome 31 である必要はないですが、比較的最近のブラウザをつかうのがよいみたいです。手元のブラウザ Safari 5.1.9 では音が出ませんでした。

## サンプルコードを鳴らす

テルミンなサンプルを例に、操作方法を確認してみます。

#### 1. コードを開く
- http://mohayonao.github.io/CoffeeCollider/#mouse.coffee
- もしくは ローカルに保存した CoffeCollider-master/index.html から右側の "Examples" -> "-mouse"

以下のような 7行ほどのコードが表示されます。

```mouse.coffee
(->
  freq = MouseY.kr(100, 1000, 'exponential')
  freq1 = freq * MouseX.kr(2, 0.5, lag:2.5)
  freq2 = freq * MouseX.kr(0.5, 2, lag:2.5)
  feedback = MouseButton.kr(0, 1.pi(), lag:5)
  SinOscFB.ar([freq1, freq2], feedback, mul:0.25)
).play()
```

![coffeecollider2.png](https://qiita-image-store.s3.amazonaws.com/0/8510/676fd28d-def0-33a9-0d3e-1f95fe7d4ed4.png)


#### 2. 音を出す
- 1行目 `(->` の左端にテキストカーソルを当てて、`Cmd + return` で音が出ます
- あるいは画面上の "Run" ボタンを押しても同様に音が出ます

SuperCollider に準拠したキーバインドっぽいです。

つまり、実行したい処理が1行のコードなら、その行にテキストカーソルを当てて　`Cmd + return`。
実行したい処理が複数行(括弧でくくられてブロック化されている)なら、その括弧の外側にテキストカーソルを当てて　`Cmd + return`。

コードが難解でよくわからない時は、とりあえずテキストを全選択して　`Cmd + return`　してしまえばよいでしょう。

#### 3. 音をとめる
- `Cmd + .` カーソルの位置はどこでもいい
- あるいは画面上の "Stop" ボタンを押す

#### 4. コメント化する
- `#` 1行コメント
- `###　〜 ###` 複数行コメント

CoffeeScript に準拠しているみたいです。

実際にコメントをつかってサンプルコードをシンプルにしてみるとこんな感じ。

```
(->
  freq = MouseY.kr(100, 1000, 'exponential')
  ###
  freq1 = freq * MouseX.kr(2, 0.5, lag:2.5)
  freq2 = freq * MouseX.kr(0.5, 2, lag:2.5)
  ###
  feedback = MouseButton.kr(0, 1.pi(), lag:5)
  # SinOscFB.ar([freq1, freq2], feedback, mul:0.25)
  SinOscFB.ar([freq], feedback, mul:0.25)
).play()
```

## まとめ

サンプルコードの表示・実行・編集方法を確認しました。
これらを押さえておくことで、以後サンプルコードを元に自分のコードを効率的に作成していくことができます。

## 参考にした記事

- [CoffeeCollider usage ](http://mohayonao.github.io/CoffeeCollider/#usage.coffee) ※英語
- [mohayonaoさんの「CoffeeCollider勉強会用の資料」] (https://gist.github.com/mohayonao/8048788)
Operator plus Motion


Notes taken from Practical Vim by Drew Neil

## Operators

    c,d,y,gU
    g~ # swap case
    gu # make lowercase
    ! # filter(motion) lines through an external program
    = # Autoindent
    < # shift left
    > # shift right

## Operator+motion

    gUaw # to convert the current word to uppercase.
    dap # delete a paragraph
    gUap # Make a paragraph to uppercase


## Duplicate act on the current line.

    dd # delete the line
    >> # indent the line
    gUgU # or gUU to uppercase the line

## tpope/vim-commentary

This comments and uncomments as well. Use `.` for repeating.

    3\\j # comment out 3 lines below including the current line
    4\\k # comment out 4 lines above including the current line
    \\ap # or gcap tocomment out a paragraph
    \\G # comment out the current line to the end of the file
    \\\ # or gcc to comment the current line
    gcu # to uncomment


## kana/vim-textobj-entire

    gg=G # autoindent the entire file
    # if you have vim-textobj-entire
    =ae # or =ie
    # if you have vim-textobj-entire and vim-commentary
    \\ae # comment entire file and indent at the same time
HTMLからtagを抽出する

イベント・ドリブンなHTMLパーサを使って HTML から任意の tag を抽出することができる。

```java:ParseHTML.java
import java.util.*;
import java.io.*;
import javax.swing.text.html.parser.ParserDelegator;
import javax.swing.text.html.HTMLEditorKit.ParserCallback;
import javax.swing.text.html.HTML;
import javax.swing.text.MutableAttributeSet;

public class ParseHTML extends ParserCallback {
  /*
   * 以下の handleXXX がcallbackされるので好きに使うがいい。
   * このサンプルでは 
   *   <img> の src  アトリビュート と
   *   <a>   の href アトリビュート
   * を抽出する。
   */
  public void flush() {}
  public void handleComment(char[] data, int pos) {}
  public void handleEndOfLineString(String eol) {}
  public void handleEndTag(HTML.Tag t, int pos) {}
  public void handleError(String errorMsg, int pos) {}
  public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
    if ( t == HTML.Tag.IMG ) {
        urls.add((String)a.getAttribute(HTML.Attribute.SRC));
    }
  }
  public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
    if ( t == HTML.Tag.A ) {
        urls.add((String)a.getAttribute(HTML.Attribute.HREF));
    }
  }
  public void handleText(char[] data, int pos)  {}

  List<String> urls = new Vector<String>();

  // おためし
  public static void main(String[] args) {
    String html = 
      "<html><body>" + 
      "  <a href=\"http://qiita.com/episteme\">επιστημη</a>" +
      "  <IMG src=\"https://pbs.twimg.com/profile_images/54608127/epi_normal.jpg\"/>" +
      "</body></html>";

    try {
      // 文字列からReaderを作る
      InputStream stringstream = new ByteArrayInputStream(html.getBytes("utf-8")); 
      InputStreamReader reader = new InputStreamReader(stringstream, "utf-8");
      // ParserDelegator と callback(イベント・ハンドラ) を用意し
      ParserDelegator delegator = new ParserDelegator();
      ParseHTML callback = new ParseHTML();
      // parse開始!
      delegator.parse(reader, callback, true);
      reader.close();
      // 結果を出力
      for ( String result : callback.urls ) {
        System.out.println(result);
      }
    } catch ( Exception ex ) {
      ex.printStackTrace();
    }
  }
}
```
tmuxで大量のサーバーを操る最高の方法

こんにちはこんにちは

私は日々大量のサーバーで作業をする必要があるので tmux が欠かせません

そんな中最高便利な記事が先日公開されました

[Tmuxでウィンドウをインタラクティブに移動する - Qiita [キータ]](http://qiita.com/t_cyrill/items/c7e3e2187d0fce3b9856)

しかしこの記事が全く話題になっていません
おそらく理解されていないのだと思います

ということで私がもう少し詳しく説明したいと思います

先程の記事と同様に

 * [ssh-configにはパターンが使えるので便利 - Qiita [キータ]](http://qiita.com/t_cyrill/items/437091856f6d9f6dae1f)
 * [tmuxで色んなホストにsshする時に便利な.ssh/config - Qiita [キータ]](http://qiita.com/catatsuy/items/631d1d5d0b357082ba74)

の合計 3 記事を組み合わせて初めて達成できる最高のソリューションを紹介します


## tmux のウィンドウの名前

tmux で大量のウィンドウを立ち上げて ssh しているとどのウィンドウがどこのホストにいるのか分からなくなります

そこで先程紹介した 2 記事です

 * [ssh-configにはパターンが使えるので便利 - Qiita [キータ]](http://qiita.com/t_cyrill/items/437091856f6d9f6dae1f)
 * [tmuxで色んなホストにsshする時に便利な.ssh/config - Qiita [キータ]](http://qiita.com/catatsuy/items/631d1d5d0b357082ba74)

例えばサーバーが a0, a1, b0, c0 のようにアルファベット一文字＋数字 1 桁のような命名規則であった場合は `.ssh/config` を以下のようにします

```:ssh-config
Host a? b? c?
  PermitLocalCommand  yes
  LocalCommand tmux rename-window %n
```

このようにすると ssh した際に tmux のウィンドウの名前がサーバーのホスト名に変わります
`Host *` のようにすると `git pull` など全く関係ないところで動くのでパターンを使って確実にサーバーのホストにだけ当てるのがポイントです


## select-window で確実に指定ホストに移動する

tmux のウィンドウの名前にホスト名を表示できるようにしても，結局指定ホストに移動するには `choose-window` などを使って選ぶしかありません
`choose-window` はデフォルトで `bind-key w` で見れますが，とはいえ量が多いと大変手間です

ここで `select-window` の登場です

[Tmuxでウィンドウをインタラクティブに移動する - Qiita [キータ]](http://qiita.com/t_cyrill/items/c7e3e2187d0fce3b9856)

この記事の通り，適当なキーバインドで `select-window` を使えるようにします

```.tmux.conf
unbind-key s
bind-key s command-prompt "select-window -t '%%'"
```

元から `bind-key s` に割り当てられているものを調べたい場合は以下の記事のように `list-keys` を使います

[tmux のキーバインドを調べる方法 - Qiita [キータ]](http://qiita.com/catatsuy/items/5c80ff1f15bb226640eb)

このように設定することで __ウィンドウの名前を直接指定してそのウィンドウに移動ができます__

実例を見せます

![tmux-select-window.gif](https://qiita-image-store.s3.amazonaws.com/0/9930/00a23dbc-ccc3-47c2-1243-4e6a81ac5713.gif)

サーバー a0, a1, b0, c1 にログインしている状況で現在 b0 で作業しています
そこで `bind-key s[Enter] a0` と入力するだけで a0 に移動することが出来ます
最初に紹介した手法を使えば ssh するだけでウィンドウの名前を確実にホスト名に変えておいてくれます

また頭文字数文字を打つだけでも名前が一つに限定できるならそのウィンドウに移動することが出来ます
`bind-key ,` を使えばウィンドウの名前は変えられるのですぐに飛びたい特殊なウィンドウにはユニークな名前を付けるのも良いと思います

今回は 4 つだけでしたが，これが画面に収まる量を超えるとこれがないと作業が極めて困難になります

一つ一つの威力は小さいですが，紹介した 3 つ全てを組み合わせるとかなり強力な味方になってくれると思いますので皆さんも是非試してみてください！

最高便利！！
herokuでmysql(ClearDB)を使うとidが10ずつ増える

herokuでmysqlを使い開発していたところ、ローカルでは出現しなかった謎のエラーに悩まされたので調べてみたところ、データベースのidが1,11,21,31,41,...と10ずつ増えていた。
これでは困るので解決策を探ってみがどうやらこういう仕様らしい。
レプリケーション時にキーが衝突しないようにするためらしい。
次のように設定すると一時的に1ずつ増えるよう設定できるが、railsを通してレコードを追加すると元に戻ってしまう。
`SET @@auto_increment_increment = 1;`
そもそもキーの衝突を防ぐよう設定されているClearDBの仕様なので、無理やり変更するのはあまりよくない気がする。

以下参考URL

http://stackoverflow.com/questions/14078288/heroku-mysql-auto-increment
http://www.cleardb.com/developers/help/faq#general_16
Equiv_Jの練習問題assign_equivの証明 #ProofCafe

```coq:assign_equiv.v
(** **** 練習問題: ★★, recommended (assign_aequiv) *)
Theorem assign_aequiv : forall X e,
  aequiv (AId X) e ->
  cequiv SKIP (X ::= e).
Proof.
 move=> X e H. split => HH.
 - inversion HH. subst.
   assert (st' = update st' X (st' X)).
   - apply functional_extensionality => x.
     by rewrite update_same; reflexivity.

   - set (Hass := E_Ass st' e (st' X) X).
     rewrite <- H0 in Hass. apply Hass.
     rewrite <- (H st'). reflexivity.

 - inversion HH. subst.
   replace (update st X (aeval st e)) with st.
   - constructor.

   - apply functional_extensionality => x.
     rewrite <- (H st).
     rewrite update_same; reflexivity.
Qed.
```
ATOK Passport を解約することにしました。


### やめる理由

WinとMacの両方で2年程使ってきました。
正しい日本語を書くことについては優れている(と信じている）のですが、OSの動作に影響してしまうような致命的なバグ(下記)が何度か発生したため、我慢の限界に達し解約することにしました。
大昔にも何度かATOKを使っていましたが毎回同じような理由でやめている気がする。

* [ATOK2013が変換中に固まる](http://www.atchfactory.com/mvt/archives/2013/02/atok2013.html)
* [ATOK 2013を使用するとSafariのスクロールが重くなる]
(http://applech2.com/archives/30451095.html)


### 解約方法

1. https://www.justmyshop.com/ から「マイページ」を開く
1.  IDとPassでログイン
1. https://www.justmyshop.com/app/servlet/mypage の「
各種購入情報」の「詳細情報」 を開く
1. 定額利用サービスの 「契約内容の確認・解約」を開く
1. 解約理由等を記載して「解約する」をクリック
【Laravel】MacにLaravel4.1をインストールするまでにやったこと


[@localdisk](http://qiita.com/localdisk)さんの[最小構成で始めるLaravel](http://qiita.com/localdisk/items/b5ad297d3aebf14c00ad)を読んで、「Laravelを試してみよう！」と思ってMacにインストールしようとしたのですが、インストールまでに色々詰まったのでまとめ。

##PHP5.5系をインストール
LaravelはPHP5.4以降があれば良いのですが、Macに入ってたPHPが5.3系だったのでPHP5.5系をインストール

```
$ curl -s http://php-osx.liip.ch/install.sh | bash -s 5.5
```
インストールした後も、パスを設定しないとphp -vで5.3が表示されてしまうのでPHPのパスを変更する。

```
$ vim ~/.bash_profile
#以下を追記する
export PATH=/usr/local/php5/bin:$PATH

#設定を読み込ませる
$ source ~/.bash_profile
```

## php_mcryptをインストール

```
$ brew install mcrypt
```

##Composerのインストール

```
$ curl -sS https://getcomposer.org/installer | php -d detect_unicode=Off
```

##Laravelをインストールする
適当なディレクトリにいき、以下のコマンドを叩く

```
$ composer create-project laravel/laravel test
```

インストールが成功したら、

```
$ cd test
$ php artisan serve
```

[http://localhost:8000](http://localhost:8000)にアクセスして、You have arrived.が出たらOK。

##参考
[最小構成で始めるLaravel](http://qiita.com/localdisk/items/b5ad297d3aebf14c00ad)

[PHPのパッケージ管理Composerを使う](http://tech.basicinc.jp/php/2013/08/18/php_composer/)
RでMySQL


必要ならsshポートフォーワーディングでトンネルをつくっておく

```:shell
ssh -L 3306:localhost:3306 hoge@hoge.com
```

RMySQLライブラリを使う。入れていなければインストール

```:R
install.packages("DBI")
install.packages("RMySQL")
```

つかってみる

```:R
library(RMySQL)
dbconnector <- dbConnect(MySQL(), dbname="hoge", user="hoge", password="hoge", host="127.0.0.1", port=3306)
> query.result <- dbSendQuery(dbconnector, "select * from hoge")
> test.table <- fetch(query.result)
> test.table
```

#ハマりポイント

- r側では`host="localhost"`ではなく`host="127.0.0.1"`

## 追記
- タイポを修正
- RMySQL version 0.9-3に対応
Equiv_Jの練習問題 WHILE_true


```coq:WHILE_true.v
Theorem WHILE_true: forall b c,
     bequiv b BTrue  ->
     cequiv
       (WHILE b DO c END)
       (WHILE BTrue DO SKIP END).
Proof.
 move => b c H.
 unfold cequiv => st st'.
 split => HH.
  - destruct(WHILE_true_nonterm b c st st' H). by assumption.

  - destruct(WHILE_true_nonterm BTrue SKIP st st').
    - unfold bequiv. by reflexivity.
    
    - by assumption.
Qed.
```