OmniAICreator/Qiita-1.07M huggingface dataset:
RiakCSローカル環境を構築

オブジェクトストレージ開発するためにローカルのRiak CS環境が欲しいので、ネットで探してみたら、`https://github.com/basho-labs/vagrant-riak-cs-cluster`レポジトリがありました。そのまま使うとRiakのバージョンは1.4.8、RiakCSのバージョンは1.5.4になっています。しかし自分が使いたいのはRiak 1.4.12とRiakCS 1.5.4です。なので幾つのファイルを修正する必要があります。

まずBerksfileを修正

```
$ cat Berksfile
source "https://supermarket.chef.io"

cookbook "ntp"
cookbook "nmap"
cookbook "htop"
cookbook "openssh"

cookbook 'riak', '= 2.4.21'
cookbook 'riak-cs', '~> 2.2.11'
cookbook "riak-cs-create-admin-user", github: "hectcastro/chef-riak-cs-create-admin-user", ref: "0.3.1"
```

riakの[cookbook 2.4.21](https://supermarket.chef.io/cookbooks/riak/versions/2.4.21)はRiak 1.4.12バージョン使っていて、
riak-csの[cookbook 2.2.11]()はRiak-CS 1.5.4バージョンを使っています。



そしてrols/riak.rbファイルは下のように変更


```
name "riak"
description "Role for Riak Enterprise nodes."
run_list(
  "recipe[riak-cs::package]",
  "recipe[riak]"
)
default_attributes(
  "riak" => {
    "cs_version" => "1.4.5",
    "args" => {
      "+zdbbl" => 96000,
      "-env" => {
        "ERL_MAX_PORTS" => 16384
      }
    },
    "config" => {
      "riak_api" => {
        "pb_backlog" => 128
      },
      "riak_core" => {
        "default_bucket_props" => [["__tuple", "allow_mult", true]]
      },
      "riak_kv" => {
        "storage_backend" => "riak_cs_kv_multi_backend"
      }
    }
  }
)
```

`cs_version`は`1.4.5`に変更します。



ファイル変更したらREADME.mdファイルの手順どおりやれば上手くいくはずです


```
$ vagrant plugin install vagrant-berkshelf
$ vagrant plugin install vagrant-omnibus
$ vagrant plugin install vagrant-cachier (Use RIAK_CS_USE_CACHE to enable)
$ RIAK_CS_USE_CACHE=1 RIAK_CS_CREATE_ADMIN_USER=1 vagrant up
```
Atomエディタで本文１行目をタブに表示する方法

StackOverflowで「 [Atomエディタで本文１行目をタブに表示したい](https://ja.stackoverflow.com/questions/12782/atom%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%81%A7%E6%9C%AC%E6%96%87%EF%BC%91%E8%A1%8C%E7%9B%AE%E3%82%92%E3%82%BF%E3%83%96%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%9F%E3%81%84) 」なる質問を見かけたので勉強がてらに作ってみた。

パッケージなどにはしていないので `init.coffee` に書くだけのお手軽仕様。

```coffeescript:init.coffee
atom.workspace.observeTextEditors (editor) ->
  editor.onDidStopChanging =>
    elm = document.querySelector(".tab.sortable.active > .title")
    elm.innerHTML = editor.getText().split("\n")[0]

setTimeout ->
  items = []
  
  atom.workspace.getPanes().map (panel) ->
    panel.items.map (item) ->
      items.push item.buffer

  tabs = document.querySelectorAll(".tab.sortable > .title")
  for tab, i in tabs
    tab.innerHTML = items[i].cachedText.split("\n")[0] if items[i]
, 100
```

これで起動させた状態のタブ全部を書き換えてアクティブなタブも変更の度に書き換えるようには出来たものの、起動後に分割したPaneではなぜか書き換わらない。分割したイベントを拾って再登録してやらなきゃいけないのかな？

まあ、とりあえずこのくらいでもなんとかなるだろう。
CakePHP3のbake自動生成のテンプレをいじる


一応bootstrapに合わせる想定で。

最初にformhelperの挙動を変える。

`src/View/AppView.php` の initialize のところに以下を追加する。


```php:src/View/AppView.php
    public function initialize()
	{
		$this->loadHelper('Form', [
			'templates' => 'app_form',
		]);
	}

```


で、config 直下に自分で app_form.php というファイルを作る。


```php:config/app_form.php
<?php
return [
    'inputContainer' => '<div class="form-control">{{content}}</div>',
	'label' => '<label{{attrs}} class="control-label">{{text}}</label>',
	'input' => '<input type="{{type}}" name="{{name}}"{{attrs}} class="form-control">'
];
```

自分がいじりたい部分だけ、配列に書いて、修正を入れる。
オリジナルは


```
vendor/cakephp/cakephp/src/View/Helper/FormHelper.php
```

にだーっと書いてある。


で、次に自分でpluginを作る。（ここでは適当にsummerという名前を付けた。）

bakeコマンドで


```bash
bin/cake bake plugin summer
```


`plugins/Summer` ディレクトリ以下に、いくつかファイルが作られる。
さらにその中に自分で、

```
plugins/Summer/src/Template/Bake/Template/
```

というディレクトリを作って、

```
add.ctp
edit.ctp
index.ctp
view.ctp
```

をオリジナルからコピーしてくる。オリジナルは、

```
vendor/cakephp/bake/src/Template/Bake/Template/add.ctp
```

とかにある。
コピーした方をいじる。

あとはbake する時に、

```bash
bin/cake bake template Users -t Summer
```

とすればよい。
Ableton Live等で使えるスイッチコントローラ

スイッチを押すと、あらかじめ決められたCCをMIDI出力するものです。
scene launch,stop clips,scene up,scene down 等にアサインして使います。
前にも作ったんだけど、数が必要になったのでまた作ってみました。

あ、Duemilanoveでやるので、USB MIDI出力は今回は考えません。

```C:sw5_to_MIDI.ino
//5 MIDI CC switches. 

//The circuit:
// * switch(momentary) 1-5 connected to digital-in 3-7 and ground.
// * digital in 1 connected to MIDI jack pin 5
// * MIDI jack pin 2 connected to ground
// * MIDI jack pin 4 connected to +5V through 220-ohm resistor
// Attach a MIDI cable to the jack.

#include <Bounce2.h>
//
const int pushed = 0;  //for push-on switches.
//const int pushed = 1; //Otherwise,use this for push -off switches.
enum { nd = 5 };  //number of digital switches.
const int msg = 176;  //controll change. note-on:144 
const long debTime = 5;  //debounce time. Increase if the output flickers.

const int ledPin = 13;

Bounce debouncer[nd] ;  //make Bounce object's array(but not yet instantiate each element here).
const int val1[nd] = {70,71,72,73,74};  //controll No or note No
int val2[nd];  //controll value or velocity

void setup()
{
  const int inPin[nd] = {3,4,5,6,7};  //input pins for switches.
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,LOW);
  for(int i=0 ; i < nd ; i++ )
  {
    debouncer[i] = Bounce();  //Instantiates a Bounce object.
    pinMode(inPin[i] , INPUT_PULLUP);
    debouncer[i].attach(inPin[i]);  // Set pin the instance uses.
    debouncer[i].interval(debTime);  //Set debounce time.
    debouncer[i].update();
    val2[i] = isPushed( debouncer[i].read() );
  } 
  Serial.begin(31250);
}

void loop()
{
  int reading;
  for(int i = 0; i < nd; i++)
  {
    debouncer[i].update();
    reading = isPushed( debouncer[i].read() );    
    if(reading != val2[i])
    {
      val2[i] = reading;
      MIDI_TX(msg, val1[i], val2[i]);
      digitalWrite( ledPin, val2[i] / 127 );
    }
  }
}

int isPushed(int p)
{
  return p == pushed ? 127 : 0;
}

void MIDI_TX(int MESSAGE, int VAL1, int VAL2) 
{
  Serial.write(MESSAGE);
  Serial.write(VAL1);
  Serial.write(VAL2);
}

```

#Bounce2使ってみた
スイッチのチャッタリング防止に、以前に作ったときは自前でdebounceを仕込んだのですが、今回Bounce2を使ってみました。Bounceオブジェクトというのが当初ピンとこなくてスルーしていたんですが、ピン番号と時間をセットしたらデバウンスした値を都合良く返してくれる、なんかそういう もの だと思ったら、使えそうな気がしてきました。 

```C:
#include <Bounce2.h> //ライブラリを読み込む
...
Bounce debouncer = Bounce();	//Bounceオブジェクトのインスタンスを作る
pinMode(pin_number,INPUT_PULLUP);	//使用したいArduinoのピンを入力に設定
debouncer.attach(pin_number);  // Bounceオブジェクトのインスタンスに、使用するピンをセット
debouncer.interval(debTime);  //デバウンスする時間をセット
...
debouncer.update();	//値を読む直前にBounceオブジェクトのインスタンスをアップデートする
swVal = debouncer.read;	//Bounceオブジェクトのインスタンスの値を読み、変数に代入
```

#変数とかをforループで宣言するのアリ?
`Bounce debouncer[5] = {Bounce(),Bounce(),Bounce(),Bounce(),Bounce()}`とか書くのが嫌だっただけですが。
ばらしてforループでまわしてみたらうまくいったようです。
#定数の宣言?
そんなに凄いことはしないので`#define`でいいんでしょうが。
いろんな意見があるので自分の方針。

+ なるべく`const`を使う
+ int型で、後で配列の宣言や`switch`文で使用するものは、`enum`を使う

でどうでしょう?
SVGのViewBoxがよく分からないアナタとワタシへ

SVGのViewBoxって何だか分かりにくくないですか？

・・・

やっぱりそうですよね。私も色々な解説ページを見ても、結局よく分かりませんでした。
そこで、値と動作をリアルタイムで簡単に確認できるページがあれば、感覚的に理解できるのではないかと思い、作成してみました。ViewBox理解の補助になれば幸いです。

**SVG ViewBoxの動作確認**
http://nekoneko-wanwan.github.io/demo/svg/viewbox/

# 以下、個人的なポイント

- 実際のサイズをviewPortと呼び、viewBoxはviewPortにおける位置を指す
- viewBox =(x, y, width, height)のx,yは左上の座標を、width,heightは右下の座標を決める
- viewPortのwidth, heightとviewBoxのwidth, heightがずれると見た目上のサイズが変わる可能性がある
- 逆に言えば、viewBox=("0 0 width height")のように合わせておけば、1対1が保たれ分かりやすい

# 動作イメージ
![viewbox.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/a1e1bc4c-953c-ed57-7e69-660b3e409baf.gif)
Macでリモートサーバのディレクトリをローカルにマウントした

今まで開発をする際にリモートサーバに環境を構築して触ってたんだけど、ローカル(Mac)で動くプラグインがリモート(linux)だと動かないという事態に遭遇し、めんどくさくなったのでマウントすることにした。

軽く調べたところ``sshfs``とかいうコマンドを使えば``ssh``経由でリモートのディレクトリをローカルにマウントしてくれるらしい。簡単そう！

# 下準備

とりあえずコマンドあるか調べる。

``` sh
$ which sshfs
sshfs not found
```

なかった。こういう時は[Homebrew](http://brew.sh/index_ja.html)にすべてを委ねればなんとかなる。

``` sh
$ brew install sshfs
Error: No available formula for sshfs
Searching formulae...
Searching taps...
homebrew/fuse/sshfs  Caskroom/cask/sshfs
```
と思ったけどなかった。でも[Caskroom](http://caskroom.io/)とかいうのにあるみたいだ！

``` sh
$ brew install caskroom/cask/brew-cask
$ brew install Caskroom/cask/sshfs
$ sshfs -V
SSHFS version 2.5 (OSXFUSE SSHFS 2.5.0)
OSXFUSE library version: FUSE 2.7.3 / OSXFUSE 2.8.0
no mount point
```

やったぜ

# マウントする
マウントは更に簡単であった。
まずマウント先のディレクトリを作る。

``` sh
$ mkdir mountpoint
```

マウントする。

``` sh
$ sshfs [user@]host:[dir] mountpoint
```

終わり。

マウントを解除するには

``` sh
$ umount mountpoint
```

とするみたい。

# やったぜ
TypescriptのEmacsでのプラグインを[tss](https://github.com/aki2o/emacs-tss)から[tide](https://github.com/ananthakumaran/tide)に乗り換えたんだけど、linuxのtsserverだとなんかJSONがぶっこわれててうまく動かない、原因究明もめんどくさかった（）のでもうローカルにマウントしてしまうことにした。

思ったより簡単で惚れた。
Ruby on Railsで githubなどにcommitしたくないパスワードなどを環境変数に設定してcapistranoでdeployする方法

## やりたい事
* パスワードとかSECRET_KEY_BASEとか、環境変数に設定するのがオススメの方法なのでそれに従う。
* ローカルサーバーであれば、ログインしているシェルで環境変数を設定しておけば良いが、capistranoでdeployする場合でも環境変数にうまく設定しておきたい。

## もうちょっと追加要件
* sshでサーバーにログインした場合でも、環境変数が設定されていてほしい。アプリケーション側で問題が発生した時にサーバー上でrailsの再起動などの作業を行う可能性があるので。
* 将来的にrails以外のアプリケーションも動くかもしれないので、gemに依存した作りにしたくない。

## 実装
### ①環境変数を記載したymlファイルをサーバー上に配置する
配置はchefやansibleなどの構成管理ツールでやると良い。ファイルのパーミッションはアプリケーションユーザーに対して読み取り権限だけにしておく事

```
$ cat /path/to/secret/yml/env.yml
DB_PASSWORD: your_password
SECRET_KEY_BASE: ramdomstrings
```

### ②sshログイン時のシェルで環境変数を読み込ませる
/etc/profile.d/以下に専用のscriptを書いておく。これでシェルログイン時に環境変数がセットされる。
中身は、ymlを読んでexportするだけ。

```
$ cat /etc/profile.d/env_vars.sh
secret_file='/path/to/secret/yml/env.yml'

IFS_SAVE=$IFS
IFS=$'\n'

for line in `cat ${secret_file}`
do
  key=`echo $line | sed -e "s/^\([^ ]*\): \([^ ]*\)$/\1/"`
  value=`echo $line | sed -e "s/^\([^ ]*\): \([^ ]*\)$/\2/"`
  export $key=$value
done

IFS=$IFS_SAVE
```

### ③capistrano-rbenvを利用してdeploy時にも環境変数を反映させる
capistranoはSSHKitを利用して、ssh経由でコマンドを実行するので/etc/profile.d/以下のscriptは読んでくれない。そこで、capistrano-rbenvというgemのrbenv_prefixを利用する。

https://github.com/capistrano/rbenv

rbenv/lib/capistrano/tasks/rbenv.rakeを一部抜粋。7行目で全てのコマンドの前に、rbenv_prefixが設置されている事が分かる。

```
task :map_bins do
  SSHKit.config.default_env.merge!({ rbenv_root: fetch(:rbenv_path), rbenv_version: fetch(:rbenv_ruby) })
    rbenv_prefix = fetch(:rbenv_prefix, proc { "#{fetch(:rbenv_path)}/bin/rbenv exec" })
    SSHKit.config.command_map[:rbenv] = "#{fetch(:rbenv_path)}/bin/rbenv"

    fetch(:rbenv_map_bins).each do |command|
      SSHKit.config.command_map.prefix[command.to_sym].unshift(rbenv_prefix)
    end
  end
end
```

という事で、rbenv_prefixで、/etc/profile.d/env_vars.shを読ませる事にする。

capistranoのconfigファイル内で以下を設定。

```
set :stage, :staging
set :rbenv_prefix, "source /etc/profile.d/env_vars.sh && RAILS_ENV=#{fetch(:stage)} ~/.rbenv/bin/rbenv exec"
```

stageは設定しないと正しく動かなかったので設置。

## おわり
以上でめでたくcapistaranoで環境変数を設定しつつdeployする事が出来ました。

あまりrails wayを把握してないのでもっといい方法があるよ！って方がいましたらコメントなど頂けると嬉しいです！
[作成途中]Nexus9でRemixOSを動かす その3

# Apps alowed to run in background

QuickSettingsのバッテリーアイコンClickで、Power Managerが起動する。PowerManagerではバックグラウンド実行を許可するアプリを設定できる。というか、ここで設定したアプリのみ、Boot completedなIntentがBroadcastされる模様。
![Screenshot_2015-08-25-08-08-16.png](https://qiita-image-store.s3.amazonaws.com/0/78540/e4a02dcb-b76c-756f-c379-a1cfaf07d906.png)
![Screenshot_2015-08-25-08-08-32.png](https://qiita-image-store.s3.amazonaws.com/0/78540/b769cd62-c678-fd26-ddf6-cf6b722b9b41.png)
![Screenshot_2015-08-25-08-10-04.png](https://qiita-image-store.s3.amazonaws.com/0/78540/075ffea3-bd49-ca7b-4b09-4663f388db1f.png)

# Portraitモードにならない
何を実行した時からか不明だが、縦画面に切り替わらなくなった。再起動しても、最高のローテーション制御でも縦画面にならない。仕方がないのでTWRPのバックアップから戻した。
「client and server don't have same version (client : 1.19, server: 1.18) 」って怒られたら

Amazon Linux 2015.03でdockerとdocker-composeをインストールして、docker-compose buildとすると、以下の様なエラーが発生した。

```
$ docker-compose build

datastore uses an image, skipping
redis uses an image, skipping
mysql uses an image, skipping
Building rails...
client and server don't have same version (client : 1.19, server: 1.18)
```

dockerのバージョン

```
$ docker version

Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.3.3
Git commit (client): 7c8fca2/1.6.2
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.3.3
Git commit (server): 7c8fca2/1.6.2
OS/Arch (server): linux/amd64
```

docker-composeのバージョン

```
docker-compose version
docker-compose version: 1.4.0
docker-py version: 1.3.1
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1k-fips 8 Jan 2015
```

## 原因
docker-compose 1.4.0からは、docker 1.7を必要としているが、`yum install docker`でインストールされるdockerのバージョンが`1.6.2`なのが問題のらしい。
https://github.com/docker/compose/issues/1895

上記のリンクで書かれているように、環境変数の`COMPOSE_API_VERSION`にバージョンを指定すれば解決する。

```
export COMPOSE_API_VERSION=1.18
```
npm debugのブラウザでの使い方

# 何故npm debugなのか

- `window.console.log`はブラウザでしか動作せず、サーバサイドで資産を再利用しにくい
- プロダクションでログを出さない時に空の関数を代入とか泥臭い方法が必要
- 一部のログを非表示にしたりできない
- 謎にカラフル
- IE


# 導入

https://www.npmjs.com/package/debug

```shell-session
npm i -s debug
```


# コードでの利用方法

```js
window.myDebug= require("debug"); // ログのON/OFFの設定に使用(なくても良い)
var fooLog = require("debug")("foo"); // 名前にfooを指定
var piyoLog = require("debug")("bar:piyo"); // 名前にbar名前空間のpiyoを指定

fooLog("test log!"); // 'foo test log! +0ms'と表示
piyoLog("test piyo!"); // 'bar:piyo test piyo! +0ms'と表示
```


# 表示/非表示　設定方法

このままではログは表示されていないと思います。表示するための設定を行います。

### 先ほど定義したmyDebugを使用

```js
myDebug.enable("*"); // すべて表示
```

### localStorageを直接触る

上の例では、windowに`debug`を代入しておきenableを叩きましたが、面倒なので直接設定するほうがらくだと思います。

```js
localStorage.debug = "*"; // すべて表示
localStorage.debug = "*,-foo"; // fooのみ非表示
localStorage.debug = "*,-piyo:*"; // piyo名前空間のみ非表示
localStorage.debug = ""; // すべて非表示
```


# Tips. socket-ioなどのログが鬱陶しい時

これが、console.logでは受けれない大きな恩恵だと思います。関連名前空間などをすべて除外できます。

```js
localStorage.debug = "*,-engine.io-client:*,-socket.io-client:*,-socket.io-client,-socket.io-parser"
```

もちろんコードでこの設定を行うこともできます。その際は、`require("debug").enable("")`などを叩いてください。

---

console.logよりは面倒かもしれないですが、積極的に使って欲しいです。 :tada:
Haskellで標準入力から読み込んだデータを処理して標準出力に出力する。


# Haskellでワンライナーを書く為の覚え書き

変換処理を無名関数にして`f`の部分に挿入する。

```hs
main=interact$unlines.map.(f).lines
f::String->String
f s=変換処理

main=interact$unlines.map(show.(f)).lines
f::String->Int
f s=変換処理

main=interact$unlines.map(show.(f).read).lines
f::Int->Int
f n=変換処理
```
GroovyでJSONを簡単に処理する

# 概要
WEB APIで条件をGET・POSTしたらJSONでリストが返ってくることって多いですよね。
そういう時に便利なのがGroovy
わずか数行で簡単に処理できます。

# 例
Doorkeeperで現時刻から24時間以内に開催されるイベントを検索してみます。
コードは次のようになります。

```groovy
@Grab('org.codehaus.groovy.modules.http-builder:http-builder')
import groovyx.net.http.HTTPBuilder
import java.time.*

def http = new HTTPBuilder('http://api.doorkeeper.jp')

def since = OffsetDateTime.now()  //時差情報付き現在時刻(ISO8601)
def until = since.plusDays(1)

http.get(path:'/events', query:[since:since., until:until, locale:'ja']){
   res, json -> json.each{ println it.event.title }
   }
return
```

まずHTTP通信を簡単に行うためにHTTPBuilderを使用します。
Grapeで引っ張ってきてimportします。
検索する期間の文字列を生成するのですが、ISO8601形式なので簡単に処理するためにJava8のDate and Time APIを使いたいのでjava.time.*もimportします。

HTTPBuilderでGETするためにはgetメソッドを実行すればいいです。
第一引数はアクセス先をMapで指定します。第二引数はパラメータをMapで指定します。
レスポンスを処理するためのクロージャを書くことで受け取ったJSONを処理できます。
クロージャの第二引数がJSONオブジェクトでHTTPBuilderが良きに計らってくれているのでその後は楽です。
今回は各イベントのタイトルだけを抽出して表示させてみました。GroovyだとGetterやMapのKeyをフィールドのように扱えるので直感的でわかりやすいですよね。
このような感じで手軽にJSONを扱うことができます。

処理本体をワンライナーで書くと

```groovy
@Grab('org.codehaus.groovy.modules.http-builder:http-builder')
import groovyx.net.http.HTTPBuilder
import java.time.*

new HTTPBuilder('http://api.doorkeeper.jp').get(path:'/events', query:[since:OffsetDateTime.now(), until:OffsetDateTime.now().plusDays(1), locale:'ja']){res,json -> json.each{ println it.event.title }}
```

こんなかんじになります。
何かおかしな点などありましたらご指摘お願いします。

# 参考
[GroovyのHTTPBuilderを試す](http://d.hatena.ne.jp/Kazuhira/20140119/1390144183)
CakePHP3でPDFファイルを出力する

CakePHP3でTCPDFを使ってPDFファイルを作成しダウンロードさせます。

composer.jsonのrequireにTCPDFを追加して`composer update`する。

```json:composer.json
{
    "require": {
        "tecnick.com/tcpdf": "*"
    }
}
```

ControllerにMIMEタイプとかファイル名とかのresponseを記述する。
(以下、領収書を出力するような例です。)

```php:PaymentsController.php
public function receipt($id = null)
{
    $payment = $this->Payments->get($id);
    $this->set(compact('payment'));
    ・・・
    $this->response->type('pdf');
    $this->response->charset('UTF-8');
    $this->response->download('receipt.pdf');
    $this->layout = false;
}
```

テンプレートにて、HTMLで書いた内容を`writeHTML()`でPDF化して`echo`する。
(TCPDFの設定等についてはTCPDFのドキュメント等を見てください。)

```php:Payments/receipt.ctp
<?php
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8');
$pdf->SetFont('kozgopromedium');
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->AddPage();

$html = <<< EOF
<html>
<head>
    <style type="text/css">
    h1 {
        text-align: center;
    }
    </style>
</head>
<body>
<h1>領収書</h1>
<table>
・・・
</table>
</body>
</html>
EOF;

$pdf->writeHTML($html, false);
echo $pdf->Output('', 'S');
?>
```

Controllerで`$this->response->download('receipt.pdf')`を書かずに、テンプレートで`$pdf->Output('receipt.pdf', 'D')`としてもできますが、Testがうまくいかなくなるので、Sでechoすることにしました。
プロセス監視のためのmonitを設定してみる


## はじめに

自動復旧の監視ツールを探していて、monitの名前がでてきたので設定をメモ

## 手順

* モジュールのインスト


```
yum install -y monit
```

* configの設定

```	/etc/monit.conf
# 監視の実行タイミングを設定
set daemon 60
set logfile /var/log/monit.log

# 以下のファイルに監視対象のプロセスを記述していく
include /etc/monit.d/*
```

* monitの起動

```
$ sudo /etc/init.d/monit start
```

* Nginxを監視する

```/etc/monit.d/nginx.conf
check process nginx with pidfile /var/run/nginx.pid
  start program = "/etc/init.d/nginx start" with timeout 60 seconds
  stop program  = "/etc/init.d/nginx stop"
  if failed port 80 protocol http
    then restart
  group nginx
```

* 止めてみる

```
$ sudo /etc/init.d/nginx stop
```

* 自動復旧されていることを確認

```
$ sudo tail -f /var/log/monit
[UTC Aug 25 08:02:39] info     : monit: generated unique Monit id c03c45bb368fcf0f98753f10facc3692 and stored to '/root/.monit.id'
[UTC Aug 25 08:02:39] info     : 'system_ip-10-0-131-120' Monit started
[UTC Aug 25 08:04:39] error    : 'nginx' process is not running
[UTC Aug 25 08:04:39] info     : 'nginx' trying to restart
[UTC Aug 25 08:04:39] info     : 'nginx' start: /etc/init.d/nginx
```

## 参考

MonitでSSH,Nginx,MySQLのサービス死活監視を行うChef Cookbook
http://easyramble.com/chef-monit-ssh-nginx-mysql.html
MATLAB 基礎Tips

#0から１までを11個に分ける

```matlab
linspace(0,1,11)
```

#コロンで範囲指定

```matlab
a(1:2,1:2)
```

１,２行1,２列を表示

コロンだけを使うと全範囲

```matlab
a(:,1)
```

1列目を全てを表示

#グラフの色を変える

```matlab

plot(x,y,'r');
```

第３引数に色を指定。この場合は赤色(red)。

#グリッド

```matlab

grid
```

figure画面にグリッドを引く

#ラベル
```matlab

xlabel(' t[s]');
```

xlabel,ylabelでx軸,y軸にラベルを追加

#凡例

```matlab

legend('t[s]');
```


凡例を追加。
PhantomJSでSSL関連のエラーがでた時の対処

# 問題の調査

```
phantomjs --debug=yes test.js
```

```
2015-08-25T16:47:30 [DEBUG] Network - SSL Error: "The issuer certificate of a locally looked up certificate could not be found"
2015-08-25T16:47:30 [DEBUG] Network - SSL Error: "The root CA certificate is not trusted for this purpose"
```

# SSLエラー無効

```
phantomjs --web-security=no --ignore-ssl-errors=yes test.js
````
[Ruby] ChromeをSeleniumで動かす方法

以下のRubyコードを実行しても

```rb
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
```

以下の様なエラーが出る場合

```
Selenium::WebDriver::Error::WebDriverError: Unable to find the chromedriver executable. Please download the server from http://chromedriver.storage.googleapis.com/index.html and place it somewhere on your PATH. More info at https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver.
from /Users/Jimmy/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/chrome/service.rb:37:in `executable_path'
```

##1. 以下のリンクで環境にあったchromedriverをダウンロードする
http://chromedriver.storage.googleapis.com/index.html?path=2.18/

##2. 解凍したchromedriverをwhich rubyした時のパスと同じ階層にいれる
以下の場合は

```sh
$ which ruby
/Users/nwtgck/.rvm/rubies/ruby-2.2.1/bin/ruby
```

以下のコマンドでOK

```sh
$ mv chromedriver /Users/nwtgck/.rvm/rubies/ruby-2.2.1/bin
```


## 起動
```rb
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
```

![スクリーンショット 2015-08-25 午後4.44.21.png](https://qiita-image-store.s3.amazonaws.com/0/84451/dd372037-bcb4-d735-4044-b37ce6f896e7.png)
ESXのカウンタ値取得

[前](http://qiita.com/_norin_/items/3ceed8e8b70584a10e52)の続き

ESXのカウンタ値（CPU/MEM/Disk/Net/etc）は直接のオブジェクトは無く、PerformanceManagerオブジェクト経由で取得する。


#カウンタ種別

取得出来るカウンタの一覧は以下のコードで見ることが出来る。

```
require 'rbvmomi'

vim = RbVmomi::VIM.connect(:host=>"host", :user=>"root", :password=>"password", :insecure=>true)
host = vim.root.childEntity[0].hostFolder.childEntity[0].host
vim.serviceContent.perfManager.retrieve_stats(host,[""])
```

それぞれの意味は[ドキュメント](https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/vim.PerformanceManager.html)に載っている。
真っ当に取得するのであればPerfCounterInfoオブジェクトが保持しているのでこちらを参照のこと。


ここではCPUとメモリを取得してみる。



# カウンタ取得

PerformanceManagerオブジェクトのメソッドを直接使うのは手間が多いせいか、rbvmomiではより簡便なメソッド（perfManager.retreive_stats)）を用意しているのでこちらを利用する。


```
metrics = ["cpu.usage"]

vim = RbVmomi::VIM.connect(:host=>"host", :user=>"root", :password=>"password", :insecure=>true)
host = vim.root.childEntity[0].hostFolder.childEntity[0].host
counters = vim.serviceContent.perfManager.retrieve_stats(host, metrics)
```

__配列__でカウンタ種別を指定、戻り値はHashが返ってくる。
中身の例

```
pp counters[host[0]]
{:sampleInfo=>
  [PerfSampleInfo(
     dynamicProperty: [],
     interval: 20,
     timestamp: 2015-01-01 06:00:40 UTC
   )],
 :metrics=>{"cpu.usage"=>[815]}}
```


実際の値は
```
counters[host[0]][:metrics]["cpu.usage"][0]
```
で得られる



# Multi metrics
CPUとメモリをまとめて取得するのであれば
```
metrics = ["cpu.usage", "mem.usage"]
```
と複数指定するだけ。

値はカウンタ名をキーに指定する。

```
counters[host[0]][:metrics]["cpu.usage"][0]
counters[host[0]][:metrics]["mem.usage"][0]
```


# Multi instance
CPUやNICなど複数実装しているカウンタ値をそれぞれに取得したい場合はオプションで指定する。

```
opt = {:multi_instance=>true}
counters = vim.serviceContent.perfManager.retrieve_stats(host, metrics, opt)
```

インスタンス毎の配列で返ってくるので、取得する場合は

```
counters[host[0]][:metrics][["cpu.usage", "1"]][0]
```

のようにハッシュのキーを[カウンタ名、インスタンス名]の__配列__で指定する


特定のインスタンスを指定する場合は

```
opt = {:instance=>"instance name"}
```
とする。


# Multi record
ESXは20秒毎に2時間分のデータを保持しており、max_samplesを指定することで過去分も取得できる。

```
opt = {:max_samples=>10}
counters = vim.serviceContent.perfManager.retrieve_stats(host, metrics, opt)
```

各レコードが配列で返ってくるのでindexを指定し値を得る。

```
counters[host[0]][:metrics]["cpu.usage"][10]
```

値と時刻の対応は配列のindex値を合わせて
```
counters[host[0]][:sampleInfo][10][:timestamp]
```
で関係付けられる。



# VM
ホストだけでなくVM単位でも取得出来るが、ホストとVMとで取得出来るカウンタが異なるので、

```
vm = vim.serviceContent.rootFolder.childEntity[0].find_vm("vmName")
counters = vim.serviceContent.perfManager.retrieve_stats(vm, [""])
```

でVM用のカウンタ名を確認しておく。
CPUやメモリは共通なので上記のコードで同じように取得出来る。



# その他
有用と思われるカウンタ

* cpu.usagemhz
CPUの使用クロック数
比率ではなく絶対値で取得出来るので、使われてる・使われていないの判断に使える
VMの使用状況をホスト側から観測出来るのでエージェントレスな監視にも使える。

* mem全般
メモリ関連のカウンタ。結構細かい値が取得出来る。
shared（複数VMでのページ共有量。over commitの基準に）、
swap（VM内のswapではなくover commit時のホスト側でのswap）
など。

* net全般
ネットワークトラフィックなど
現状では分散スイッチ側で取得できなかったので、ホスト物理NICとVMのNICで取得する。

* datastore.xxxLatency
ホストからのディスクアクセス遅延値
ストレージのwrite cacheが溢れるととたんに増え始める（そしてVMが固まる）
Swift - http通信処理

SwiftでのHTTP通信処理の例です。

```swift:ViewController.swift

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //urlを生成
        var url:NSURL = NSURL(string:"http://xxx.com")!

        //リクエストを生成
        var request:NSURLRequest  = NSURLRequest(URL: url)

        //リクエストを投げる　self.getHttpはレスポンス取得後の処理
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: self.getHttp)

    }
    
    //レスポンス取得後の処理
    func getHttp(res:NSURLResponse?,data:NSData?,error:NSError?){
        var response:NSString = NSString(data: data!, encoding: NSUTF8StringEncoding)!
        println(response)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```
（https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/13-http/fei-tong-qihttp を参照）
Robolectricで非同期処理(AsyncTask)のテストをする

Robolectricで非同期処理のテストがうまくいった方法をメモしておきます。

ドキュメントを検索できず、[テストコード](https://github.com/robolectric/robolectric/blob/master/robolectric/src/test/java/org/robolectric/shadows/ShadowAsyncTaskTest.java)を見て学ぶことになりました。

**公式ドキュメントがどこかにあれば教えて下さい。。。。**

## テスト前処理にやること

JavaDocで各メソッドの意味とかを探せなかったので予想ですが、
コールバックの実行とバックグラウンド処理を行うスレッドの実行を一時停止させているようです。

```
    @Before
    public void setup() throws Exception{
        transcript = new Transcript();
        Robolectric.getBackgroundScheduler().pause();
        Robolectric.getUiThreadScheduler().pause();
    }
```

## テストコードの書き方

MyAsyncTaskでは、以下のタイミングでtranscriptにログを出力するようなことをしています。

- doInBackground：バックグランドで実行される処理
- onPostExecute：バックグランド処理が完了したら実行される処理

```
  @Test
  public void testNormalFlow() throws Exception {
    AsyncTask<String, String, String> asyncTask = new MyAsyncTask();

    asyncTask.execute("a", "b");
    transcript.assertEventsSoFar("onPreExecute");

    ShadowApplication.runBackgroundTasks();
    transcript.assertEventsSoFar("doInBackground a, b");
    assertEquals("Result should get stored in the AsyncTask", "c", asyncTask.get(100, TimeUnit.MILLISECONDS));

    ShadowLooper.runUiThreadTasks();
    transcript.assertEventsSoFar("onPostExecute c");
  }
```

まず、AsyncTaskのexecuteメソッドを呼び出してバックグラウンド処理を開始していますが、
スレッドが一時停止しているので、まだ処理は行われていません。
以下2つのメソッドを呼び出して、バックグラウンド処理の実行とコールバックの実行を
任意のタイミングで行っています。

- runBackgroundTasksメソッドで、バックグラウンド処理を実行
 - ＝doInBackgroundが実行される
- runUiThreadTasksメソッドで、バックグラウンド処理後のコールバックを実行
 - ＝onPostExecuteが実行される

runBackgroundTasksを呼び出す前と、runUiThreadTasksを呼び出した後で
何かの値をチェックすることで、本当に非同期処理として実行されたかを確認できると思います。

```
    JSONObject response;

    @Test
    public void asyncTest () throws Exception {
        response = null;
        AsyncTask<String, String, String> asyncTask = new MyAsyncTask();
        
        //responseにAPIリクエストの結果を格納する非同期処理
        asyncTask.execute("http://sample.com/request/test");

        //非同期処理呼び出し直後のタイミングではまだresponseはnullのはず
        Assert.assertTrue("response must be null.", response == null);

        Robolectric.runBackgroundTasks();

        Robolectric.runUiThreadTasks();

        //非同期処理が実行されてresponseにデータが格納されたことを確認する
        Assert.assertEquals("foobar", response.getString("key"));
    }
```
[memo] Markdown の忘れやすいところ

# list の nest

Nest したいときは space を 4 つ、 - の前に入れる。

```
- 親 1
    - 子 1
        -  孫 1
- 親 2
```

# link

```
[anchor 文字列](URL)
```

# 強調

弱い強調は * で挟む。

強い強調は ** で挟む。

`*` と強調対象文字列の間に space を入れるとだめなときがある。入れない方が良い。

# pandoc で html に変換

```
$ pandoc -o document.html document.md
```
python ショートコーディングでよく使うテクニック(メモ帳)

最近 [codefights](https://codefights.com) というサイトで始めたショーコーディングで覚えたテクニックを随時まとめて更新していきます

ショートコーディング考察

* 基本の基本としてまずコーディングを始める前にアルゴリズムなどを調べて最適な解き方について把握しておくことが大事 (数字根をゴリ押しで解いた後公式を知ったとき特に痛感した)
* 答えの決め打ち勝負になるパターンもある. 
    * 例えば Input が 1 <= n <= 10 で計算量がどうしても膨大になる時は, ローカルで答えのリストを作ってからショートコーディングが始まる
* 1文字の省略に命をかける世界
* のめり込みすぎると頭おかしくなる

# 基本
## < と <=
比較演算子の <= は基本的に省略が出来て**1文字**減らせる

```py
# long
a <= 3

# short (aが整数の時)
a < 4
```

## ~- と -~
それぞれ - 1 と + 1 に相当します
ただし 乗算演算子 より優先順位が高いため括弧の省略で**2文字**減らせる

```py
# long
b * (a - 1) * 5

# short
b * ~-a * 5
```

## 三項演算子
:(コロン)や代入の左辺を省略出来る

```py
# long
if a < b:
    c = 4
else:
    c = 2

# short
c = 4 if a < b else 2
```

## repr リテラル
(Python2 のみ)
string への変換は \`\` を使う

```py
# long
str(1600)

# short
`1600`

```

## True, False 定数
厳密に論理値を返したい場合は True, False を使わずに論理演算を使う

```py
# long
b = False

# short
b = 0 > 1



# long
return True

# short
return 1 > 0
```

## import as
import する module も短縮する

```py
# long
import math
math.sqrt(10)

# short
import math as m
m.sqrt(10)
```


## 一括等価チェック
複数の文字列比較をつなげて一度に行う

```py
# 最初の文字と最後の文字両方が一致する
# long
a[0] == b[0] and a[-1] == b[-1]

# short
a[0] + a[-1] == b[0] + b[-1]


# a と b, c と d の長さが同じ(または結合しても一意である)場合
# long
a == b and c == d

# short
a + c == b + d
```





# 関数など
codefights の Challenge だと関数の形式で解答したものをテストされる

## lambda
出来れば関数からlambda式に治すと**4文字**減らせる

```py3
# long
def Hoge(n):
    return n * 2

# short
Hoge = lambda n: n * 2
```


## 引数名
引数名は明示呼び出しされていないケースが多いので1文字に出来る

```py
# long
def Hoge(arg):
    return arg ** arg

# short
def Hoge(a):
    return a ** a
```

## 再帰関数
再帰を使用している場合は1文字の変数に代入

```py
# long
def LongLongHoge(a):
    if a < 3:
        return a
    return LongLongHoge(a - 2) * LongLongHoge(a - 1)

# short
def LongLongHoge(a):
    if a < 3:
        return a
    return t(a - 2) * t(a - 1)
t = LongLongHoge
```

lambda と同時代入を使うとさらに短くなる

```py
# short
LongLongHoge = t = lambda a: a if a < 3 else t(a - 2) * t(a - 1)

```

# 応用
## リストで条件分け

```py
# long
t = a % 3
if t == 0:
    a = a * 2
elif t == 1:
    a = 0
elif t == 2:
    a = t * 2

# short
a = [a * 2, 0, (a % 3) * 2][a % 3]

# short
t = a % 3
a = [a * 2, 0, t * 2][t]

```

## 条件式を上手に使う
(a < b) は True, False を返すが それぞれ 1, 0 として演算に使える
それを利用すると省略できるパターンが多い

```py
# long
c = 4 if a < b else 2

# short
c = 2 + 2 * (a < b)
```

## 他のメソッドをそのまま入れた関数を作る

```py
# long
myhex = lambda n: '%X' % n

# short
myhex = '{:X}'.format
myhex = '%X'.__mod__
```
[MEMO]移動体の位置制御

# システム
移動体の制御点の位置を $\boldsymbol{x}$，入力を $\boldsymbol{u}$ として，以下のように定義する．

```math
\begin{align}
\boldsymbol{x_b} = 
\begin{bmatrix}
x_b & y_b 
\end{bmatrix}^\mathrm{T}
\qquad
\boldsymbol{u} = 
\begin{bmatrix}
v & \omega 
\end{bmatrix}^\mathrm{T}
\end{align}
``` 

$\boldsymbol{x_b}$ と $\boldsymbol{u}$ の関係は，移動体の姿勢（ヨー角）を $\theta_b$，移動体の回転中心から制御点の距離を $l_b$ として，
（簡単のため，移動体の回転中心と制御点は機体の中心軸にあるとする）

```math
\begin{align}
\begin{bmatrix}
v \\ 
l \omega 
\end{bmatrix}
=
\begin{bmatrix}
cos \theta_b & sin \theta_b \\
- sin \theta_b & cos \theta_b 
\end{bmatrix}
\begin{bmatrix}
\dot{x}_b \\ 
\dot{y}_b 
\end{bmatrix}
\end{align}
```

![移動体.jpg](https://qiita-image-store.s3.amazonaws.com/0/88680/b0923f7f-ae19-5651-9abf-4efc3923dca3.jpeg)

# 制御
目標位置を $\boldsymbol{x_b^d} = \begin{bmatrix} x_b^d & y_b^d \end{bmatrix}^\mathrm{T}$，目標速度を $\boldsymbol{\dot{x}_b^d} = \begin{bmatrix} \dot{x}_b^d & \dot{y}_b^d \end{bmatrix}^\mathrm{T}$ とすると，

```math
\begin{align}
\begin{bmatrix}
v \\ 
l \omega 
\end{bmatrix}
=
\begin{bmatrix}
cos \theta_b & sin \theta_b \\
- sin \theta_b & cos \theta_b 
\end{bmatrix}
\left(
K_d
\begin{bmatrix}
\dot{x}_b^d \\ 
\dot{y}_b^d 
\end{bmatrix}
- K_p
\begin{bmatrix}
x - x_b^d \\ 
y - y_b^d 
\end{bmatrix}
\right)
\end{align}
```

として，PD制御する．
iOS8.4.1以降でhoverにopacityを設定するとリンクがダブルタップしないと動いてくれない問題にでくわした話


こんにちは！　最近フロントよりもやってる@srockstyleです！

iOSの8.4.1になってa:hoverがなんかイラッとする挙動するようになったなあ？という方いませんか？　僕です！

## iOS8.4.1でダブルタップしないとリンクを飛んでくれない問題

ChromeでもSafariでも出現しました！

こんな感じのタグにすると発生するようです。

```HTML
<a href="/link.html">
```

```SCSS
a {
	&:hover {
		opacity: 0.8 ;
	}
}

```

## 対策

iOSに限るので、Media Queryで対応できます。
hover -> activeとかにすると対応も可能です。jQueryでもいいですし、究極opacityの値を1にすればいいです。

僕はCSSの対応だけでできました！（なおこの結論に至るまで6時間かかった模様）

```SCSS
a {
	&:active {
		opacity: 1 ;
	}
}

@media screen and (min-width:  960px) {
	a {
		&:hover {
			opacity: 0.8 ;
		}
	}
}

```

これでPC版はopacity効くけどそれ以外はなしという対応ができます。

同じ問題で困っている方の参考になれば！
githubでローカルで先に作ったリポジトリをpushする

最初にremoteリポジトリを指定。あとはいつも通りpushする。

```
git remote add origin git@github.com:ユーザー名/リポジトリ名

git push origin master

```

#参照
https://jp.linux.com/linux-community/blog/236-mirainoitsuka/403358
Electron+Node.js+jQueryで最小構成チャット

Electronが流行りらしいのでチャットでも作ろうと思ったのですが、簡単なサンプルが見つからなかったので自分で作りました。40行程度です。

![](https://raw.githubusercontent.com/wiki/naga3/electron-chat/ss.gif)

こちらに一式置いてあります。
https://github.com/naga3/electron-chat

# インストール

```
npm -g install electron-prebuilt
git clone https://github.com/naga3/electron-chat.git
cd electron-chat
npm install
```

# 実行方法

まずサーバーを開始します。

```
node server
```

次にクライアントを好きなだけ立ち上げてチャットできます。

```
electron .
```

# ソースについて

基本的には
[Node.js + Socket.IO + jQuery で最小構成チャット](http://qiita.com/naga3/items/bdf6176537a5ac77a9b5)と同じです。

## server.js

```js
var io = require('socket.io').listen(3000);
io.sockets.on('connection', function(socket) {
  socket.on('msg', function(data) {
    io.sockets.emit('msg', data);
  });
});
```

HTTPサーバーを起動する必要がないのでスタンドアロンでsocket.ioを起動しています。

## main.js

```js
var app = require('app');
var BrowserWindow = require('browser-window');
var mainWindow;
app.on('window-all-closed', function() {
  if (process.platform != 'darwin') app.quit();
});
app.on('ready', function() {
  mainWindow = new BrowserWindow({width: 600, height: 800});
  mainWindow.loadUrl('file://' + __dirname + '/index.html');
  mainWindow.on('closed', function() {
    mainWindow = null;
  });
});
```

Electronのサンプルそのままです。すみません。

## index.html

```html
<!doctype html>
<meta charset="utf-8">
<title>electron chat</title>
<script>
window.$ = require("jquery");
$(function() {
  var socket = require('socket.io-client')('http://localhost:3000');
  $('form').submit(function() {
    socket.emit('msg', $('input').val());
    $('input').val('');
    return false;
  });
  socket.on('msg', function(data) {
    $('div').prepend(data + '<br>');
  });
});
</script>
<form><input></form><div></div>
```

requireを使わないとjQueryやsocket.ioのクライアントが読み込めないらしいです。
もっとよい書き方があるのかもしれません。
3分でEFK(ElasticSearch+Fluentd+Kibana)を構築する

# はじめに

* 今更ながらかもしれませんが、EFK(ElasticSearch+Fluentd+Kibana)を試してみてます。
* ちょっと試したいだけなのに一杯インストールせねばならんのですね。。。ということでEFK構成を構築するansibleのplaybookを作ってみました。良ければ使ってください。
* Forwarder - https://github.com/uzresk/ansible-td-agent.git
* EFK - https://github.com/uzresk/ansible-efk.git

# 3分で構築する前提事項

* ansibleが使えること
* gitが使えること(yum -y install gitとかで突っ込んでおいてください）
* サーバを2台（sshで接続できればなんでもいいです）

# こんな環境を作ります。

* 左側はfluentdのforwarder。右側はログを集積するaggregatorと呼ばれます。
* forwarderからaggregatorへはin_tailを使ってログを連携します。
* aggregatorへ連携されたログはfluent-plugin-elasticsearchを使ってelasticsearchに入ります。
* kibanaはelasticsearchの情報を閲覧するためのviewになります。同一のホスト上にある場合はデフォルトインストールされた状態で使うことができます。

![スクリーンショット 2015-08-25 14.31.34.png](https://qiita-image-store.s3.amazonaws.com/0/57686/e6fb51b6-d729-bc2c-cfbc-b33179f44467.png)

* 今回は/var/log/secureの情報を、fluentd経由でelasticsearchにインデクシングさせてみます。

# クライアント環境を作ります。（左側）

１．gitからソースを取得します。

* このplaybookはtd-agentのインストール、サービス化、kernel、ulimitの設定をやってくれます。
* 設定をちゃんと反映させるには再起動が必要です。

```
git clone https://github.com/uzresk/ansible-td-agent.git
```

２． inventoryファイルの対象ホストの情報を編集して

```
[server]
192.168.1.20
```

３． 実行

```
ansible-playbook -i hosts site.yml
```

# ログ集積用のサーバ（右側）を構築します。

* こちらも3stepです。

１．gitからソースを取得します。

このplaybookはこんなことをやってくれます。（設定をちゃんと反映させるには要再起動）

* td-agentのインストール、kernel,ulimits設定
* td-agent.confの設定、サービス化
* fluent-plugin-elasticsearchのインストール
* libcurlのインストール
* jdk8のインストール
* elastic search1.7.1のインストール、サービス化、起動
* kibanaのインストール、サービス化、起動
* apacheのインストール、プロキシの設定

```
git clone https://github.com/uzresk/ansible-efk.git
```

２． inventoryファイルの対象ホストの情報を編集します。

```
[server]
192.168.1.20
```

３． 実行

```
ansible-playbook -i hosts site.yml
```

# 動作を確認する。

1. クライアント側のサーバにsshログインする。
2. kibanaを開く(http://ログ集積サーバのIP/kibana/)
3. Discoverタブ内でsecure*を選択し、Discoverで/var/log/secureのログが転送されてきていればOKです。
Androidでアラーム時計を作るのに役立つリンク集

アラーム時計をAndroidアプリとして作りたいと思ったので、少し調べてみました。

# 必要な技術

Androidでアラーム時計を作るときには、AlarmManagerを使います。Androidアプリの作り方の基本が分かっていて、AlarmManagerの使い方が分かれば作ることができます。

# リンク集 - 作り方を紹介しているサイト一覧

アプリの基本部分が親切丁寧に解説されています。これを見れば、一通りタイマーが作れます。

- AlarmManager でタイマー機能を使う
  - https://akira-watson.com/android/alarmmanager-timer.html

- Android でCronみたいなことをするには
  - http://www.taosoftware.co.jp/blog/2009/02/alarmmanager1_android_cron.html

- Qiita/アラームの作り方
  - http://qiita.com/petitviolet/items/89a0166f4167753d8844

ただし、注意する点があって、電源を切ったときや、アプリがバージョンアップする時には、AlarmManagerを再設定する必要があります。その方法は、以下にあります。

- Android端末の起動と同時に常駐開始するアプリ
  - http://lostlinksearch.net/blog/2011/03/android%E7%AB%AF%E6%9C%AB%E3%81%AE%E8%B5%B7%E5%8B%95%E3%81%A8%E5%90%8C%E6%99%82%E3%81%AB%E5%B8%B8%E9%A7%90%E9%96%8B%E5%A7%8B%E3%81%99%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA/
- アプリがアップデートしたことを検知する
  - http://wada811.blogspot.com/2014/03/android-update-broadcast-receiver.html

# 本家SDK

とは言え、SDKを参照すると間違いはないでしょう。

- Android SDK/AlarmManager
  - http://developer.android.com/reference/android/app/AlarmManager.html

# 作ったアプリ

そして、以下のようなしゃべるアラームを作りました。

- 声アラーム
  - https://play.google.com/store/apps/details?id=com.kujirahand.voicealarm
指定したディレクトリ以下のファイルだけをアーカイブする



DIR以下のファイルだけをARC.tar.gzに固めるには、

`find DIR -type f -printf '%P\0'|tar czvf ARC.tar.gz -C DIR --null -T -`

とすれば良いです。
富豪的なのは否めませんが、xargsは使っていないのでコマンドライン長の制限にはかからないはず。

なお、findの-printfはGNU拡張なので、OSXの場合は(MacPortsかHomeBrewより)coreutilsが必要です。

---

ruby gemにどうしてもおかしいのがあり、(install --local目的で)書き換える必要があったので。
gemはdata.tar.gzとmetadata.gzを固めたtarなので、data.tar.gzを生成できればp7zipで入れ替えられる。
面白くないプロジェクトを面白くする方法について


あくまでメモ
時々の場合によることが多いかと

想定イメージ
================================================

* 仕事を面白くすることは悪くないという範囲の前提
* 困難に対処する能力必要性についてはひとまず保留
* そこまで高度なスキルが無い場合からの自立や育成
* よりよい関係性の素地はあるがうまくいかない状況

面白さとは
================================================

いろいろあって、それぞれかと

* 技術的な面白さ
* 見合ったコミュニケーション
* 個人スキルなどの向上
* 喜びの共有や感謝、達成感
* 無理のない責任や心身負荷

ロール
================================================

* 仕事を面白くするスキルのある人材
* 面白くするスキルの継承、文化や哲学の構築

メモ
================================================

* そういう観点を含んだプロジェクトマネージャー的な書籍でも読んだ方が早そう
gem ZipangでOctopressの日本語URLをローマ字読みぽくする


## 標準だと中国語読みローマ字になる？

[octopress/octopress](https://github.com/octopress/octopress)のmasterをcloneして使っているのだが、ここの`stringex` における `to_url`が中国語読み？になってしまう。例えばこんな感じ。

```ruby
irb(main):001:0> require 'stringex'
=> true
irb(main):006:0> '日本語のurlを"to_url"すると？'.to_url
=> "ri-ben-yu-falseurlwo-to-url-suruto?"
```

つまり、`rake new_post['日本語']` とやると、できるページ名が `ri-ben-yu` とかになってしまい、さっぱり私にはわからない形になる。

## どう解決するか

考えたのは

1. 意識高く、全ては英語で通すべきである
2. URL encodingすればいいんじゃね？
3. stringexを拡張して日本語ローマ字にするべきだ
4. 便利なライブラリがあるに違いない、あるに決まった。

の4択だが見事4.に成功した。[Ruby - 日本語をＵＲＬ用ローマ字に変換するgem Zipangを作った - Qiita](http://qiita.com/kozo002/items/a9b434925a92900d2b85)である。神。

ちなみに1.はわかるがやはり和書のタイトルなどを入れたい場合には無理があるだろう。2.はファイルシステムに存在できない文字がでたらエスケープとかクソめんどいことになるだろうなと、3.は意識高すぎてツライのでパス。

## 適用

1. Gemfileに `gem 'zipang'`行を追加し、`bundle install`
2. `to_url`は正規化目的で最終的には通したほうがいいだろうと考えて、がんばって `x.to_url` となっているところをすべて `Zipang.to_slug(x).to_url` に置き換える。私の場合は `Rakefile` と `plugins/category_generator.rb` 、 `plugins/tag_cloud.rb` であった。
3. gem kuromoji が jdk に依存しているので Java のインストールが必須であった。
4. 試す。以下な感じ。いい感じである。

```shell-session
~/gitwork/myblog
[pharaohkj]$ tree |grep bushi
│   │   │           └── bushi-no-kakei-bo-dokuryo
    │   ├── 2015-08-24-bushi-no-kakei-bo-dokuryo.markdown
~/gitwork/myblog
[pharaohkj]$ tree |grep sengoku
│   │       ├── sengoku-taisen
~/gitwork/myblog
[pharaohkj]$ tree |grep shuusi
│   │   │       │   └── shuusi
    │   ├── 2015-08-03-shuusi.markdown
```


## Dockerfile

いろいろ事情があって私は `GitHub` にpushすると、`jenkins`が`Docker`を使ってAmazon CloudFront上にDeployするようにしてあるので、そちらもJDKのインストールに対応させる。OpenJDKで問題なく動いてるようだ。

追加した行はこんな感じ。いきなりイメージサイズが膨らむのが残念なところ。`FROM`は`ubuntu:15.04`

```
ENV JAVA_HOME /usr/lib/jvm/java-6-openjdk-amd64/
RUN apt-get install -y openjdk-6-jdk
```

## 考察

以上で完了。サンプルは[PharaohKJ/octopress.phalanxware.com](https://github.com/PharaohKJ/octopress.phalanxware.com)と[libAlexandrina.so.octopress](http://octopress.phalanxware.com/)。

しかしいろんなサービスを使って無料でブログってる方々は多いと思うが、Java依存なGemをinstallできる環境って限られてるかもしれないから注意。・・・まぁやっぱり英語で生きていくべきなのであろう。

## 余談 : SEO有利あんのかな？

自分がURLみたり、ファイルシステム上をみたりするときにみやすいだけじゃなくて、最終的にできたURLがSEO有利不利あるのかなーと思ってかるーくgoogleしてみたら以下の様なページが。

[URLを日本語にすべきか？ => UXの観点から日本語のほうがいいかもしれないがSEOとは関係ない | 海外SEO情報ブログ](https://www.suzukikenichi.com/blog/should-urls-contain-japanese/)

> GoogleのSyed Malik Mairaj氏は、その国の言語でURLを付けることを推奨しました。
ただしそれはユーザー体験の観点からです。
Googleの評価が高まりランキングが上がるということではありません。

なるほど。んじゃまぁ今回は自己満足ということで。
Electronを初めて触った時にハマった5つのこと

初めてElectronを使ってTwitterクライアント https://github.com/k0kubun/Nocturn を作ったときによくわからず時間を吸われたことについて、これからElectronを使いはじめる人のために残しておく。

# トラックパッドでスクロールすると画面の外までひっぱれてしまう
マウスホイールでスクロールしてると気づかないのだが、トラックパッドで画面の適当なところを引っ張ると画面の外側が見えてしまい、普通のブラウザっぽくなる。Electronの検索性が低くてなかなか情報にたどり着けなかったが、ChrominumベースなのでChromeについてググったら直し方がわかった。
http://stackoverflow.com/questions/12046315/prevent-overscrolling-of-web-page

```scss
html, body {
  width: 100%;
  height: 100%;
  overflow: hidden;
}

// 中の要素はスクロールさせる
body > div {
  height: 100%;
  overflow: scroll;
  -webkit-overflow-scrolling: touch;
}
```

あとWebっぽくなくすテクニックとしては、`user-select: none;`にしておくというのもある。


# Electron.app/Contents/MacOS/Electron から起動しないほうが良い
http://electron.atom.io/docs/latest/tutorial/quick-start/ によるとElectronバイナリをダウンロードしてローカルのアプリを開くときは`./Electron.app/Contents/MacOS/Electron your-app/`せよみたいなのが書いてある。認証を実装しているときoauthというnpmで使われているnet.jsでエラーになったんだけど、この起動方法を使うのをやめて`./node_modules/.bin/electron .`するようにしたらこのエラーが出なくなった。

その時出てたエラーメッセージでググると https://github.com/atom/electron/issues/1429 が出てきて、`it could be virus scanner or firewall software.`とか言われていてウケる。きっとElectron.appはvirus scannerかfirewall softwareを同梱しているということだろう。まぁ冗談だけど、いずれにせよハマるので使わないほうがよさそう。

# Quick Start GuideのコードはMacだけアプリを終了しないようになっている
http://electron.atom.io/docs/latest/tutorial/quick-start/ でハローワールドしたコードでそのまま開発したんだけど、window-all-closedの扱いが以下のようになっている。

```js
// Quit when all windows are closed.
app.on('window-all-closed', function() {
  // On OS X it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform != 'darwin') {
    app.quit();
  }
});
```

これは完全にその通りでせやなって感じなんだけど、この実装に依存して開発してると、最初のウィンドウを閉じて次のウィンドウを開くみたいな挙動がMacでしか動かなくなり、WindowsやLinuxで動かしたときに全く原因がわからず大変時間を吸われた。新しいウィンドウを開く部分を実装するときはこれを意識して開発したほうが良さそう。

# 一部のキー入力がkeypressイベントから取れない
デスクトップアプリを作るならショートカットキーは実装したい。
別にElectronに限った問題では無いと思うが、多くのキーはkeypressで取れるんだけど、backspaceとか矢印キーはkeypressでは取れない。なのでkeydownを使う。

あと、MacでCmdとの組み合わせを実装したいときは、`event.metaKey`が`true`かどうかを判定してやれば良い。

# haml-jsとhamlの互換性がない
nodeのことをよく知らないまま開発を始めたので、自作のhaml実装 https://github.com/k0kubun/hamlit でhamlをコンパイルしながら開発していた。最終的にフロントエンド界隈の人がいじりやすいようにgulp-hamlでコンパイルするようにしたんだけど、haml-jsはRubyのhaml gemとは少なくとも以下の2点で互換性がない。

- シングルクオートが使えない https://github.com/creationix/haml-js/issues/83
- attributeをネストして書くことができず、Rubyの式としてはinvalidな書き方をする必要がある

つまり以下のような修正が必要になる。
https://github.com/k0kubun/Nocturn/commit/b9fb59d921f26b740fe894c56470afb496873157

`{ data-id: 0 }`みたいなのRubyだとパースできないしRuby圏の人から見ると違和感がある。
暗号化（パスワード管理）のツールまわりのメモ


要求
==========================================

* コマンドで管理しつつGUIなどとも連携したい
* クラウドに保存したくない（たまに実際に事件が起きているので信頼はできなさそう）
* クラックされない程度の安心できるオリジナルロジックがあればよりよい
* 本当はCUIだと何かと便利そう
* ブラウザ呼び出しをしたい、安全に

ソリューション検討
==========================================

vim -x file
:set key=hoge
:set key=

brew install pass
brew install passpie

共有パス管理
Mortimer

Linuxに対応したパスワードマネージャ
KeePassX（http://keepassx.sourceforge.net/en/）
GPass（http://projects.netlab.jp/gpass/ja/）
kpasman（http://kpasman.sourceforge.net/）
Revelation（http://oss.codepoet.no/revelation/）
(ref. http://www.atmarkit.co.jp/flinux/rensai/linuxtips/936revelationpass.html)

CUIで便利そうだけど、今ひとつブラウザからの呼び出しの敷居が高い（クリップボードを挟むとか）
うまくAppleScriptがうごかないので調整に挫折
クラウドと同等にセキュリティが少し不安な感じがする

要求からそれるけど、lastpass-cliというのもあった。
http://www25.atpages.jp/~ossdemo/blog/tag/password/
brew install lastpass-cli --with-pinentry

そんで
==========================================

安価で優良でCUI操作に対応したものがあればいいけど一般にはないのかしらー。保留。
GASで使いたいのでcoffee scriptを調べる


魔法の杖じゃない
----------------

* 参考

	http://qiita.com/asaake88/items/9462844b049900ffb22c

使っていなくてうわさだけ聞いていたら魔法の杖かと思っていたけど、面倒な面もあるらしい。

JSわかっとけ
----------------

* 参考

	http://dev.classmethod.jp/client-side/javascript/review-coffeesctipt-and-typescript/

実案件で使ってみた所感
typescriptとの比較

とりあえず両方使えたら良い。jsの理解が先。
coffee consoleわすれろってかいてるけど。

構文とか
----------------

http://www.buildinsider.net/web/rubyonrails4/0901
http://blog.bokuweb.me/entry/2015/01/06/190240
http://www.qript.co.jp/blog/technique/574/

ファットアロー
----------------

関数定義時にファットアローだとクロージャーで定義するぽい。

http://ism1000ch.hatenablog.com/entry/2014/09/24/012259

やってみる
----------------

js2coffeeのサイト便利

学ぶ部分

* coffeeのそもそも
* coffeeのクラスの作り方（factoryパターン）
* DIっぽくしてみる

クラス

* シート
* フォーム
* 汎用業務メソッド

通常のメインスクリプトの業務ロジックぷらすで呼び出す感じ。

やってみて
----------------

ちょっと学習期間がかかったけど、
ちょいクライアントに褒めてもらえてよかった。
でもまだcoffeeについては大まかな部分のみで未習得かと。
面白かった。
Google Maps APIで外部のKMLファイルを表示するときの注意点

# はじめに
ちょっとしたテスト用にGoogle Maps上にKMLファイルを表示したくなりました。
そのときに起こった失敗を踏まえて、今後のためにメモしておきます。

KMLLayer について、詳しくは下記をご参照ください。
[https://developers.google.com/maps/documentation/javascript/kmllayer](https://developers.google.com/maps/documentation/javascript/kmllayer)

# やりたいこと
自作のHTML内に、Google Maps API の KML Layer を使って地図上に独自のKMLファイルを表示したい。

![mm.png](https://qiita-image-store.s3.amazonaws.com/0/39561/f5240f3a-e9f4-a6ff-38d0-bfe8bae8c750.png)
図. KMLで東京駅にマーカーを表示した例

#やりかた
基本的に公式の [KML Layers](https://developers.google.com/maps/documentation/javascript/examples/layer-kml) に書かれている方法でOKです。

# 注意点
ここからは、先に挙げた東京駅にマーカーを表示する部分のJavaScripを例に話を進めます。

## NGケース1. KMLファイルは外部から見えない場所にある

Webサーバーをlocalhostで運用中に```new google.maps.KmlLayer()```に```url:'http://localhost/tokyost.kml'``` とか書いてしまいがちですが、これだとうまくいきません。

* ダメな例

```js
function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 11,
    center: {lat: 35.681269, lng: 41.876}
  });

  var ctaLayer = new google.maps.KmlLayer({
    url: 'http://localhost/tokyost.kml', // NG
    map: map
  });
}
```

## NGケース2. Google Driveの共有リンクを指定している

KMLファイルの置き場所としてGoogleドライブを選び、共有機能を使ってリンクを取得すると、次のようなURLが得られるので一見使えそうですがNGです。
例えば、

```
https://drive.google.com/file/d/0B9BZNJJL012qTjVWT0FQdlRvbFU/view?usp=sharing
```
このリンクはあくまでGoogle Drive内で表示するためのものなので、KmlLayerのurlに指定してもうまくいきません。

* ダメな例

```js
function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 11,
    center: {lat: 35.681269, lng: 41.876}
  });

  var ctaLayer = new google.maps.KmlLayer({
      url: 'https://drive.google.com/file/d/0B9BZNJJL012qTjVWT0FQdlRvbFU/view?usp=sharing', // NG
      map: map
  });
}
```

# 結論
以上を踏まえて、KMLファイルは外部から直接アクセス可能なWebサーバー[^1]に置きましょう。

* KMLファイルをGoogle Siteに置いた例

```js
function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 11,
    center: {lat: 35.681269, lng: 41.876}
  });

  var ctaLayer = new google.maps.KmlLayer({
    url: 'https://sites.google.com/a/foobarbaz/test/tokyost.kml',
    map: map
  });
}
```

# 脚注
[^1]: 無料で使えるKMLファイルの置き場所としては、Google Siteの添付ファイル、DropboxのPublicフォルダ、GitHub Pages、GitHubにPushしてRAWにアクセス、などがあります。
network > GARPを実行する方法 / SpanningTreeに注意

http://qa.atmarkit.co.jp/q/6616

> Vista以降のWindowsOSでは、GARPではなくARP要求(送信元IP=0.0.0.0)を送信なので、
送信元を自IPとするGARPパケットを送信するスクリプト(SendARP関数)が紹介されていますね。
http://msdn.microsoft.com/en-us/library/aa366358(VS.85).aspx

> これは、OS自身がデフォルトでGARPを実装するのではなく、
ユーザが明示的な意図をもって、ユーザ責任で扱ってくださいと言うことです。

<hr>
同じリンク先にて

> ご希望の挙動を実現する際には、ネットワークのSpanningTreeにご注意ください。
Windowsの再起動や、NICの無効、LANケーブルの抜き差しといった、一度リンクダウンが発生してしまうようなケースにおいては、サーバが接続されたネットワークスイッチのポートにおいてSpanningTreeが動作しているとGARPがネットワーク上に広報されないケースがあります。
SpanningTreeの計算中は、リンクアップしていてもOS側でネットワークと通信ができないため、GARPを広報してもスイッチ側で捨てられてしまうからです。

<hr>
スパニングツリー －スパツリとは？－
http://www.itbook.info/study/p19.html
メモ：CentOS7にMongoDB3.0をインストール

# CentOS7にMongoDB3.0をインストール
* CentOS7
* Vagrant
* MongoDB 3.0

参考：[Install MongoDB on Red Hat Enterprise or CentOS Linux](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/)

## Install MongoDB
### パッケージマネージャー(yum)の設定
*/etc/yum.repos.d/mongodb-org-3.0.repo* を作成します。

```bash:/etc/yum.repos.d/mongodb-org-3.0.repo
[mongodb-org-3.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1
```

### インストール
最新の安定版MongoDBをインストールするコマンド：
```bash:sh
sudo yum install -y mongodb-org
```

## MongoDBを起動
### 事前準備
* SELinuxを無効にします

```bash:/etc/selinux/config
SELINUX=disabled
```
* データディレクトリとパーミッションの設定
MongoDBインスタンスは*/var/liv/mongo* にデータファイルを作成します。
ログファイルは*/var/log/mongodb*がデフォルトです。設定ファイルで変更できます。 
設定ファイルは*/etc/mongod.conf*です。

### 起動手順
#### MongoDBを起動
次のコマンドで実行：

```bash
systemctl start mongod
```

#### 正常に起動したか確認

ログで確認します。

```bash:/var/log/mongodb/mongod.log
2015-08-25T03:33:44.975+0000 I CONTROL  ***** SERVER RESTARTED *****
・・・
2015-08-25T03:33:45.092+0000 I NETWORK  [initandlisten] waiting for connections on port 27017
```

ポートは*27017* がデフォルトです。

#### MongoDBの停止
```bash
systemctl stop mongod
```

#### MongoDBの再起動
```bash
systemctl restart mongod
```


### MongoDBのアンインストール


#### MongoDBを停止

```bash
systemctl stop mongod
```

#### パッケージを削除

```bash
yum erase $(rpm -qa | grep mongodb-org)
```


#### データディレクトリを削除

```bash
sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongo
```
network > Gratuitous ARP > 自分のIPアドレスが他の端末で使用されているかのチェック

http://atnetwork.info/tcpip1/tcpip184.html

> 自分のIPアドレスをリクエストすることに何の意味があるのでしょうか？
...
> 本来であれば、自分自身のIPアドレスに対するARPリクエストを送信したところで、他の端末から返事なんてあるはずがありません。
...
>ところが、返事があった場合はどうでしょうか？
>
>既にそのIPアドレスが他の端末で使用されていることが分かります。

IPの重複を調べるのに使えるようだ。

Linuxのコマンドについてはこれから調べる。