OmniAICreator/Qiita-1.07M huggingface dataset:
AnsibleをゲストOSに押し込んでVagrant環境構築する

Windows上でVagrantをAnsibleでprovisionしようとすると、Windows上のAnsible環境で頭を悩ませることになります。（調べた限り無理らしい）

そこで、Ansibleは大人しくゲストマシンに押し込んでしまいましょう。

リポジトリはこちら
[progre/template-vagrant](https://github.com/progre/template-vagrant "progre/template-vagrant")

ディレクトリ構成はこんな感じ

```
ansible/
  hosts
  playbook.yml
provision.sh
Vagrantfile
```

Playbookを好きなように書きます。

```yaml:ansible/playbook.yml
---
- hosts: 127.0.0.1
  connection: local
  sudo: yes
  tasks:
    - name: install ruby
      apt: pkg=ruby update_cache=yes
    - name: install rubygems
      apt: pkg=rubygems update_cache=yes
    - name: install bundler
      command: gem install bundler
```

hostsも用意しておきます

```:ansible/hosts
127.0.0.1 ansible_connection=local
```

ゲストOSでAnsibleを実行するスクリプトを書きます。

```shell-session:provision.sh
#!/usr/bin/env bash

if ! [ `which ansible` ]; then
	apt-get update -y
	apt-get install -y ansible
fi

ansible-playbook -i /vagrant/ansible/hosts /vagrant/ansible/playbook.yml
```

あとはVagrantfileですね。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "precise64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  config.vm.synced_folder ".", "/vagrant", :mount_options => ['dmode=775', 'fmode=664']
  config.vm.provision "shell", :path => "provision.sh"
end
```

（補足）
共有フォルダはデフォルトだと実行可能属性になり、それだとhostsファイルが読めなくなります。
synced_folderの:mount_optionsで共有フォルダの属性を指定できます（garbagetownさんpullリクありがとうございます）


これでWindowsでもド安定でAnsibleで環境が作れます。

```shell-session
PS E:\Developments\vagrant\rubyist> vagrant provision
[default] Running provisioner: shell...
DL is deprecated, please use Fiddle
[default] Running: C:/Users/progre/AppData/Local/Temp/vagrant-shell20140202-12404-w7zith
stdin: is not a tty

PLAY [127.0.0.1] **************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]

TASK: [install ruby] **********************************************************
ok: [127.0.0.1]

TASK: [install rubygems] ******************************************************
ok: [127.0.0.1]

TASK: [install bundler] *******************************************************
changed: [127.0.0.1]

PLAY RECAP ********************************************************************
127.0.0.1                  : ok=4    changed=1    unreachable=0    failed=0

PS E:\Developments\vagrant\rubyist>

```
Mojoliciousで、Selenium + PhantomJS を使った簡単なスクレイピングツールを作る

スクレイピングツールの作成だと内容が特定しづらいので、タイトルを変えてみました。

今回は、ローカル環境で作成したアプリをMojoliciousで置き換えてWWW環境（CentOS)へアップロードしています。ＤＢはMySQLを使用しています。

ソースはGitHub↓
https://github.com/YasuakiOmokawa/MojoKaiseki01
に挙げてありますが、簡単な動きは以下のとおりです。

１．ブラウザ上から、開始ボタンをクリックして開始
２．スクレイプツールの呼び出し
３．DBからログイン情報を取得
３．Test::TCPでphantomJSを起動
４．データがほしいwebページへログインし、htmlソースを取得
５．htmlソースをブラウザへ表示して終了


いろいろ苦労しましたが、なんとか動く所までできました。

ですが、動きが遅いのは相変わらずのまま。プラットフォームの違いはあまり関係なかったようです。
テキストの最後の行だけ消したい時、どうやればいい？

# いきなり問題

次のように最後に必ず、余計な一行がくっついてくるテキストファイル(question.txt)がありました。

```text:question.txt:最後に余計な一行の付いたテキストファイル
こんにちは。
今日もいい天気ですね。
　　：
　♪なんだかんだ～
　　：
　　：　（途中は何行あるかわかりません）
　　：
　♪どーしたこーした～
　ホゲーィ！
　　：
さようなら。
.
```

この最後の一行だけを取り除いて出力したい時、どう書きますか？
（ヒント：このTipsのタグ）

# Thinking time

　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：

# こたえ

```sh:最もシンプルなこたえ
$ sed '$d' question.txt
```

```sh:別解
$ sed -n '$!p' question.txt
```

シェルスクリプトのwhile文、あるいはAWKコマンドなどで、「一行先読みして……。読み込みに成功したら先読みしていた行を出力して……」とかやらなくてもいいんですね。

sedのアドレス部に`$`を指定すると、最後の行を表すのでそれに対して`d`（削除）を実行してあげればいいというわけです。ちなみに`$!`と指定すると「最後の行以外」という意味になるので、そこを`p`（表示）するのでもイケます。（ただしこの場合は-nオプションが必要）

この`$`を応用すれば、最後の行だけいろいろと特別な加工をすることが簡単にできますね。先読みなんていう技を使わずに。
Emacsでウィンドウ移動をCtrl+TabとCtrl+Shift+Tabでする方法

##はじめに
今日久しぶりにEmacsの設定をしてましたが、やっぱ奥がめっちゃ深いですね
grepで止まっていた私には ag だの wgrep などスゲー！とかなる話ばかりで面白かったです
それ以外にウィンドウ切り替えの設定もしたので、その際のメモをこちらに残しておきます

##Emacsでウィンドウ移動を快適にする
[そろそろEmacsのウィンドウについて一言いっとくか](http://d.hatena.ne.jp/rubikitch/20100210/emacs)
こちらに紹介されている方法はとてもすばらしくて Ctrl+t を押すだけでウィンドウが１つのときは自動で１個作ってくれて、複数あったらウィンドウ切り替えをしてくれます

私の場合は、普段ブラウザや iTerm では Ctrl+Tab でタブ or ウィンドウの切り替えをしているため
まずこのキー設定を変えてみました
これだけでも便利ではあるのですが３つ以上のウィンドウがあったときは逆順に選択していくのも欲しくなるので Ctrl+Shift+Tab で実現できるようひと工夫加えてみました

```el
(defun other-window-or-split (val)
  (interactive)
  (when (one-window-p)
;    (split-window-horizontally) ;split horizontally
    (split-window-vertically) ;split vertically
  )
  (other-window val))

(global-set-key (kbd "<C-tab>") (lambda () (interactive) (other-window-or-split 1)))
(global-set-key (kbd "<C-S-tab>") (lambda () (interactive) (other-window-or-split -1)))
```

紹介されていた other-window-or-split の関数定義に引数を加えて Ctrl+Shift+Tab をしたときには other-window の引数に -1 を渡して逆順に遷移させています
デフォルトの分割については縦・横好きなほうを使うといいと思います

##おわりに
helm も使い始めたいのですが、何故か first というのでエラーが出て helm-ag が使えなくて困ってます。。。
しばらくは ag にお世話になりそうです
画面遷移をrobolectricでテストする


## 概要
Intentを発行して画面遷移する場合についてrobolectricでテストする方法について調べてみた。

テスト対象はEditTextとButtonを持つMainActivityと、TextViewを持つResultActivityからなり、EditTextに文字列に入力してButtonを押すと次の画面に入力された文字列を表示されるアプリとする。

やり方の概要は以下の通り。

- 遷移元ActivityでpeekNextStartedActivityを使って発行されたIntentを取得する
- 遷移後ActivityにIntentを渡して生成する


## peekNextStartedActivityでIntentを取得する
ActivityをShadow化するとpeekNextStartedActivityでIntentを取得できるようになるので、そこからデータなどを取得して発行されたIntentの内容が正しいことを確認する。

```java
MainActivity mainActivity = Robolectric
		.buildActivity(MainActivity.class).create().get();
		
mainActivity.editText.setText("test");
mainActivity.button.performClick();
		
ShadowActivity shadowActivity = Robolectric.shadowOf(mainActivity);
Intent intent = shadowActivity.peekNextStartedActivity();

String actual = intent.getStringExtra("DATA");
assertThat(actual, is("test"));
```

なお、次に起動するActivityのクラス名を取得したい場合にはIntentもShadow化する必要がある。

```java
ShadowIntent shadowIntent = Robolectric.shadowOf(intent);
String actualClassName = shadowIntent.getComponent().getClassName();
assertThat(actualClassName, is(ResultActivity.class.getName()));
```

## Intentを渡してActivityを生成する

RobolectricでActivityを生成する際にIntentを渡す場合には、withIntentを使う。
使うタイミングはbuildActivityの後。
また、Activityに渡すIntentを自分で生成するためにはRobolectricのContextを渡してあげる必要がある。

```java
Intent intent = new Intent(Robolectric.application.getApplicationContext(), ResultActivity.class);
intent.putExtra("DATA", "test");
ResultActivity resultActivity = Robolectric
		.buildActivity(ResultActivity.class).withIntent(intent).create().get();
		
String actual = resultActivity.textView.getText().toString();
assertThat(actual, is("test"));
```
MacOSXでRVMでインストールしたRubyのSSLの証明書エラーの対処法

現象
----

mechanize等ででSSLサイトをスクレイピングする時:

> SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

このようなエラーが出たら、証明書が失効している可能性がある。このようなとき証明書の有効性を以下のようにして調べることができる。

    $ rvm osx-ssl-certs status all
    rvm osx-ssl-certs status all
    Certificates for /usr/local/etc/openssl/cert.pem: Old.
    Certificates for /Users/tumf/.rvm/usr/ssl/cert.pem: Old.
    Certificates for /etc/openssl/cert.pem: Old

対処法
------

    $ rvm osx-ssl-certs update all
brunch.ioのインストールに失敗した(ansi-colorのせい？)

Nodeよくわからん人です。

ansi-colorで失敗しているらしい。

```
$ npm install -g brunch
（略）
npm http 304 https://registry.npmjs.org/connect-slashes
npm http 304 https://registry.npmjs.org/ansi-color
npm http GET http://packages:5984/ansi-color/-/ansi-color-0.2.1.tgz
npm ERR! fetch failed http://packages:5984/ansi-color/-/ansi-color-0.2.1.tgz
（略）
npm http GET http://packages:5984/ansi-color/-/ansi-color-0.2.1.tgz
npm ERR! fetch failed http://packages:5984/ansi-color/-/ansi-color-0.2.1.tgz
npm http GET http://packages:5984/ansi-color/-/ansi-color-0.2.1.tgz
npm ERR! fetch failed http://packages:5984/ansi-color/-/ansi-color-0.2.1.tgz
npm ERR! network getaddrinfo ENOTFOUND
npm ERR! network This is most likely not a problem with npm itself
npm ERR! network and is related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network 
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.  See: 'npm help config'

npm ERR! System Darwin 13.0.0
npm ERR! command "/usr/local/Cellar/node/0.10.25/bin/node" "/usr/local/bin/npm" "install" "-g" "brunch"
npm ERR! cwd /Users/myname/Works/demo/frontend
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.24
npm ERR! syscall getaddrinfo
npm ERR! code ENOTFOUND
npm ERR! errno ENOTFOUND
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/myname/Works/demo/npm-debug.log
npm ERR! not ok code 0
```

別にansi-colorをインストールしたらいけたっぽい。

```
$ npm install -g ansi-color
$ npm install -g brunch
```

※やべー、再現しない
CURLOPT_FILEでHTTPレスポンスをファイルに直接書き込んでいくサンプル

[curl_multiでHTTP並列リクエストを行うサンプル - Qiita [キータ]](http://qiita.com/Hiraku/items/1c67b51040246efb4254)で@mpywさんに質問された件…の答えにはなってないんですが、CURLOPT_FILEでレスポンスを丸投げするイメージを書いてみました。
あんまり自信ないです。もうちょっといい書き方がありそうな気がする。

## サーバー側
ストリーミングAPI的な感じのサンプル。node.jsで書いてみましたが、クライアントから切断されたらどうするとか書いてないし、ゴミのようなプログラムですね。。(石投げないで＞＜)
`node stream.js`と実行しておいて、 `curl -v http://localhost:1337/` とかやると1秒ごとにじわじわとレスポンスが出力されていく様子がわかります。

```js:stream.js
var http = require('http');

http.createServer(function(req, res){
    var i = 0;
    var id = 100 * Math.random() | 0;

    res.writeHead(200, {'Content-Type': 'text/plain'});
    setInterval(function(){
        var result = id + ':' + ++i;
        console.log(result);
        res.write(result + '\n');
    }, 1000);
}).listen(1337, 'localhost');

console.log('Server running at http://localhost:1337/');
```

## クライアント側
上のAPIっぽいものは無限に出力するので、全部返ってくるまで待っているといつまでも処理ができません。
そこでレスポンスとファイルを直結して直接流し込むような感じにしてみます。
CURLOPT_FILEでfopen()したファイルを直接指定しているのがポイントです。

ここでは通常のfile:を使いましたが、PHPにはストリームという仕組みがあり、ファイルと同じような感じで他の場所に書き込んだり、ストリームラッパーを自作して直接イベント駆動なプログラムが書けたりします。

```php:streamclient.php
<?php
const TIMEOUT = 10;

$mh = curl_multi_init();

$ch1 = curl_init('http://localhost:1337/');
$fh1 = fopen('result1.txt', 'w');
curl_setopt($ch1, CURLOPT_FILE, $fh1);
curl_multi_add_handle($mh, $ch1);

$ch2 = curl_init('http://localhost:1337/');
$fh2 = fopen('result2.txt', 'w');
curl_setopt($ch2, CURLOPT_FILE, $fh2);
curl_multi_add_handle($mh, $ch2);

//curl_multi start
do $stat = curl_multi_exec($mh, $running);
while ($stat === CURLM_CALL_MULTI_PERFORM);
if (!$running || $stat !== CURLM_OK) {
    throw new RuntimeException("$running $stat");
}

//curl_multi wait
do switch (curl_multi_select($mh, TIMEOUT)) {
    case -1: // selectに失敗するケースがあるらしい https://bugs.php.net/bug.php?id=61141
        usleep(10);
        do $stat = curl_multi_exec($mh, $running);
        while ($stat === CURLM_CALL_MULTI_PERFORM);
        continue 2;

    case 0: //timeout
        continue 2;

    default:
        //何か変化があった
        do $stat = curl_multi_exec($mh, $running);
        while ($stat === CURLM_CALL_MULTI_PERFORM);

        //強制書き込み
        fflush($fh1);
        fflush($fh2);
} while ($running);
```

サーバーが起動している状態で、このクライアント側のプログラムを動かすと、result1.txtとresult2.txtに1秒おきにレスポンスが追記されていきます。`tail -f result1.txt`とかで様子が見れるはず！

## TODO
- ストリーム処理の実装方法
- fflushで強制書き込みするのがダサいし、2つとも書き込みしているのが無駄。本当にイベントが起きたストリームだけ更新するようにしたい
- ちゃんとスケールする書き方
- ちゃんとfcloseとか後始末する感じの書き方
DropwizardのBanner

Bannersを試す。
Resource、Health CheckはGetting Startedと同じ。

Dropwizardのバージョンは0.6.2。

# banner.txt

src/main/resourcesにbanner.txtを置くだけ。

```text:banner.txt
_________ _______  _______ _________
\__   __/(  ____ \(  ____ \\__   __/
   ) (   | (    \/| (    \/   ) (   
   | |   | (__    | (_____    | |   
   | |   |  __)   (_____  )   | |   
   | |   | (            ) |   | |   
   | |   | (____/\/\____) |   | |   
   )_(   (_______/\_______)   )_(   
                                    
```

実行結果

```text
INFO  [2014-02-02 12:43:00,325] com.yammer.dropwizard.cli.ServerCommand: Startin
g hello-world
_________ _______  _______ _________
\__   __/(  ____ \(  ____ \\__   __/
   ) (   | (    \/| (    \/   ) (
   | |   | (__    | (_____    | |
   | |   |  __)   (_____  )   | |
   | |   | (            ) |   | |
   | |   | (____/\/\____) |   | |
   )_(   (_______/\_______)   )_(

INFO  [2014-02-02 12:43:00,330] org.eclipse.jetty.server.Server: jetty-8.y.z-SNA
PSHOT
```
第18回オフラインリアルタイムどう書くの参考問題をHaskellで解いた


[第18回オフラインリアルタイムどう書くの参考問題](http://qiita.com/Nabetani/items/373105e7fafd12f5e9fd)をHaskellで解きました。
問題の詳細は[山折り谷折り〜 横へな 2014.2.1 参考問題](http://nabetani.sakura.ne.jp/hena/ord18mafovafo/)


```hs:yamatani.hs

invert [] = []
invert xs = map invert' $ reverse xs
	where
		invert' 'm' = 'V'
		invert' 'V' = 'm'

j [] = "V"
j xs = xs ++ "V" ++ (invert xs)

l [] = "V"
l xs = (invert xs) ++ "V" ++ xs

s [] = "Vm"
s xs = xs ++ "V" ++ (invert xs) ++ "m" ++ xs

z [] = "mV"
z xs = xs ++ "m" ++ (invert xs) ++ "V" ++ xs

u [] = "VV"
u xs = (invert xs) ++ "V" ++ xs ++ "V" ++ (invert xs)


solve xs = foldr applyFunc "" xs
	where
		applyFunc :: Char -> String -> String
		applyFunc c xs = charToFunc c xs
		
		charToFunc :: Char -> (String -> String)
		charToFunc 'J' = j
		charToFunc 'L' = l
		charToFunc 'S' = s
		charToFunc 'Z' = z
		charToFunc 'U' = u

main = do
	line <- getLine
	let [input, expect] = words line
	let output = solve input
	putStrLn $ if expect == output then "OK" else "NG"
	main
```

他の過去問も解いています。（解けそうな問題から書いてます。。。汗）

+ [第9回オフラインリアルタイムどう書くの参考問題をHaskellで書いた](http://qiita.com/liveinwood/items/5e8cb20c4424dba4354a)
+ [第10回オフラインリアルタイムどう書くの問題をHaskellで書いた](http://qiita.com/liveinwood/items/64f4e7f26f70dced5096)
+ [第14回オフラインリアルタイムどう書くの参考問題をHaskellで書いた](http://qiita.com/liveinwood/items/c95b42364e6103a73c27)
+ [第17回オフラインリアルタイムどう書くの参考問題をHaskellで書いた](http://qiita.com/liveinwood/items/f9891d2f17034686631a)
[動画解説] Sublimeちゃんのウィンドウレイアウトまわりのキーボードショートカットを使いこなそう！！

こんにちは。

職場ではdell製d-sub出力の19インチSXGAムスカパネルなシングルモニタ環境で作業しています。

yoshidaxです。

狭いモニタで作業する場合は効率よくレイアウトを切り替えたいものですね。

そんな要望にやっぱりSublimeちゃんは応えてくれます。

Youtubeに動画をアップしたので御覧ください！！

[convenient keyboard shortcuts for sublime text 2 - Layout, Focus Group, Move File To Group](http://youtu.be/V03ZvGwxD38)

メニューアイテムの``View``配下の``Layout``、``Focus Group``、``Move File To Group``のキーボードショートカットをまとめたものになります。

キーボードショートカットでウィンドウ内のエディタ領域をグループに縦、横、格子分割、グループ間のファイル移動、グループ間のフォーカス移動ができることがわかると思います。

WindowsのひとはCMDキーをCTRLキーに置き換えればよろしいんじゃないでしょうか。

ということでキーボードショートカットを覚えてマウスやトラックパッドを投げ捨てても困らないくらいになりたいものだなぁと思いました。

それではまた！！
SQLITE3 csv import

子供用にWebアプリを作っていて、
実験がてら bottle + mod_wsgiのPythonで行こう。
sqlite3を使おうと。

よくある話ですが、Windows環境でcsvを作成して、linux環境に流します。
コマンド自体は、
sqlite3 -separator , <dbname> ".import <csvfilename> <tablename>"
なんですが、
datatype mismatchエラーが起こる。

Windows環境のcsv (notepad++で作成)のエンコードをUTF-8(BOMなし)に
変換することで解決しました。
tigとGitHubを連携させる幾つかのカスタムキーバインド

GitHubにホストされたプロジェクトの開発時には [hub](http://hub.github.com/) を利用すると便利です。
このhubをtigから扱えるようにカスタムキーバインドを設定しておくと、
tigとGitHubを連携させていくつかの操作が便利になりますので紹介します。

```
# リポジトリのGitHubを表示
bind generic ^ !@hub browse

# issuesを表示
bind generic - !@hub browse -- issues

# 選択したcommitをGitHubで表示
bind generic ~ !@hub browse -- commit/%(commit)

# 選択したcommitのci-statusを確認
bind generic = !hub ci-status %(commit)

# 選択したbranchをcompareに送る
bind branch [ !@hub compare %(branch)

# 現在のbranchからpull-requestを作成
bind main { !hub pull-request
```

GitHub関連のコマンドは普段バインドすることが少ない記号を選んでいます。

参考にしたページ：

* [tigで見ているコミットをgithubで開く](http://qiita.com/yaotti/items/62947b0c981ae38fae82)
* [hubコマンド使ってみた - $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2012/11/22/174319)
* [hub manual](http://hub.github.com/hub.1.html)
Vagrant と chef を組み合わせる時の基本

# Vagrant と chef を組み合わせる時の基本

chef-solo を使ってOSのセットアップを自動化する場合、新しいOSで以下の作業が必要になる。

1. chefパッケージをインストール
1. 既に作成済みのレポジトリを配置
1. config.rb, attributes.json を配置
1. chef-solo を実行


Vagrantで作成した仮想マシンに対しては、上記手順を自動で適用することができる。


## 1. chefパッケージをインストール

 (Vagrantコマンドが良いようにしてくれるので不要)
 

## 2. 既に作成済みのレポジトリを配置

**Vagrantプロジェクトフォルダは、ゲストOSの /vagrant にマウントされる** という仕組みになっている。
ので、Vagrantプロジェクトフォルダにchefレポジトリを配置しておけばゲストOSから見れる。


## 3. config.rb, attributes.json を配置

(Vagrantコマンドが良いようにしてくれるので不要)

## 4. chef-solo を実行

Vagrantプロジェクトフォルダの中のVagrantfileで、cookbooks_path と add_recipe をちゃんと書くと、```vagrant up``` もしくは ```vagrant provision``` 実行時にchef-solo を実行してくれる。

```
  # Enable provisioning with chef solo, specifying a cookbooks path, roles
  # path, and data_bags path (all relative to this Vagrantfile), and adding
  # some recipes and/or roles.
  #
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "repo/site-cookbooks"
    chef.add_recipe "bar"
  end

```
コメントの注釈にもある通り、cookbooks_path は Vagrantfile からの相対pathで指定。
山手線停車駅の座標一覧

# 一覧

| 駅名 | 緯度 | 経度 |
|:-----------:|-----------:|-----------:|
| 東京 | 35.681382 | 139.76608399999998 |
| 有楽町 | 35.675069 | 139.763328 |
| 新橋 | 35.665498 | 139.75964 |
| 浜松町 | 35.655646 | 139.756749 |
| 田町 | 35.645736 | 139.74757499999998 |
| 品川 | 35.630152 | 139.74044000000004 |
| 大崎 | 35.6197 | 139.72855300000003 |
| 五反田 | 35.626446 | 139.72344399999997 |
| 目黒 | 35.633998 | 139.715828 |
| 恵比寿 | 35.64669 | 139.710106 |
| 渋谷 | 35.658517 | 139.70133399999997 |
| 原宿 | 35.670168 | 139.70268699999997 |
| 代々木 | 35.683061 | 139.702042 |
| 新宿 | 35.690921 | 139.70025799999996 |
| 新大久保 | 35.701306 | 139.70004399999993 |
| 高田馬場 | 35.712285 | 139.70378200000005 |
| 目白 | 35.721204 | 139.706587 |
| 池袋 | 35.728926 | 139.71038 |
| 大塚 | 35.731401 | 139.72866199999999 |
| 巣鴨 | 35.733492 | 139.73934499999996 |
| 駒込 | 35.736489 | 139.74687500000005 |
| 田端 | 35.738062 | 139.76085999999998 |
| 西日暮里 | 35.732135 | 139.76678700000002 |
| 日暮里 | 35.727772 | 139.770987 |
| 鶯谷 | 35.720495 | 139.77883700000007 |
| 上野 | 35.713768 | 139.77725399999997 |
| 御徒町 | 35.707438 | 139.774632 |
| 秋葉原 | 35.698683 | 139.77421900000002 |
| 神田 | 35.69169 | 139.77088300000003 |

# コード
```html:index.html
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>山手座標</title>
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
    <script src="main.js"></script>
  </head>
  <body>
    <table class="table-station">
      <thead>
        <tr><th>駅名</th><th>緯度</th><th>経度</th></tr>
      </thead>
      <tbody>
      </tbody>
    </table>
  </body>
</html>
```

```js:main.js
var geocoder;
var stationArr = ['東京','有楽町','新橋','浜松町','田町','品川','大崎','五反田','目黒','恵比寿','渋谷','原宿','代々木','新宿','新大久保','高田馬場','目白','池袋','大塚','巣鴨','駒込','田端','西日暮里','日暮里','鶯谷','上野','御徒町','秋葉原','神田'];
var stationLen = stationArr.length;

function initialize() {
  geocoder = new google.maps.Geocoder();
  var tbl = document.querySelector('.table-station tbody');

  var i=0;
  getNextStation();
  function getNextStation() {
    geocoder.geocode( { 'address': stationArr[i]+'駅, 東京都'}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        tbl.innerHTML += '<tr>'+
          '<th>'+stationArr[i]+'</th>'+
          '<td class="lat">'+results[0].geometry.location.lat()+'</td>'+
          '<td class="lng">'+results[0].geometry.location.lng()+'</td>'+
        '</tr>';
      } else {
        console.log('Geocode was not successful for the following reason: ' + status);
      }
      i++;
      if(i < stationLen) {
        // リクエスト制限があるため処理を遅らせる
        window.setTimeout(function() {
          getNextStation();
        }, 1000);
      }
    });
  }
}

google.maps.event.addDomListener(window, 'load', initialize);
```

# 参考サンプル
[Geocoding service - Google Maps JavaScript API v3 — Google Developers](https://developers.google.com/maps/documentation/javascript/examples/geocoding-simple?hl=ja "Geocoding service - Google Maps JavaScript API v3 — Google Developers")

# 宣伝

本記事から着想を受け、技術書典向けに『Google Maps APIで取得する 山手線停車駅の座標』を執筆しました。
Node.jsでの取得方法からGoogle Maspでのピンの設置デモまで記載しています。
あと高輪ゲートウェイ駅も載っています！

https://techbookfest.org/product/mDfLKfj3WFVhALNPDaURCr
fluentd -> Elasticsearch 大量データ転送でトラブル

長くなったので詳細はブログに移行します

目的
==========
- fluentd でサービスの情報を転送し、Kibana で分析したい
- これまでの過去データを一度に放り込みたい

問題
==========
- データの件数が合わない
- Kibana でエラーが発生する

対応案
==========

- indx をあらかじめ作成しておく
    index 作成コストは大きい

- ThreadPool の設定
    デフォルトでは閾値以上のキューが破棄される
    
- データマッピングの設定
    特に日付型のフィールドに注意

- 空の index の削除
    Kibana で作成されるクエリにてエラーの原因となる
    
- リクエスト長の設定
    デフォルトは短すぎるため、
    広範囲の日付(=多くの index)を対象としたクエリを
    投げる際にエラーの原因となる
    
    
詳しくは
[fluentd -> Elasticsearch 大量データ転送でトラブル | diaspora](http://blog.kakipo.com/blog/2014/02/01/trouble-with-fluentd-and-elasticsearch/)
Docker + busybox で Inconsistency detected by ld.so エラー


buildroot で busybox 環境を作ってアプリを動かしたら以下のようなエラーが出ました.

```
Inconsistency detected by ld.so: dl-lookup.c: 728: _dl_lookup_symbol_x: Assertion `version == ((void *)0) || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_GSCOPE_LOCK)) == 0' failed!
```

ダイナミックリンカ周りのエラーのようです.

rootfs を作るときに libdl も含めるようにします(docker を動かしている環境は ubuntu12.04).

```
cp /lib/x86_64-linux-gnu/libdl.so.2 extra/lib64
chmod +x extra/lib64/libdl.so.2
```

/lib にインストールすると docker のラインタイムと競合するようで docker run 時に実行時エラーとなります.

アプリケーションはデフォルトだと /lib を見るので, /lib64 を先に見るように LD_LIBRARY_PATH を設定します.


```
$ docker run -e LD_LIBRARY_PATH=/lib64:/lib -t tinyfs /my/app
```

これでとりあえずエラーは解決しますが, より確実には busybox(buildroot)のランタイム環境と, 開発(docker のホスト環境)のランタイム環境を合わせるようにしたほうがよさそうですね.
【cocos2dx v3.0 beta2】【Box2D】Box2Dを使わずにすんげー簡単に物理演算エンジンの恩恵を得る方法　後編

前編で、Box2Dを利用して物理演算エンジンの恩恵を受ける方法を紹介しました。
今度はそれを使わずに物理演算エンジンの恩恵を受ける方法を紹介したいと思います。

#実装

```cpp:PhysicsWorldScene.h
#import "cocos2d.h"

USING_NS_CC;

class PhysicsWorldScene : public Layer
{
private:
    
    PhysicsWorldScene();
    ~PhysicsWorldScene();
    
    static PhysicsWorldScene* scene();

    void createSprite();
public:
    static Scene* createScene();
    virtual bool init();
    CREATE_FUNC(PhysicsWorldScene);

};
```

```cpp:PhysicsWorldScene.cpp
#include "PhysicsWorldScene.h"

#import "GameConfig.h"

PhysicsWorldScene::PhysicsWorldScene(){}
PhysicsWorldScene::~PhysicsWorldScene(){}

Scene* PhysicsWorldScene::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::createWithPhysics();
    
    // 'layer' is an autorelease object
    auto layer = PhysicsWorldScene::create();
    
    // add layer as a child to scene
    scene->addChild(layer);
    
    layer->createSprite();

    // return the scene
    return scene;
}

bool PhysicsWorldScene::init(){
    return true;
}

void PhysicsWorldScene::createSprite(){
    Size winSize = Director::getInstance()->getWinSize();
    
    Sprite* sprite = Sprite::create("peri1.png");
    sprite->setPosition(Point(winSize.width / 2 , winSize.height / 2));
    sprite->setPhysicsBody(PhysicsBody::createCircle(32));
    this->addChild(sprite);
}
```

これだけ！

実行してみます。

![cocoperi2.png](https://qiita-image-store.s3.amazonaws.com/0/26453/b3931192-150b-fb56-331e-918e1f340627.png)

(違いを出すため、実行時には画像を三つ生成しました。）
しっかり落ちています！たったこれだけのコードで物理演算の世界を作ることが出来ました。

### 補足
ポイントは

```cpp:PhysicsWorldScene.cpp
auto scene = Scene::createWithPhysics();
```

ここです。普段ならcreate()で済ませる所をcreateWithPhysics()にしています。
これに切り替えると生成したScene全体が物理演算の影響を受けることが出来るようになります。
そして生成したSpriteにPhysicsBodyをセットすると

```cpp:PhysicsWorldScene.cpp
    sprite->setPhysicsBody(PhysicsBody::createCircle(32));
```

その画像は剛体を持つ事になり、物理演算の影響を受ける！という事になります。
ここでは円形を利用しましたが、もちろん形状はひと通り用意されていますので、ご安心を。

しかし、このままでは重力値などの設定が出来ません。
その場合はこのようなコードで対処出来ます。

```cpp:PhysicsWorldScene.cpp
    PhysicsWorld* world = this->getScene()->getPhysicsWorld();
    
    Vect gravity;
    gravity.setPoint(0, -50);
    
    world->setGravity(gravity);
```

sceneがPhysicsWorldを持っているのでこのようにお借りしましょう。
Box2Dよくわからんよー、簡単に使いたいよーって方、是非お試しあれ〜。

###### ごにょ
内部的にはchipmunkを利用しています。
Box2Dを使わずに〜って結局chipmunkを使ってるだけやないか！( ‘д‘⊂彡☆))Д´) ﾊﾟｰﾝ
という声が聞こえてきそうですが、ご勘弁を…。
MS Word / PowerPoint の数式エディタで花文字(?)を打つ方法

花文字(であっているのかわからないが)、LaTeX だとこんなこんな感じででるやつ。

```latex
\mathcal{ABCDEFGH}
```

![calligraphic_word.png](https://qiita-image-store.s3.amazonaws.com/0/34199/0ea33639-3f0c-cc0f-a200-be345141d1e1.png)

数式エディタを起動して、メニュー->スタイル->その他...からフォントを指定できる。
どのフォントがそれかわからなかったけど、とりあえず、`Lucida Calligraphy`を指定したらそれっぽくなった。
CakePHPで「htmlHelper could not be found.」エラー

# 状況
CakePHPで、`Error: htmlHelper could not be found.`なるエラーが発生する。

# 原因

コントローラのhelpersを定義するところで、`Html` `Form`が小文字になっている。

```php:PostsController.php
class PostsController extends AppController {
    public $helpers = array('html', 'form');
}
```

# 対策

大文字小文字を正しく、`Html` `Form`にする。

```php:PostsController.php
class PostsController extends AppController {
    public $helpers = array('Html', 'Form');
}
```
データベースの格納ディスクの引越し


環境: Mac OSX 

ramdisk上に配置して使用していたが、容量が枯渇してきたのでHDDに戻す。

mysqlの停止

```
# 自動起動の設定を一時的に解除
reattach-to-usernamespace launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
# サーバ停止
mysql.server stop
```

/usr/local/var/mysql のシンボリックリンク削除しディレクトリ作成

```
rm /usr/local/var/mysql
mkdir /usr/local/var/mysql
```

/Volumes/ramdisk/mysql の内容を /user/local/var/mysql にコピー

```
cp -r /Volumes/ramdisk/mysql /usr/local/var/mysql
```

mysqlの起動

```
# 自動起動の設定を一時的に解除
reattach-to-usernamespace launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
```


以上、で完了
chef-soloの概念と基礎をざっくりと

chef-soloの基礎

chefの中でも、一番基本になっているchef-soloの仕組みと使い方をざっくりと説明
![chef-solo.svg.png](https://qiita-image-store.s3.amazonaws.com/0/36569/3bfa644b-8c10-dfb2-dfa6-eb671947bc5c.png)

# chefについてざっくりと

chef とは Linuxのセットアップ(ユーザーの追加、パッケージのインストール、サービスの設定など)を自動的に行うツール

# chefで使われる用語

<dl>
  <dt><i>レシピ</i></dt>
  <dd>設定を記述したファイル</dd>

  <dt><i>クックブック</i></dt>
  <dd>レシピファイル、インストールするrpm、その他必要なファイル等をまとめたディレクトリ</dd>

  <dt><i>レポジトリ</i></dt>
  <dd>chef実行時に必要なファイルセット。クックブック、レシピ等をまとめたディレクトリ</dd>

  <dt><i>knife</i></dt>
  <dd>レポジトリ、クックブック、レシピ等を扱うコマンド</dd>

  <dt><i>chef-solo</i></dt>
  <dd>レシピに従ってOSの設定を変更するコマンド</dd>

</dl>


# chefを使う時の流れ

(インストールを行うrootユーザーで作業しています)

1. 必要なパッケージのインストール
1. レポジトリを作成
1. クックブック、レシピを作成
1. レシピを適用

## 準備

chefパッケージとknife-soloパッケージをインストールする。

```
# gem install chef
# gem install knife-solo
```

初期設定を行う。

```
# knife configure 
```

## レポジトリの作成

```
# mkdir /path/to/repository
# cd /path/to/repository
# knife solo init .
````

## クックブックとレシピの作成

クックブックは、レポジトリの *cookbooks* ディレクトリ、もしくは *site-cookbooks* ディレクトリに作成する必要がある。

1. クックブックの作成

site-cookbooksディレクトリの下に hoge というクックブックを作成する場合、以下のように実行する

```
# cd /path/to/repository/
# knife cookbook create hoge -o site-cookbooks/
```

2. レシピを作成

レシピの書式については、http://docs.opscode.com/essentials_cookbook_recipes.html を参照のこと。

例としてzsh パッケージをインストールするレシピを、hogeクックブックの中の defaultレシピとする場合は、以下のように記述する。

```/path/to/repository/site-cookboos/hoge/recipes/default.rb
package "zsh" do
    action :install
end
```

## レシピの適用

- クックブックフォルダのpath
- どのクックブックを利用するか
を指定してコマンドを実行する必要がある。

1. クックブックフォルダのpathを指定するファイル

適当な場所(/path/to/config.rb)に、以下の内容で .rb ファイルを作成する。

``` 
file_cache_path "/tmp/chef-solo"
cookbook_path ["/path/to/repository/site-cookbooks"]
```

2. どのクックブックを利用するか(Attribute設定ファイル)
適当な場所に(/path/to/attributes.json)以下の内容で .json ファイルを作成する。 (クックブックhogeのdefault.rbレシピを実行する指定)

```
{
   "run_list" : [
        "recipe[hoge]"
   ]
}
```
※ cookbook[hoge]ではなく、recipe[hoge]と記載する理由は調査のToDo。


3. クックブックの適用

```
# chef-solo -c /path/to/config.rb -j /path/to/attributes.json
```
オフラインリアルタイムどう書く第四回の参考問題をHaskellで書いた


[オフラインリアルタイムどう書く第四回の参考問題](http://qiita.com/Nabetani/items/9c514267214d3917edf2)をHaskellで書きました。

アルゴリズムは単純な深さ優先探索です。
通行止めがない５×５のグラフを予めハードコーデリングしているのがイマイチです。。。

```hs:fukashigi.hs
import Data.List

type Path = (Char,Char)
type Graph = [Path]
graph = [
		('a','b'),('a','f'),
		('b','c'),('b','g'),('b','a'),
		('c','d'),('c','h'),('c','b'),
		('d','e'),('d','i'),('d','c'),
		('e','j'),('e','d'),
		('f','a'),('f','g'),('f','k'),
		('g','b'),('g','h'),('g','l'),('g','f'),
		('h','c'),('h','i'),('h','m'),('h','g'),
		('i','d'),('i','j'),('i','n'),('i','h'),
		('j','e'),('j','o'),('j','i'),
		('k','f'),('k','l'),('k','p'),
		('l','g'),('l','m'),('l','q'),('l','k'),
		('m','h'),('m','n'),('m','r'),('m','l'),
		('n','i'),('n','o'),('n','s'),('n','m'),
		('o','j'),('o','t'),('o','n'),
		('p','k'),('p','q'),('p','u'),
		('q','l'),('q','r'),('q','v'),('q','p'),
		('r','m'),('r','s'),('r','w'),('r','q'),
		('s','n'),('s','t'),('s','x'),('s','r'),
		('t','o'),('t','y'),('t','s'),
		('u','p'),('u','v'),
		('v','q'),('v','w'),('v','u'),
		('w','r'),('w','x'),('w','v'),
		('x','s'),('x','y'),('x','w'),
		('y','t'),('y','x')
		] :: Graph


makeGraph :: IO Graph
makeGraph = do
	line <- getLine
	let removedPath = concatMap (\(x:y:[]) -> [(x,y),(y,x)]) $ words line
	let removedGraph = foldr delete graph removedPath
	return removedGraph


dfs p g graph px | p == g = 1
                 | p `elem` px = 0
                 | otherwise = sum [dfs np g graph (p:px) | np <- nextp p]
                 where
           			nextp p = [y | (x,y) <- graph, x == p]

main = do
	removedGraph <- makeGraph
	print $ dfs 'a' 'y' removedGraph []

```

他の過去問も解いています。（解けそうな問題から書いてます。。。汗）

+ [第9回オフラインリアルタイムどう書くの参考問題をHaskellで書いた](http://qiita.com/liveinwood/items/5e8cb20c4424dba4354a)
+ [第10回オフラインリアルタイムどう書くの問題をHaskellで書いた](http://qiita.com/liveinwood/items/64f4e7f26f70dced5096)
+ [第14回オフラインリアルタイムどう書くの参考問題をHaskellで書いた](http://qiita.com/liveinwood/items/c95b42364e6103a73c27)
+ [第17回オフラインリアルタイムどう書くの参考問題をHaskellで書いた](http://qiita.com/liveinwood/items/f9891d2f17034686631a)
Parse iOS SDKでPFObjectのサブクラスを登録し忘れないようにする


Parseのデータは、PFObjectを使ってアクセスすることができますが、
PFObjectのサブクラスを作るとデータのフィールドを明示したりコード補完することができ、大変便利です。

[Subclasses](https://parse.com/docs/ios_guide#subclasses/iOS)

サブクラスを定義しアプリで利用するためには、[Subclassing PFObject](https://parse.com/docs/ios_guide#subclasses-defining/iOS) の通りの手順を行わないといけないのですが、
クラス定義と登録が別なので、最後の手順で作成したサブクラスのヘッダーをインポートし、`AppDelegate`で`registerSubclass`を呼ばないと行けないというのをよく忘れがちです。

```objectivec:original.m
// Armor.h
@interface Armor : PFObject<PFSubclassing>
+ (NSString *)parseClassName;
@end
 
// Armor.m
// Import this header to let Armor know that PFObject privately provides most
// of the methods for PFSubclassing.
#import <Parse/PFObject+Subclass.h>
 
@implementation Armor
+ (NSString *)parseClassName {
  return @"Armor";
}
@end
 
// AppDelegate.m
#import <Parse/Parse.h>
#import "Armor.h"               // これと
 
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [Armor registerSubclass];     // この箇所
  [Parse setApplicationId:parseAppId clientKey:parseClientKey];
}
```

いちいち`AppDelegate`で登録を行わなくても、サブクラスがロードされた時に登録すればいいと気づいたので、`+(void)load`を使って登録を行うようにしました。

```objectivec:new.m
// Armor.h
@interface Armor : PFObject<PFSubclassing>
+ (NSString *)parseClassName;
@end
 
// Armor.m
// Import this header to let Armor know that PFObject privately provides most
// of the methods for PFSubclassing.
#import <Parse/PFObject+Subclass.h>
 
@implementation Armor
// クラスロード時に登録を行う
+ (void)load {
    __weak typeof(self) weakSelf = self;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [weakSelf registerSubclass];
    });
}

+ (NSString *)parseClassName {
  return @"Armor";
}
@end
 
// AppDelegate.m
#import <Parse/Parse.h>
//#import "Armor.h"               // これと
 
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//  [Armor registerSubclass];     // これはいらない
  [Parse setApplicationId:parseAppId clientKey:parseClientKey];
}
```

これで、サブクラス登録を忘れてデータにアクセスできずしばらくデバックするはめになるという悲しいことになりにくくなりました。
タイピングするのが面倒というのであれば、Xcodeか[Dash](https://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12)のSnippetに登録するとよいでしょう

![pfobjectregsiter.png](https://qiita-image-store.s3.amazonaws.com/0/2197/302f4d3c-3536-004c-ff7c-dd3906891ce3.png "pfobjectregsiter.png")
rbenvでRuby2.1.0アップデート

## ruby2.1.0がリリースされています

https://www.ruby-lang.org/ja/news/2013/12/25/ruby-2-1-0-is-released/

> Ruby 2.1.0 をリリースしました。
> Ruby 2.1 では深刻な非互換もなく、速度の向上を含めた多くの改善が行われています。
> どうぞご利用ください。

簡単に導入できて、改善の恩恵を受けることが出来そうです。
さっそく、アップデートしましょう。

ただ、gemとか入れなおしになるので、時間があるときにやりましょう。

## とりあえずbrewを最新に

**ターミナル**

```
brew update
brew upgrade
```

※本当はrbenvのアップデートだけでよいでしょう。
## インストールできるRubyのバージョンを確認します

**ターミナル**

```
rbenv install --list
```

**出力結果**

```
Available versions:
〜〜〜
2.1.0
2.1.0-dev
2.1.0-preview1
2.1.0-preview2
2.1.0-rc1
2.2.0-dev
〜〜〜
```

2.1.0があるので、これをインストールすることにします。

## インストール

**ターミナル**

```
RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.0
```

時間がかかるので、なにか別の用事をするとよいでしょう。

## rbenv globalを2.1.0に設定する

**ターミナル**

```
rbenv versions
```

**出力結果**

```
  system
* 2.0.0-p247 (set by /Users/yoneapp/.rbenv/version)
  2.1.0
```

**ターミナル**

```
rbenv global 2.1.0
```

**ターミナル**

```
rbenv versions
```

**出力結果**

```
  system
  2.0.0-p247
* 2.1.0 (set by /Users/yoneapp/.rbenv/version)
```

以上。
Windows環境でのスクリーンショット



初投稿♪
内容は軽めです m(＿)m

# 画面キャプチャー

オペレーション操作や単体テストの実施結果をログとして残したい場合を考えます。
CUI環境であればテキストファイルに落として、作業エビデンスとして保管するという方法が思いつきます。
一方、Windows上でスクリーンショットをエビデンスとして取得したい場合は、どうすればいいか？

<br>
# ツールの利用

私は「WinShot」というツールをよく利用してます。
<http://www.forest.impress.co.jp/library/software/winshot/>

こちらを使うと、BMP/JPEG形式の画像ファイルとして保存することができますし、
標準搭載の「Print Screen」よりは楽できます♪

![0.jpg](https://qiita-image-store.s3.amazonaws.com/0/36127/16a659c4-d65a-fe90-ca8a-a21fe243fefe.jpeg)


# エビデンス保存

おススメは、「矩形(くけい)選択」「JPEG形式」保存です。
「WinShot」では、ホットキーとして、「Ctrl + Alt + F9」が用意されています。
画面キャプチャーの際、必要な部分だけを抜き出すことで、サイズもスリム化。
<br>

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/36127/df25b7c6-c748-02e5-e1dd-63c7b6730afe.jpeg)
全体をキャプチャーすると、画面のどの部分が肝かという点、レビューアが分かりにくい・・・。
<br>

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/36127/0d0aa439-c1cf-df4a-0909-508dbcffa0fd.jpeg)
欲しいのは一部の情報(-_-;)
<br>

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/36127/2a2da35a-f4fc-6f3b-409d-c8763b76eeab.jpeg)
そういう場合は、矩形選択♪
<br>

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/36127/40efc28c-4b8a-e72d-894c-957eb2a2c349.jpeg)
「WinShot」では、範囲指定が可能です。
<br>

![5.JPG](https://qiita-image-store.s3.amazonaws.com/0/36127/4788b2ac-d891-4118-03fd-e77e7be07429.jpeg)
無事、必要な部分だけ取得できました＾＾
<br>

以上
<br>
RepaとNCursesでGame of Life (Haskellで配列を利用する)

というわけで、ライフ・ゲームをRepaライブラリを使って書きなおしてみた（Repaの配列の実体はData.Vectorでそれをラップしている）。ディレイなしで実行すると、IArray（DiffUArray）版と比べて、手元の200*50程度仮想ターミナルで概ね４〜５倍の実行時間の差が出ている。当たり前だが、やっぱり早い。Repaの使い方も見ての通り（本格的な行列計算をするのでもなければ）それほど難しいわけではないので、昔からHaskellにあるとはいえ、IArrayとか使う理由はなさそうだ。

使用しているライブラリは`repa`,`repa-algorithms`,`ncurses`なので試してみたければcabalでこれらのパッケージをインストールしてください。使い方はコードにかかれている通り：

```
./LifeGame 250
```

でステップ間に250msのスリープを挟む。終了したいときはENTERキーを押下。

```hs:LifeGame_Repa_NCurses.hs
module Main where

import Control.Monad (forM_)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.ST (runST)
import System.Random (getStdRandom,random)
import System.Environment (getArgs)
import System.Exit (exitSuccess)
import UI.NCurses
import qualified Data.Array.Repa as R
import Data.Array.Repa.Algorithms.Randomish (randomishIntArray)


type Field = R.Array R.U R.DIM2 Int

initialize :: (Int,Int) -> IO Field
initialize (x,y) = do
  seed <- getStdRandom random
  return $ randomishIntArray (R.Z R.:.x R.:.y) 0 1 seed

aggregate :: Field -> Field
aggregate f = runST $ do
  R.computeP $ R.traverse f id (\ _ sh -> count f sh)	

count :: Field -> R.DIM2 -> Int
count f (R.Z R.:.x R.:.y) = sum $ map
  (\(i,j) -> (R.!) f (R.Z R.:.i R.:.j)) $
  [(i,j)|i<-[x-1,x,x+1],j<-[y-1,y,y+1],0<=i,i<=(xmax-1),0<=j,j<=(ymax-1)]
    where (R.Z R.:.xmax R.:.ymax) = R.extent f

step :: Field -> Field
step f = runST $ do
  R.computeP $ R.zipWith survival f (aggregate f)
    where survival x y = if x == 1 
    	   then case y of {3->1; 4->1; _->0;}
    	   else case y of {3->1; _->0;}

drawField :: Field -> Update ()
drawField f = do
 let (R.Z R.:. xmax R.:. ymax) = R.extent f
 forM_ [(x,y)|x<-[0..(xmax-1)],y<-[0..(ymax-1)]] $ \(x,y) -> do
   moveCursor (fromIntegral x) (fromIntegral y)
   drawString $ case f R.! (R.Z R.:. x R.:. y) of {1->"o";_->" ";}



main :: IO ()
main = do
  [arg] <- getArgs -- 引数は画面の更新間隔(ミリ秒)
  let delaytime = read arg
  runCurses $ do
    (x,y) <- screenSize
    f <- liftIO $ initialize (fromIntegral (x-1), fromIntegral y)
    let series = iterate step f
    setEcho False
    setCursorMode CursorInvisible
    cid <- newColorID ColorGreen ColorBlack 1
    w <- defaultWindow
    updateWindow w $ setColor cid
    forM_ series $ \c -> do 
      updateWindow w $ drawField c
      render
      listenTo w delaytime 
        (\ev -> ev == EventCharacter '\n') -- Enterキー押下で終了

listenTo :: Window -> Int -> (Event -> Bool) -> Curses ()
listenTo w n p = do
  ev <- getEvent w (Just $ fromIntegral n)
  case ev of
    Nothing -> return ()
    Just ev' -> if p ev' then liftIO exitSuccess else return ()
```
TwitterでFollowしてないユーザーをまとめてFollowする


```python:followAllFollowers.py
# -*- coding: utf-8 -*-
import twitter
import time
import secret

api = twitter.Api(
		consumer_key = secret.dict['consumer_key'],
		consumer_secret = secret.dict['consumer_secret'],
		access_token_key = secret.dict['your_user_key'],
		access_token_secret = secret.dict['your_secret_key']
		)

def getNotfollowingIDs():
	following = api.GetFriendIDs()
	followers = api.GetFollowerIDs()

	notfollowing = []
	for item in followers:
		if item not in following:
			notfollowing.append(item)

	return notfollowing

if __name__ == '__main__':
	notfollowing = getNotfollowingIDs()
	for i in notfollowing:
		try:
			api.CreateFriendship(i)
			usr = api.GetUser(i)
			print 'Create a friendship with %s(@%s)' % (usr.GetName(), usr.GetScreenName())
		except:
			time.sleep(60)
```

　Twitterの単位時間あたりのAPIアクセス制限があるらしいので，あまり数が多いと途中で例外が投げられる．途中にsleep入れて回避．
　これだと例外が投げられた瞬間のユーザーも確実にフォローすることはできないけれど，まぁ，そこまでクリティカルなコードでもないし，いいか．

　自分で使うことはしないw

　ちょこっと変えれば，逆の方法にも使えるよね．
Emacsで選択範囲の文字を特定の用途へ置換する関数を作っておく



### 選択範囲をリストに指定した文字で置換します。

複数行を半角スペース一つあけて1行に連結
:small_blue_diamond:選択 -> M-x my-join-multi-lines

ブログ用にエスケープ
:small_blue_diamond:選択 -> M-x my-escape-region-for-blog-post

全角数字を半角数字に
:small_blue_diamond:選択 -> M-x my-convert-to-single-byte-number

半角数字を全角数字に
:small_blue_diamond:選択 -> M-x my-convert-to-multi-byte-number

句読点などの約物を半角に
:small_blue_diamond:選択 -> M-x my-convert-yakumono-to-half-width


```el
(defun my-replace-strings-in-region-by-list ($list)
  "Replace strings in a region according to $list"
  (if mark-active
      (let* (($beg (region-beginning))
             ($end (region-end))
             ($word (buffer-substring-no-properties $beg $end)))
        (mapc (lambda ($r)
                (setq $word (replace-regexp-in-string (car $r) (cdr $r) $word)))
              $list)
        (delete-region $beg $end)
        (insert $word))
    (error "Need to make region")))
;; 複数行を一行に
(defun my-join-multi-lines ()
  "Escape code in region for blog post"
  (interactive)
  (my-replace-strings-in-region-by-list
   '(("\n+" . " "))))
;; ブログ用にエスケープ
(defun my-escape-region-for-blog-post ()
  "Escape code in region for blog post"
  (interactive)
  (my-replace-strings-in-region-by-list
   '(("\&" . "&amp;")
     ("\<" . "&lt;")
     ("\>" . "&gt;")
     ;; ("\"" . "&quot;")
     ;; ("\'" . "&#039;")
     ("\t" . "	"))))
;; 全角数字を半角数字に
(defun my-convert-to-single-byte-number ()
  "Convert multi-byte number in region into single-byte number"
  (interactive)
  (my-replace-strings-in-region-by-list
   '(("１" . "1")
     ("２" . "2")
     ("３" . "3")
     ("４" . "4")
     ("５" . "5")
     ("６" . "6")
     ("７" . "7")
     ("８" . "8")
     ("９" . "9")
     ("０" . "0"))))
;; 半角数字を全角数字に
(defun my-convert-to-multi-byte-number ()
  "Convert multi-byte number in region into single-byte number"
  (interactive)
  (my-replace-strings-in-region-by-list
   '(("1" ."１")
     ("2" ."２")
     ("3" ."３")
     ("4" ."４")
     ("5" ."５")
     ("6" ."６")
     ("7" ."７")
     ("8" ."８")
     ("9" ."９")
     ("0" ."０"))))
;; 句読点などの約物を半角に
(defun my-convert-yakumono-to-half-width ()
  "Replace multi byte punctuation marks to half width chars"
  (interactive)
  (my-replace-strings-in-region-by-list
   '(("、" . "､")
     ("。" . "｡")
     ("「" . "｢")
     ("」" . "｣")
     ("［" . "[")
     ("］" . "]")
     ("｛" . "{")
     ("｝" . "}")
     ("（" . "(")
     ("）" . ")")
     ("・" . "･"))))
```

何か設定しておくと便利な置換がありましたらコメント欄で教えて下さい。
Google開発者サービスが電力をバカ食いする問題のおそらく検証不十分な対策

Google開発者サービスが電力をバカ食いすることがあるのだが、これは位置情報取得に関係がある。なのでまずはGoogleの位置情報トレースをOFFにする。しかしこれだけでは症状は改善しない。

次に、Googleアプリ向けの位置情報サービスをOFFにする。JBだと設定の電池のGoogle開発者サービスをタップしたページにその設定ページヘのボタンがある(かもしれない)。コレをOFFにすると表題の問題は解決しても通信回線による位置情報は取得できなくなるのだが、しばらくそのままにしてからONに戻しても電力消費はそのままだ。

もしかすると最初の「Googleの位置情報トレースをOFFにする」というのはやらなくてもいいかもしれない。もしそうならGoogle開発者サービスが無駄に位置情報を取得しに行くバグってことになる。誰か試してみておくれ。
herokuのDBにローカルのrailsアプリケーションからアクセス


herokuでcronみたいなのあるらしいですが、実行回数を細かく設定したり、実行時間が長いタスクの実行したいしjenkins氏で定期実行してログの保存したかったので

手元のRailsアプリケーションからherokuのDBにアクセスする方法


    vi config/database.yml

```ruby:config/database.yml
<%

require 'cgi'
require 'uri'

begin
  uri = URI.parse(ENV["DATABASE_URL"])
rescue URI::InvalidURIError
  raise "Invalid DATABASE_URL"
end

raise "No RACK_ENV or RAILS_ENV found" unless ENV["RAILS_ENV"] || ENV["RACK_ENV"]

def attribute(name, value, force_string = false)
  if value
    value_string =
      if force_string
        '"' + value + '"'
      else
        value
      end
    "#{name}: #{value_string}"
  else
    ""
  end
end

adapter = uri.scheme
adapter = "postgresql" if adapter == "postgres"

database = (uri.path || "").split("/")[1]

username = uri.user
password = uri.password

host = uri.host
port = uri.port

params = CGI.parse(uri.query || "")

%>

<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
  <%= attribute "adapter",  adapter %>
  <%= attribute "database", database %>
  <%= attribute "username", username %>
  <%= attribute "password", password, true %>
  <%= attribute "host",     host %>
  <%= attribute "port",     port %>

<% params.each do |key, value| %>
  <%= key %>: <%= value.first %>
<% end %>
```

herokuにデプロイしたrailsアプリケーションの記述そのままです。
確認方法。

    heroku run cat config/database.yml


データベースにアクセスしたいアプリケーションのENVの記述を確認します

    $ heroku config
    ~~~~~
    DATABASE_URL:               postgres://hugehuge:varvar@ec2-00-000-00-000.compute-1.amazonaws.com:5432/fogefoge
    ~~~~~
    $ heroku run 'echo $RAILS_ENV'
    ~~~~~
    production
    ~~~~~
    $ heroku run 'echo $RACK_ENV'
    ~~~~~
    production
    ~~~~~

ENV指定してタスクの実行なりサーバー起動すれば完了です。


    DATABASE_URL=postgres://hugehuge:varvar@ec2-00-000-00-000.compute-1.amazonaws.com:5432/fogefoge RAILS_ENV=production RACK_ENV=production rails s
AppEngine/PythonでDjangoのImageFieldを使う

# AppEngine/PythonでDjangoのImageFieldを使う
画像のアップロード機能なんかをつけるとき、
Django付属のImageFieldを利用すると、
適切な画像かどうかを処理してくれるので便利なのですが、
AppEngineにはPILがないのでうまくいきません。
実際ImageFieldを使ってみると
```No module named Image```
のようなエラーが出て開発、本番ともに失敗してしまいます。

<small>
チラ裏：
　https://developers.google.com/appengine/docs/python/images/installingPIL
　最初このページを見てAppEngineでPILが使えると誤解してしまったため解決に時間がかかりました‥
　実際は、AppEngineではPILが使えず、代わりに画像用のAPIが公開されています。
　開発用のAppEngineサーバーではこのAPIをエミュレートするためにPILを入れてね、というのが正解です。

　PILのインストール方法とかをずっと疑ってました‥。
</small>

# ダミーPILの導入
DjangoのフレームワークはAppEngine純正のを使うと弄ることができないので、
自分で処理書かなくてはならないのかと思ったのですが、
ググってたら解決策が見つかりました。

[Image uploads working with models.ImageField on django-nonrel/appengine w/ django-fileuploads - ZONE – UYSRC Developer Blog](http://blog.uysrc.com/2011/02/12/image-uploads-working-with-models-imagefield/)

Djangoが使っているPILの機能を、
AppEngineのAPIでラップしたダミーを作るという解決策です。
これならDjangoのコアをいじらずにImageFieldが利用できます。

## 使い方
[PIL/__init__.py](
https://bitbucket.org/uysrc/upload-sample/src/25381b83be73edaab27ff5896ce4f6ae455c2345/PIL/__init__.py?at=default)
上にソースがあります。
AppEngineのアプリケーションのルートにPILというフォルダを作成し、
そこに上記の__init__.pyを作成すれば準備完了です。
あとは通常のDjangoと同じようにImageFieldが利用できます。
[Grails]GORMの簡単な使い方

# 注意：メモ段階
色々なパターンが想定されるので、基本的なパターンを都度追記していく予定。

# 前提条件
- デフォルトだとGrailsが生成するでversionカラムは利用しない。
- テーブルはdbCreateモードでGrailsが自動生成する物を利用する（しない場合は都度説明する）

#多対1
例えば、会社テーブルと社員テーブルがあって、一つの会社には複数の社員が働いている場合。
ソースは以下の２つ。

```groovy:Company.groovy
class Company {
    // 会社テーブルに該当するCompanyドメイン
    String name
    static constraints = {
    }
    static mapping = {
        version false
    }
}
```

```groovy:Employee.groovy
class Employee {
    // 社員テーブルに該当するEmployeeドメイン
    String name
    Company company
    static constraints = {
    }
    static mapping = {
        version false
    }
}
```

EmployeeドメインがCompanyドメインをプロパティに持っている。

よっしゃ早速試してみようぜ！の前に、Grailsを起動する時にテストデータを登録したいから、Bootstrap.grooyを以下の様に編集する。

```groovy:Bootstrap.groovy
class BootStrap {

    def init = { servletContext ->
        Environment.executeForCurrentEnvironment {
            development {
                def cmp1 = new Company(name:"BIG-Company").save(flush:true)
                def cmp2 = new Company(name:"SMALL-Company").save(flush:true)

                new Employee(name:"Mr.A", company: cmp1).save(flush:true)
                new Employee(name:"Mr.B", company: cmp1).save(flush:true)
                new Employee(name:"Mr.C", company: cmp1).save(flush:true)
                new Employee(name:"Taro", company: cmp2).save(flush:true)
            }
            test {
                println "test!"
            }
            production{
                println "production!"
            }
        }
    }
    def destroy = {
    }
}
```

コレで準備完了！
Grailsを起動すると、以下のテーブルが生成される。

![スクリーンショット 2014-02-02 2.43.16.png](https://qiita-image-store.s3.amazonaws.com/0/11059/7127690a-424f-f208-4bdf-7b3c515ed0d3.png)

Employeeテーブル（Employeeドメイン）にCompanyテーブルのIDが持たれている。
いい感じに普通のテーブル構成。
じゃあ実際どうやってGrailsで値を取得すれば良いの？というサンプルは以下。

```groovy:OneToMany
package bindingtest

class ManyToOneSampleController {

    def index() {

        // ドメインクラスにfindByNameなんてメソッドは定義してないぞ！？
        // これがGORMの必殺技、ダイナミックファインダー！！
        Company company = Company.findByName("BIG-Company")

        // Employeeでも必殺ダイナミックファインダー！
        // ちなみに複数のレコードを返す可能性がある場合は、findAllを使う。
        // 全部のレコード取得するぜ、ちなみにCompanyプロパティにcompanyを持っている人ね。
        List employees = Employee.findAllByCompany(company)

        def text = employees.collect{it.name}.join(" & ")

        // 取得されるレコードは当然BIG-Companyに所属する３人
        // Taro さんはSMALL-Company所属なので取得されない
        assert 3 == employees.size()
        assert 'Mr.A & Mr.B & Mr.C' == text

        // さて、取得された社員達ですが、彼らはプロパティにCompanyを持っています。
        // と言う事は、ドメインのプロパティを使って別のドメインにアクセス出来るのです！
        // ちなみにhead()は、リストの先頭要素を返すメソッド。
        assert "BIG-Company" == employees.head().company.name

        render text
    }
}
```

テストなのでとりあえずコントローラにべた書き。
assertを入れてるからその通りだけど、このコントローラにアクセスすると、 **Mr.A & Mr.B & Mr.C** と表示される。
CentOS6にwordpress3.8.1をインストールする


##概要

最新版のWordpressを突っ込んでみようと思い。

##準備

Wordpressの起動に必要となるパッケージをインストール。
(適当に必要なものを入れてください。自分の場合下記)

```
$ sudo yum install php
$ sudo yum install mysql-server

$ sudo yum install php-mysql
$ sudo yum install php-mbstring
```
apacheは2.x系、あとリバースプロキシにnginxを使用しています。


##最新のWordpressをダウンロード

ダウンロード▶︎解凍▶︎設定ファイル修正

```
$ cd
$ sudo wget http://ja.wordpress.org/wordpress-3.8.1-ja.zip
$ sudo unzip wordpress-3.8.1-ja.zip

$ cd wordpress
$ sudo cp -p wp-config-sample.php wp-config.php

$ sudo vim wp-config.php

// このへんを修正。お好きな名前で。
$ diff wp-config-sample.php wp-config.php
24c24
< define('DB_NAME', 'database_name_here');
---
> define('DB_NAME', ‘wordpress’);
27c27
< define('DB_USER', 'username_here');
---
> define('DB_USER', ‘XXXXXX’);
30c30
< define('DB_PASSWORD', 'password_here');
---
> define('DB_PASSWORD', ‘YYYYYYY’);

$ cd
$ sudo cp -pr wordpress /var/www/
```

##MySQL設定

###起動

```
$ sudo /etc/init.d/mysqld start
・・・
                                                           [  OK  ]
mysqld を起動中:                                           [  OK  ]
```
###初期設定

```
$ sudo /usr/bin/mysql_secure_installation
```

パスワード設定後、特に無ければ、全部Yで良い。

###MySQLの設定
###MySQLにrootでログイン
```
$ mysql -u root -p
```

###database作成
設定ファイルに記述したデータベース名で。

```mysql
mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on wordpress.* to XXXXX@localhost identified by ‘YYYYYYYY’;

mysql> exit;
Bye
```

作成したユーザ、パスワードでMySQLにログインできればOK

```
$ mysql -u XXXXXX -pYYYYYY
```

##Apacheの設定

```
$ sudo vim /etc/httpd/conf.d/wordpress.conf 
$ sudo cat /etc/httpd/conf.d/wordpress.conf
Alias /wordpress /var/www/wordpress

$ sudo service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]
```

##表示確認

http://[domain]/wordpress
をブラウザで開く
![スクリーンショット 2014-02-02 10.47.52.png](https://qiita-image-store.s3.amazonaws.com/0/30307/8ea56eca-a505-ca1f-1268-fcb00da60a87.png "スクリーンショット 2014-02-02 10.47.52.png")

キターーーーーーーーーーー!!!!

ちなみに自分の場合nginxをリバースプロキシに設定しており、最初Forbiddenで弾かれてましたが、
nginxのconfファイルにエントリポイントを追加したら動きました。

```/etc/nginx/conf.d/reverse_proxy.conf
server {
    listen 80;

    server_name  hoge.com;

    proxy_redirect                          off;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;


    location / {
            proxy_pass http://127.0.0.1:8080;
    }

    location /wordpress/index.php {
            proxy_pass http://localhost/wordpress:8080;
    }
}
```