OmniAICreator/Qiita-1.07M huggingface dataset:
TextViewなどで日本円表記したい


`￥10,000`こういうやつ

NumberFormatにそれらしいヤツがありました。


```java:nikkei.java
NumberFormat.getCurrencyInstance().format(10000);
```

表示させてみると

`￥10,000.00`

日経平均かよ。

今回、銭はいりません。
なんかオプションないかなと思って見てみたけどなさそう。
なのでDecimalFormatというヤツをつかいました。

```java:awesomeYen.java
DecimalFormat yenFormat = new DecimalFormat("\u00A5###,###");

yenFormat.format(10000);
```

やったね。
フロントエンド自動化入門

[HTML5NAGOYA #14](http://www.zusaar.com/event/10507004) の資料です。

# Gulpの導入

### 1. グローバル空間へgulpをインストールする

```
npm install -g gulp
```
ローカルマシン内で`gulp`コマンドを使えるようになる。

### 2. プロジェクト内のdevDependenciesにgulpをインストールする

```
npm install --save-dev gulp
```

### 3. `gulpfile.js`または`gulpfile.coffee`をプロジェクトルートに作成する

```javascript
var gulp = require('gulp');

gulp.task('default', function() {
  // defaultタスクの処理
});
```

```coffeescript
gulp = require 'gulp'

gulp.task 'default', ->
  # defaultタスクの処理
```

### 4. gulpを実行する

```
gulp
```

defaultタスクは何も指定していと実行されます。
default以外で登録されたタスクは、`gulp <task> <othertask>`という感じで実行できます。

## プラグイン
ググってもいいし、公式ページの検索を利用してもいい
http://gulpjs.com/plugins/

Q. あれ、◯◯なプラグインがないんじゃない？
A. なんか理由があって[ブラックリスト](https://github.com/gulpjs/plugins/blob/master/src/blackList.json)入りしてるかも



# Selenium Webdriverの導入

### 1. インストール
Rubyに本体に付属して標準で入っているモジュールのgemでインストールする
`gem install selenium-webdriver`

### 2. テストの記述
ファイル名はなんでも良い。ここではひとまず`test.rb`としておく

```rb
require "selenium-webdriver"

driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://google.com"

element = driver.find_element(:name, 'q')
element.send_keys "Hello WebDriver!"
element.submit

puts driver.title

driver.quit
```

### 3. テストの実行
作成したrubyファイルと同階層で`ruby test.rb`を実行する。


# Karmaの導入

### 1. Karmaのインストール
```
npm install -g karma
```

### 2. 設定ファイルを作成する
```
karma init
```
テストフレームワークは何にするか、Require.js使う？ブラウザどうする？みたいなことを聞いてきます。


### 3. karma.confについて
    
* `basePath:` ベースとなるパス
* `frameworks:` Karmaで利用するフレームワーク（必要に応じて`npm install`してください）
* `files:` ブラウザに読み込ませるファイルリスト、またはそのパターン
* `reporters:` テストのレポーターに使用するモジュール一覧
* `port:` Karmaサーバで使用するポート番号
* `logLevel:` 出力されるログレベルの設定
* `autoWatch:` ファイルの自動監視
* `browsers:` テストに利用するブラウザ（必要に応じて`npm install`してください）
* `singleRun:` trueにすると、1度テストが実行されると終了します


### 4. karmaを実行してみる

`karma start`でKarmaが立ち上がります。テストコードがあればテストが走ります。

```coffeescript
describe '■■■■ タイトルのテスト ■■■■', ->

  it 'タイトルが等しいこと', ->
    title = 'hoge'
    expect(title).to.equal 'hoge'
```



---- 
> 参考:
https://github.com/gulpjs/gulp
https://code.google.com/p/selenium/wiki/RubyBindings
http://karma-runner.github.io/0.12/index.html
Selenium と Apache POI を同時に使うのに苦労したからメモっておく

```:build.sbt
name := "HogeHoge"

version := "0.1"

scalaVersion := "2.10.3"

libraryDependencies += "org.seleniumhq.selenium" % "selenium-java" % "2.42.2"

libraryDependencies += "com.typesafe" % "scalalogging-slf4j_2.10" % "1.1.0"

libraryDependencies += "org.slf4j" % "slf4j-api" % "1.7.7"

libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.2"

libraryDependencies += ("org.apache.poi" % "poi-ooxml" % "3.10-FINAL").
						exclude("stax", "stax-api").
						exclude("org.apache.xmlbeans", "xmlbeans")
						
libraryDependencies += ("org.apache.xmlbeans" % "xmlbeans" % "2.6.0").
						exclude("stax", "stax-api")
```

これでようやく sbt-assembly が通るようになった。
iOS FLAnimatedImagegif を使ってgifを再生

これを使えば恐ろしく簡単にgifを再生できる。

##FLAnimatedImagegif とは？
Flipboardが公開しているライブラリで実際Flipboardのアプリでも使われている。
https://github.com/Flipboard/FLAnimatedImage

##実際に使ってみる
###cocoapodsでインストール
```objc:Podfile
pod 'FLAnimatedImage', '~> 1.0'
```

###使いたいViewControllerに２つのヘッダファイルインポート
```objc:ViewController.m
#import "FLAnimatedImage.h"
#import "FLAnimatedImageView.h"
```

###メソッド呼び出し方
####プロジェクト内のgifファイル(nyan.gif)を再生させたいとき
```objc:ViewController.m
NSURL *gifUrl = [[NSBundle mainBundle] URLForResource:@"nyan" withExtension:@"gif"];
FLAnimatedImage *gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:[NSData dataWithContentsOfURL:gifUrl]];
FLAnimatedImageView *animationView = [[FLAnimatedImageView alloc] init];
animationView.animatedImage = gifImage;
self.view = animationView;
```

####WebのURLから再生したいとき
```objc:ViewController
FLAnimatedImage *gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://raphaelschaad.com/static/nyan.gif"]]];
FLAnimatedImageView *animationView = [[FLAnimatedImageView alloc] init];
animationView.animatedImage = gifImage;
self.view = animationView;

```

たったこれだけ。チュートリアルなんかに使えそう。
ありがとうFlipboardさん。
Go言語: 1行の文章を指定の文字数で改行したい


[go/docのToText](http://godoc.org/go/doc#ToText)関数を使うと一発でできる。

```go
package main

import (
	"go/doc"
	"os"
)

func main() {
	text := "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
	doc.ToText(os.Stdout, text, "", "", 60)
}

```

出力結果

```
Lorem Ipsum is simply dummy text of the printing and
typesetting industry. Lorem Ipsum has been the industry's
standard dummy text ever since the 1500s, when an unknown
printer took a galley of type and scrambled it to make a
type specimen book. It has survived not only five centuries,
but also the leap into electronic typesetting, remaining
essentially unchanged. It was popularised in the 1960s with
the release of Letraset sheets containing Lorem Ipsum
passages, and more recently with desktop publishing software
like Aldus PageMaker including versions of Lorem Ipsum.
```

一旦変数に代入したい場合は `bytes.NewBufferString()` を使うといい 

```go
	out := bytes.NewBufferString("")
	doc.ToText(out, text, "", "", 60)
```
Installing Asterisk 11 on Mavericks


## 背景

Asterisk 11を自分でビルドしてMacにインストールする。

## 準備

```bash
$ brew install autoconf gmp mpfr libmpc homebrew/versions/gcc48
```

enum.cとsrv.cのコンパイルに失敗する(GCCだと__APPLE_CC__が1らしい)ので、arpa/nameser_compat.hを強制includeさせる。

## ビルド

```bash
$ ./configure CC=gcc-4.8 CXX=g++-4.8 CFLAGS='-include arpa/nameser_compat.h' --without-netsnmp --without-gtk2
$ make
$ make install
```
Amazon EC2上でforeverを使ってexpress verion4.xを使ったnode.jsを動かす

node.jsを使っており、開発中は`npm start`や`node app.js`などでnodeを起動していても、いざまともに運用となると困るわけですが、foreverを使うとデーモン化できて便利です。
## インストールと起動方法 ###
Amazon EC2にsshでログインしているとします。

**part1**  インストール

```Bash:foreverのintall
$ npm install -g forever
```

**part2** 起動
node.jsのプログラムがあるディレクトリまで移動します。
express version 4を使っているとします。

```Bash:foreverを使って起動
forever start bin/www
```

**part3** 確認

```Bash:確認
$ forever list

info:    Forever processes running
data:        uid  command                             script  forever pid   logfile                        uptime       
data:    [0] leld /home/ubuntu/.nvm/v0.10.26/bin/node bin/www 12344   12346 /home/ubuntu/.forever/leld.log 0:0:12:0.549
```

上記のようにプロセスが起動していれば成功です。
以上です。簡単です。

## 補足 ##
###止め方###
`forever stop uid`で止まります。上の例だと、

```Bash:Stop
$ forever stop leld
```
です。

```Bash:Stop
$ forever stop 0
```
でも止まるかも。

###再起動###
`forever restart uid`です。


### EC2の設定が適当でログインする度、nvmの設定が忘れられるときの復帰方法###
ずぼらな人向けのメモ。私です。本来はちゃんと復帰できるように設定するべきです。

```Bash:サーバーを一時的止める
$ nvm ls
v0.10.26

$ nvm use v0.*
Now using node v0.10.26

$ cd /path/to/src
$ forever list
$ forever stop hoge

```
デフォルトのElasticsearchは常にクラスタを組みたがっているので気をつける，というかクラスタ設定とめとく

# 概要
elasticsearchはデフォルトでmulticastがONになっているので，気がつくと知らないノードとクラスタ組んでいるときがある．インストールしたら，

* クラスタ名を変える
* multicastをやめる

のどっちか（もしくは両方）ぐらいはしておいた方がいい．

# 経緯

icu の filter プラグインを入れたのですが，どうも上手く認識されなくてさんざん悩んだあげく，次のようなアドバイスをもらいました．

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/ikawaha">@ikawaha</a> クラスタ名を変更したほうがいいですよ。デフォルトで起動すると、同じネットワークで立ち上げてる人がいると、クラスタ組んじゃうから。</p>&mdash; Jun Ohtani (@johtani) <a href="https://twitter.com/johtani/statuses/497633951830126592">2014, 8月 8</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

!たしかに知らないうちにノードが増えてる！

入れたプラグインが動かない原因はこう．

1. 知らないうちに知らないノードとクラスタ組んでる
2. 知らないノードには僕が入れたプラグインが入っていない（あたりまえ
3. すべてのノードに入っていないプラグインは動作しない

orz ということでクラスタ勝手に組まないように `elasticsearch.yml` を修正します．ウチの環境では `/etc/elasticsearch` の下にありました．

# 修正点

2箇所変更しました．

```yaml:クラスタ名を変更する
################################### Cluster ###################################
# Cluster name identifies your cluster for auto-discovery. If you're running
# multiple clusters on the same network, make sure you're using unique names.
#
#cluster.name: elasticsearch
cluster.name: ikawaha.elasticsearch
```

```yaml:multicastをしないようにする（デフォルトはON）
# Unicast discovery allows to explicitly control which nodes will be used
# to discover the cluster. It can be used when multicast is not present,
# or to restrict the cluster communication-wise.
#
# 1. Disable multicast discovery (enabled by default):
#
discovery.zen.ping.multicast.enabled: false
```

設定を変更する前に，クラスタ組んでたインデックスをそっと消しました．こちらからは以上です．
cannot load such file -- io/console (LoadError)

`rails new sample`
して、下記のようなエラーが出た場合。

`/usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:126:in 'require': cannot load such file -- io/console (LoadError)`

io-consoleをインストールします。
`[ec2-user@ip-***-***-***-*** ~]$ gem install io-console
Fetching: io-console-0.4.2.gem (100%)
Building native extensions.  This could take a while...
Successfully installed io-console-0.4.2
Parsing documentation for io-console-0.4.2
Installing ri documentation for io-console-0.4.2
Done installing documentation for io-console after 0 seconds
1 gem installed`

`[ec2-user@ip-***-***-***-*** ~]$ rails new sample
      create（以下略`

できました :tada:
cocos2dx v3 Map

cocos2d::Mapの挙動について

試したバージョン
cocos2dx 3.2
ndk-r9d

こんな感じのコードをかくと

```cpp

class Obj : public cocos2d::Ref
{
public:
CREATE_FUNC(Obj);
bool init() { return true; }
CC_SYNTHESIZE(std::string, name, Name);
static Obj* create(std::string str) {
auto o = create();
o->setName(str);
return o;
}

};

cocos2d::Map<int, Obj*> m;
m.insert(1, Obj::create("obj1"));
m.insert(2, Obj::create("obj2"));
m.insert(3, Obj::create("obj3"));
m.insert(4, Obj::create("obj4"));

for(auto a : m) {
CCLOG("map=>%d,%s", a.first, a.second->getName());
}
```

androidだとこうなる。
map=>4,obj4
map=>3,obj3
map=>2,obj2
map=>1,obj1

iosだと
map=>1,obj1
map=>2,obj2
map=>3,obj3
map=>4,obj4

いろいろと実験してみたところ、

```cpp:CCMap.h
#define USE_STD_UNORDERED_MAP 0
```

にするとunordered_mapをmapにするとandroidでもiosと同じ用に出力された。

ndkの問題なのかな。。
C# 可変長引数

こんな方法があるなんて
全然知りませんでした。

```csharp
class aaa {
        static void bbb (int a ,params string[] strs) {
        }
    }
    
    static void Main () {
        int a = 1;
        int b = 2;
        bbb(a,"foo","bar","baz");
        bbb(b);
    }
}
```
Go言語で関数のカリー化(currying)入門

[Alex_23drum](http://qiita.com/Alex_23drum)さんの[Swiftで関数のカリー化(currying)入門](http://qiita.com/Alex_23drum/items/7a9b0ecd0800483b5ddf)という記事を読んで、興味がそそられたのでGO言語に置き換えてみました。
※タイトルは、当該記事をリスペクトさせて頂きました。

カリー化についての説明は、Alex_23drumさんの記事に書かれているので、作成したコードのみ載せたいと思います。


## コード
サンプルは、１＋１を計算するコードです。
４.は、コードを書いているうちに思いついたので付け足して見ました。

 1. 足し算した結果
 2. ２つの引数を取るメソッド
 3. カリー化したメソッド（１）
 4. カリー化したメソッド（２）

```go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("1+1=", 1+1)       // 1. 足し算した結果
	fmt.Println("1+1=", add(1, 1)) // 2. ２つの引数を取るメソッド
	add1 := cadd(1)
	fmt.Println("1+1=", add1(1))   // 3. カリー化したメソッド（１）
	fmt.Println("1+1=", cadd(1)(1)) // 4. カリー化したメソッド（２）
}

func add(x, y int) int {
	return x + y
}

func cadd(x int) func(int) int {
	return func(y int) int { return x + y }
}
```
Rails: run rake task in cron jobs

In Rakefile, add this line to the top:

```
#!/usr/bin/env rake
```

Run crontab -e to access crontab editor

```
* * * * * cd /path/to/rails_app; bin/rake some_task
```

Change the timing, path to your rails app and the rake task that you want to execute.

Read more: http://tutorials.jumpstartlab.com/topics/systems/automation.html
(note: in the tutorial, the author suggests to use full path to rake. I tried but it failed so I just used bin/rake instead)
AWS EC2用Zabbix Agentの設定方法


# Zabbix Agentのインストール

## Zabbixの公式yumレポジトリを登録

```
# rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm
```

## Zabbix Agentをインストール

```
# yum install zabbix-agent
# zabbix_agent -V
Zabbix agent v2.2.5 (revision 47411) (17 July 2014)
Compilation time: Jul 21 2014 18:44:08
```

# Zabbix Agentの設定

## zabbix_agentd.confの編集

### 一般インスタンス用の設定

```/etc/zabbix/zabbix_agentd.conf
# Zabbix Serverからのリモートコマンドを受け付ける
EnableRemoteCommands=1

# リモートコマンドログを記録する
LogRemoteCommands=1

# Zabbix ServerのIPを指定
Server=10.0.0.209

# Zabbix ServerがListenするポート番号
ListenPort=10050

# Zabbix Serverのアクティブチェック
Server=10.0.0.209

# Zabbix Serverに登録されるホストの名前
Host=Host Name Server
```


### オートスケーリング対象インスタンス用の設定

```/etc/zabbix/zabbix_agentd.conf
# Zabbix Serverからのリモートコマンドを受け付ける
EnableRemoteCommands=1

# リモートコマンドログを記録する
LogRemoteCommands=1

# Zabbix ServerのIPを指定
Server=10.0.0.209

# Zabbix ServerがListenするポート番号
ListenPort=10050

# Zabbix Serverのアクティブチェック
Server=10.0.0.209

# Zabbix Serverに登録されるホストの名前
HostnameItem=system.hostname

# Zabbix Serverにホスト自動登録するためのメタキーワード
HostMetadata=www_autoscaling
```

## 設定を反映する

```
# service zabbix-agent restart
```

## 自動起動設定を行う

```
# chkconfig zabbix-agent on
```
BLEとは（個人的BLEメモ）


## BLE基礎知識を身につけるのに役だった記事
【連載】Bluetooth LE (1) Bluetooth Low Energy の基礎 (フェンリル | デベロッパーズブログ)
http://blog.fenrir-inc.com/jp/2013/09/bluetooth-le-firststep.html
BLE モジュールリスト - Reinforce-Lab.'s Blog
http://reinforce-lab.github.io/blog/2013/01/31/ble-modules-listing/



## 用語
### シングルモード
■Bluetooth4.0対応機器との接続が出来るBLEに対応したもの。超低消費電力で動作するためコイン型電池で一年単位での動作が可能。またMFiプログラムの認定が必須ではない（macのスマートデバイスでBluetooth接続をするための認証）
### デュアルモード
■Bluetooth機器全てに対応したもの。BLE接続ではない場合は超低電力消費では無く、MFiプログラムの認定が必須。


## 対応状況
■ios機器はほぼ対応（iOS5以降）
■Andoroid4.3以降で標準APIとして搭載されている
## BLEを試す方法
###（必須要件）
iOS機器で試す場合、デベロッパープログラムの登録が必須。

### 各社で提供されているBLEモジュールまたはモジュール込みの開発キットを利用する
以下、市販されているBLEモジュール、開発キット

■TI CC2541 SensorTag BLE開発キット | 東京デバイセズ 
http://tokyodevices.jp/items/167
■CC2541 SensorTag 開発キット - CC2541DK-SENSOR - TI ツール・フォルダ
http://www.tij.co.jp/tool/jp/cc2541dk-sensor
■Bluetooth 4.0 (Bluetooth Low Energy) BLE112 開発キット | 東京デバイセズ
http://tokyodevices.jp/items/162
■konashi - A physical computing toolkit for iPhone, iPod touch and iPad
http://konashi.ux-xu.com/
■Bluetooth LE - 株式会社Braveridge
http://www.braveridge.com/bluetooth.html
■浅草ギ研 BLEモジュール BLESerial | 無線通信関連 › 無線ユニット | ロボット 専門店 - ツクモRobot王国オンラインショップ 
http://robot.tsukumo.co.jp/goods/0405993929015/702045000000000/
■BLUETUS® | Bluetoothを活用したスマートフォンへのビーコン発信機
http://www.bluetus.jp/#about-page
■Beacon | 株式会社アプリックス
http://www.aplix.co.jp/?page_id=8620

### その他、iPhone等に実装したデバイスを利用する方法もあり（OSが対応していてbluetooth対応なら何でもOK）
 
## BLEモジュール、BLEモジュール開発キットとは
### BLEモジュール
基板にアンテナやセンサーをつけたもの。付属品は各販売モジュールによって様々。また購入の際は日本の技術基準適合照明を取得しているものを使うことが必須。
### BLEモジュール開発キット
■BLE開発を行うためのソフトウェアや、ライブラリ、サンプルアプリなどがついたもの。パッケージ内容によって値段は様々。
参考リンク:Bluetooth Low Energy開発キットの選び方 http://vibrosoft.net/archives/56
 
## モジュール
### konashi　http://konashi.ux-xu.com/
■ドキュメントが分かりやすい
■javascriptでプログラミング出来る
■オールインワン
■10,260円
■iosのみ対応。androidはα版があり
### CC2541 SensorTag開発キット http://www.tij.co.jp/tool/jp/cc2541dk-sensor
■手軽に試せるキットとしてよく使われている模様
■センサーも数種類ついており、単なるpush,pull以外の使い方もできる
## モジュール選定時に技術基準適合証明の確認が出来る総務省のページ
■総務省 電波利用ホームページ | 技術基準適合証明等を受けた機器の検索
http://www.tele.soumu.go.jp/giteki/
※技適の認証を受けていない場合、日本での使用は認められないため確認は必須。

## その他　参考記事
■[iOS 7] [iBeacon] Mac を Beacon 端末にする ｜ Developers.IO
http://dev.classmethod.jp/smartphone/iphone/mac-beacon/
■[iOS 7] 新たな領域観測サービス iBeacon を使ってみる ｜ Developers.IO
http://dev.classmethod.jp/references/ios7-ibeacon-api/
## 関係ないけど通信するくくりで
■[iOS 7] P2P 通信を手軽に実現する Multipeer Connectivity Framework を使ってみる ｜ Developers.IO
http://dev.classmethod.jp/references/ios-multipeer-apiusage/
■DSP の基礎・トレーニング - TI http://www.tij.co.jp/dsp/jp/docs/dspcontent.tsp?contentId=53991
## 全然関係ないけど気になった記事
■[iOS 7] JavaScriptCore Framework を使った Objective-C と JavaScript の連携ができるようになった ｜ Developers.IO
http://dev.classmethod.jp/references/javascriptcore-ios-objective-c/
多段 ssh でどこまでも

# 概要
少しへんてこな構成でとある検証を行っていて、nginx や apache で reverse proxy 設定するのも面倒くさいから多段 ssh で解決しちゃいましょうというのが始まりでした。久しぶりだったので忘れないようにメモ。

# 構成

```
localpc → 踏み台サーバ → 検証サーバ → 辿り着きたいサーバ
```

# 実施内容
* 今回見たいのは上記の ```辿り着きたいサーバ``` 80番ポート。要は Web です。
* 全てのポート番号は任意で変えてください。

```localpc上
ssh -L 10080:localhost:9999 USER@踏み台サーバのアドレス
```
そのままログインできるので下記を実施。

``` 踏み台サーバ上
ssh -L 9999:localhost:10000 UESR@検証サーバのアドレス
```
またそのままログインできるので下記を実施。
今回は80番ポートが対象なので80となります。

```検証サーバ上
ssh -L 10000:localhost:80 USER@辿り着きたいサーバのアドレス
```

無事に手元の PC で辿り着きたいサーバの80番が閲覧できました。
めでたしめでたし。
メンタルモデルをやってみる その1 - ユーザーの動機を想像してみる -

# メンタルモデルとは

- メンタルモデルは、**「ユーザーが安定的に連続して取る行動のモデル」**
- 行動をタスクとし、その**タスクを完遂するため**に**プロダクトには何が必要で何が不要なのか**の**ギャップを分析すること**
- 大きくはビジネスチャンスを見い出すための**モノサシ**となる



# 使うもの

- メンタルモデルダイアグラム
    - 行動の親和図をタワーのように並べたもの
    - タワーの下に該当しそうな機能などをならべる。 => ギャップ分析という

- ユーザーインタビュー
    - メンタルモデルダイアグラムで分析できたセグメントユーザーにインタビューを行う


# 流れ

#### 1. 社内で予測できるペルソナの設計=> セグメントの決定
    セグメントはマーケティングセグメントのように同じ趣向や年齢層などのセグメントではなく、タスク（=行動）別にセグメントする

#### 2. 機能の割当
    1で完成したメンタルモデルダイアグラムのタワーグループに現在の機能を書き出す

#### 3. セグメントユーザーにインタビュー
    同じセグメントでも数回、できれば一つのセグメント/1日とし、その都度セグメントを分析する
    
#### 4. メンタルモデルダイアグラムの再設計
    1-2の流れを改めて行う
    
#### 5. ギャップ分析
    予測したメンタルモデルダイアグラムと実際のメンタルモデルダイアグラムのギャップから必要な機能やコンテンツ・不要な機能やコンテンツ、今はないが必要であろう機能やコンテンツは何かを分析する


###### ＊ペルソナとは

> "ユーザーの行動パターンを調べ、そのデータを統合して作り上げたユーザーを代表する仮想の人物のこと"



# ユーザー像とユーザーの行動・動機を想像してみる

#### 1. 今回の場合、ユーザーがサービスやプロダクトを使うときに何をするかを書き出します。例えば、付箋やホワイトボードなどに。  

![brainstorming.jpg](https://qiita-image-store.s3.amazonaws.com/0/47955/ffcc5683-a9fc-9b91-51a2-08faa34de2c0.jpeg)

#### 2. 行動（以降タスク）は「名詞+動詞」で書き出す
    - 例：シェアされた記事を見る, Twitterにコメントつけてツイートする…etc
    - 時間は1時間と決めて書き出す
    - 各員の手が止まった際は既にでているタスクを一つあげて深堀してみる

#### 3. ざっくりとした人物を考えてみる
    - タスクを書き出す際に想像できた人物像を書き出す
    - 年齢や性別ではなく、技術オタクや友達から教えられてくる人などのような表現にする
 
#### 4. タスクをグループ化する
    - タスクのグループ化は2で書き出したタスクと3でつくった人物の関連性をチェック。
    - 「×」の多いものをグループ化していく

[自転車をテーマにした表のサンプル](https://docs.google.com/spreadsheets/d/1SQKTjTTDPj-l9bql_dcKQryqoaRxcTRC2AaUIR-yaTQ/edit#gid=0)  

![スクリーンショット 2014-08-08 13.32.16.png](https://qiita-image-store.s3.amazonaws.com/0/47955/12cf5d63-c702-9a61-d22e-450c7cd86227.png)

#### 5. グループに名前をつける
    - 参考図では「街乗りポタリング」「生活のために乗る人」「通勤・通学だけ」がまずグルーピングできそうです。例えばこれに「スローライダー」と名前をつけます。
    - このようにグループにイメージしやすい名前をつけていき、いくつかのセグメントをつくります。 


# プロトペルソナの作成

前章であらい出したセグメントから調査スコープを決定し、それに近いユーザーのペルソナを設計します。
おおよそ4〜5人。ペルソナシートを用意し以下内容を想定でうめていきます。

- 年齢層・性別（C/T/F1-3/M1-3）
- 見えてくる職種
- 生活圏（海外・国内/首都圏・主要都市/都市圏/地方など）
- ユーザーの目的（ゴール）
- ユーザーが不満に思うもの・要望


# インタビュー、そして再度メンタルモデルダイアグラムの作成へ

この後の工程は次の通りになります。
現在某プロジェクトで実際に試しているのでそのレポートもふまえて次回まとめたものを書く予定です。

- 前章であらい出したセグメント（プロトペルソナ）に近いユーザー・潜在的なユーザーへのインタビュー
- 発話録からユーザーの深層心理を分析・タスクの検証を行う
- メンタルモデルダイアグラムの作成
- プロダクトやプロジェクトとユーザーの実際のタスクとのギャップを分析
- 必要・不要な機能や要件のあらい出し、ペルソナの見直しなど


# 所感

今回某プロジェクトで実際にこのメンタルモデルの初期ブレインストーミングを行いました。
結果、書籍や権威などの話を見るとセグメントが決まった時点ですぐにインタビューを行うような工程でしたが、プロジェクトによってはこのブレインストーミングからセグメントのあらい出しまでは数回、もしくはセグメントが幅広い場合はいくつかに分けて行う方がよりセグメントのタスクなどがまとめやすいように感じました。

また、1日時間をとれる場合はよいですが、チームメンバーのスケジュールなどを考慮すると数回にわたって行う方がメンバー間で整理もできて意見が出やすい環境が生まれるように感じました。

なお、デザイナーだけでこのメンタルモデルに関するブレインストーミングを行うのはあまりよくないとも感じました。
デザイナーは非ビジネス視点でどうしてもモノを見るところがあるため、いい意味でユーザーに寄りすぎるところがあります。
マーケティングチームと協業することで、ビジネス的にもユーザーの行動がいかに分析するにたる重要なものか共有することもでき、単なる理想論で終わらないように思います。
可能なら早いうちからマーケティングチームも参加してもらう事が重要に思いました。
RubyMine で Rails のモデルの閲覧が捗る件

すこぶる捗るので設定方法を共有。私の RubyMine のバージョンは `6.3.3` です。
今回は SQLite を利用している想定で（他のDBもたぶん同じような感じでできると思います）。

- 右側の `Databese` タブを選択

    ![スクリーンショット 2014-08-08 13.05.08.png](https://qiita-image-store.s3.amazonaws.com/0/35733/f5f1d113-05b7-e36a-71d6-fb2b5c497ca2.png)

- `+` ボタンから `Data Source` を追加します。

    ![スクリーンショット 2014-08-08 13.08.22.png](https://qiita-image-store.s3.amazonaws.com/0/35733/cbf2ea91-94cc-57f3-7ed5-217521da09f9.png)

- 追加された Data Source をダブルクリックで開き、`File:` 欄で 対象とする Rails プロジェクト内の db ファイルを選択します。

    ![スクリーンショット 2014-08-08 13.08.58.png](https://qiita-image-store.s3.amazonaws.com/0/35733/cb79d73a-dfdd-35a2-af38-5d9a040acb66.png)

- テスト接続してみましょう。`successful` と表示されればOKです。

    ![スクリーンショット 2014-08-08 13.09.20.png](https://qiita-image-store.s3.amazonaws.com/0/35733/2194d233-fb77-4401-7e4f-cd0075270106.png)

- デフォルオで同期されるようになってますが、初期状態では同期されていないので、メニューから手動で同期します。

    ![スクリーンショット 2014-08-08 13.10.18.png](https://qiita-image-store.s3.amazonaws.com/0/35733/a46c7647-694d-194e-1b6a-5bb263f5d29e.png)

- 同期すると、モデルの定義が閲覧できるようになります。

    ![スクリーンショット 2014-08-08 13.10.38.png](https://qiita-image-store.s3.amazonaws.com/0/35733/25230d29-efc2-11a9-1612-67e13f1357b1.png)

- ダブルクリックすると、データの中身も表示されます。

    ![スクリーンショット 2014-08-08 13.11.03.png](https://qiita-image-store.s3.amazonaws.com/0/35733/c44e528f-7960-6aaa-006b-8c9932d59f98.png)

- 右クリックから Diagrams を選択すると、

    ![スクリーンショット 2014-08-08 13.11.22.png](https://qiita-image-store.s3.amazonaws.com/0/35733/7ce8e2cf-0426-9d9d-1fb1-ff0d9d7b8576.png)

- ER図が表示されます。

    ![スクリーンショット 2014-08-08 13.11.32.png](https://qiita-image-store.s3.amazonaws.com/0/35733/c8b51e0a-268b-2b19-91ec-44e66816cd24.png)


RubyMine 最強すぎる^^
ggplot2で軸の目盛や目盛の文字の色を変更する

```:R
g <- g +
     theme(axis.ticks=element_line(colour = "black"),
           axis.text=element_text(colour = "black"))
```

## 参考
- [theme. ggplot2 0.9.3.1](http://docs.ggplot2.org/current/theme.html)
Redmine でチケット一覧にデフォルトのカスタムクエリを設定できるプラグイン

## 作った理由

Redmine は複数のプロジェクトを管理できますが、各プロジェクト毎にチケット一覧で表示する項目やフィルタ、ソートの **デフォルト** を設定することはできません。いろいろなプロジェクトを一つの Redmine で管理するとき、これが地味に辛かったりします。

## Redmine Default Custom Query プラグイン

Redmine には、プロジェクト毎にチケット一覧の表示項目やらフィルタやらソートをクエリとして保存できるカスタムクエリという機能があるので、チケット一覧にデフォルトで適用するカスタムクエリを設定できるプラグインを作りました。

ソースコードは全て下記 GitHub に公開しています。
https://github.com/hidakatsuya/redmine_default_custom_query

redmine.org のプラグインにも登録してます。
http://www.redmine.org/plugins/redmine_default_custom_query

少し前に v0.0.2 を公開したのですが、昨日テストコードを書いて TravisCI させるようにしたので、一気に [v1.0.0](https://github.com/hidakatsuya/redmine_default_custom_query/releases/tag/1.0.0) としてリリースしました。ちなみに、個人的には v1.0.0 で満足してるので、今後積極的に開発を進める気はないです。

### 使い方

使い方はとてもシンプルで、プロジェクトの設定画面で "Default custom query（デフォルトカスタムクエリ）" モジュールを有効にすると、下図のような設定タブが追加されるので、デフォルトにしたいカスタムクエリを設定するだけです。

なお、表示範囲が公開 (Redmine 2.3 以前) 又は全てのユーザ (Redmine 2.4 以降) になっているカスタムクエリのみ選択できます。

![select-default-query-per-projects.png](https://qiita-image-store.s3.amazonaws.com/0/4232/350c822f-3ba9-92d2-b387-ce77d788c2e8.png)

チケット一覧にアクセスすると、設定したカスタムクエリが適用された状態で表示されるようになります。

![issues-with-default-query.png](https://qiita-image-store.s3.amazonaws.com/0/4232/6c90606a-5e5b-9a4a-4461-2f36749269e3.png)

ただ、常にデフォルトクエリが適用されてしまうと都合の悪いこともあるので、以下の操作を行ったときには一時的にデフォルトカスタムクエリが適用されません。

  * 別のカスタムクエリを選択したとき
  * フィルタを適用したとき
  * サイドバーの "View all issues（すべてのチケットを表示）" をクリックしたとき

逆に以下の操作ではデフォルトクエリは解除されません。

  * ソートしたとき（表のタイトルをクリックするとソートされるやつ）

それと、このプラグインを有効にすると、チケット一覧サイドバーの右上に "View default issues（デフォルトチケットを表示）" というボタンが追加されます。これをクリックすると、デフォルトクエリが適用された状態に戻すことできます。 "Issues（チケット）" タブをクリックしたときも同様です。

### 対応バージョン

GitHub の [README.md](https://github.com/hidakatsuya/redmine_default_custom_query/blob/master/README.md) か、 TravisCI の [ビルド結果](https://travis-ci.org/hidakatsuya/redmine_default_custom_query) を見て下さい。

### インストール方法など

GitHub の [README.md](https://github.com/hidakatsuya/redmine_default_custom_query/blob/master/README.md) を見て下さい。

## 終わりに

今回初めて Redmine プラグインのテストを TravisCI で実行するようにしました。それ自体はそんなに難しくないのですが、プラグインが [Gemfile](https://github.com/hidakatsuya/redmine_default_custom_query/blob/master/Gemfile) を持っていたがためにだいぶハマったので、別の機会にその辺りのこともまとめれればと思ってます。

興味のある方は [.travis.yml](https://github.com/hidakatsuya/redmine_default_custom_query/blob/master/.travis.yml) やコミットログをご覧下さい。
Windowsでコマンドラインから時刻同期する

## 方法

WindowsでコマンドラインからNICTのNTPサーバーと同期させる方法。(要管理権限)
Windows Time サービスを起動している必要がある。

```
C:\> net stop w32time
Windows Time サービスを停止中です.
Windows Time サービスは正常に停止されました。

C:\> net start w32time
Windows Time サービスを開始します.
Windows Time サービスは正常に開始されました。

C:\> w32tm /config /syncfromflags:manual /manualpeerlist:ntp.nict.jp /update
C:\> w32tm /resync
```

## 参考

* [ドメインの時刻をNICTのNTPと同期させる](http://www.vwnet.jp/Windows/WS08R2/NTP/w32time.html)
* [Windowsの時刻同期でエラーになるのをなんとかしてみる « サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2013/05/29/windowsntpupdate/)
ログアウト後も実行させるコマンド

## コマンド

コマンド名だけ覚えておく。

* nohup
* disown

## 参考

[nohup を忘れたときは disown コマンドを使おう](http://www.codereading.com/nb/ignore-sighp-with-disown.html)

> 実行中のジョブを
> 1. ctrl+z で一時停止
> 2. bg でバックグラウンドで実行
> 3. disown -h [jobspec]
Bash参考サイト

## 参考

* [Bash scripting](http://iishikawa.s371.xrea.com/note/bash-script.html#id2405853)  
  文字列の扱いが良く分かるのです。  
  ファイルの読み込みもできるのです。

```bash:
FILE=hoge.txt
while read -r line; do
    echo "$line"
done <"$FILE"
```
```bash:
FILE=hoge.txt
cat "$FILE" | while read -r line; do
    echo "$line"
done
```

* [BashPitfalls - Greg's Wiki](http://mywiki.wooledge.org/BashPitfalls#echo_.22Hello_World.21.22)  
  「Bashの落とし穴」たまに見るといいかも
ggplot2でパネルの周りに枠をつける（box）

## boxをつける方法
`fill=NA`がないと、プロットが白い長方形で覆われてしまいます。

```:R
g <- g + theme(panel.border = element_rect(fill = NA, size=1))
```

## boxでなく、単に横軸と縦軸をつける方法

```:R
theme(panel.border = element_blank(), axis.line = element_line())
```


## 参考
- [Adding theme(panel.border=element_rect(...)) resets the plot · Issue #659 · hadley/ggplot2](https://github.com/hadley/ggplot2/issues/659)
- [r - plot only x and y axis (no box) in ggplot2 - Stack Overflow](http://stackoverflow.com/questions/12883386/plot-only-x-and-y-axis-no-box-in-ggplot2)
CloudWatch Logs Agent の挙動について調べたことのまとめ

公式ドキュメントに記述されているFAQの翻訳みたいになってしまいましたが、
CloudWatch Logsを実際使うに当たって、CloudWatch Logs Agent の挙動について調べたことのまとめです。

設定ファイルについては[こっち](http://qiita.com/szk3/items/5e9d09635139d08eadc6)にまとめました。

## 設定ファイルを変更したので、設定を反映させたい

設定ファイル`/var/awslogs/etc/awslogs.conf`に以下の記述がありました。

> NOTE: A running agent must be stopped and restarted for configuration changes to take effect.

configを再読み込みさせる場合は、Agentのrestartが必要そうです。
condrestartとかは無いみたいですね。

## ログがローテーションした場合はどうなるの？

ファイルのローテーションについては、以下の条件であればサポートされます

1. ファイルがリネームされ、同名のファイルが新規作成される
2. ファイルがコピーされ、中身がトランケートされる
3. ファイルが同じような条件で新規作成される

3はちょっとわかりずらいのですが、ログローテートのルールとして日付でインクリメントしていくようなパターンを想定しているようです。
/var/log/message-20140808 の後に、/var/log/message-20140809が作られるような場合が該当しますね。

ドキュメントに、
> Creating a new file with a common pattern as the old one.

って書いてあるけど、`common pattern`ってどこまで許容されるの？って思い、ソースを見てみました。

ログ送信の対象となるファイルを選定する実装は、以下に記述されています。
`/var/awslogs/lib64/python2.6/site-packages/cwlogs/push.py`

ざっくり言うと、パスにマッチしたファイル一覧の中から、変更日付の一番新しいファイルに対して処理を行うようです。

ちょっとだけ具体的にすると、こんな感じでした。

1. 設定の`file = <value>` に指定した値でファイル一覧を取得
2. ファイル一覧をmtimeを降順でソートする
3. 一番新しいmtimeの１ファイルに対して処理を行う

こんな感じで、ローテートしても同じストリームにログが流れるようになっているみたいです。

## ログイベントってどうやってバッチされるの？

ログイベントはある程度まとめてバッチされるのですが、
1回のバッチで、容量(32k)、件数(1000件)、時間(24h)の制限があるようで、
以下の条件にハマるとバッチされるようです。

1. 最初のログイベントが届いてから、`buffer_duration`で設定した時間が過ぎた場合
2. 新しくログイベントを追加したタイミングで、32kを超えているような場合
3. ログイベントが1000件集まった場合
4. ログイベントのタイムレンジが24hを超えた場合

`cwlogs/push.py`の`EventBatch` classを確認するのが手っ取り早いです。

## ログ送信のスキップについて

PutLogEvents API には制約があり、以下のような場合にスキップされるようです。

1. ログイベントが32kを超えるような場合
2. ログイベントの時刻が2時間以上未来の場合
3. ログイベントの時刻が14日過去以上過去の場合
4. ロググループの保持期間(retention period)より過去の場合

適当にログファイルにログを突っ込んで挙動を確かめてたら上記の3に該当し、
ログ送信されなくて若干ハマりました。

ちなみにemitされない場合は、`/var/log/awslogs.log`に
きちんとログが出力されるので安心（？）です。


## Agentが止まっている間のログってどうなるの？

`state_file` が利用可能で、最後にAgentを起動してからログローテートされてなければ、停止した所から再度pushし始めるとのこと。

逆に言うと、ローテートされていた場合は、ローテートされる前のファイルに対して何かしらリカバリーしないとですね。
重要なログは、ちょっと注意が必要そう。


## 異なる複数のログをひとつのストリームにまとめたい

> Configuring multiple log sources to send data to a single log stream is not supported.

Log Streamの運用を考えている時に思いついたのですが、サポートされてませんでした。


## Agentが Log Groupや、Log Streamを自動で作るのをやめさせたい

IAMポリシーで、DescribeLogStreams, PutLogEventsのみを許可するようにすればいいみたいです。




## 参考
http://aws.typepad.com/aws_japan/2014/07/cloudwatch-log-service.html
https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/AgentReference.html
gitの日本語名のファイル名の問題

NDFやらNFCの問題で、濁点付のファイル名が別ファイルと認識されてしまいました。
そういうときは

* core.precomposeunicode=false
の設定をglobalとlocalであわせる
* cloneをやり直し

にて解決するはず。
Dalvikの警告ログ「Could not find class '〜', referenced from method 〜」を抑制する方法


Androidのアプリケーションでは、存在しないクラスを参照するクラスをロードした際、次のような警告ログが出力されます：

```
E/dalvikvm( 4165):Could not find class 'com.example.spikeapp.library.optional.Optional', referenced from method com.example.spikeapp.library.Library.hoe
W/dalvikvm( 4165): VFY: unable to resolve new-instance 1020 (Lcom/example/spikeapp/library/optional/Optional;) in Lcom/example/spikeapp/library/Library;
D/dalvikvm( 4165): VFY: replacing opcode 0x22 at 0x0000
D/dalvikvm( 4165): DexOpt: unable to opt direct call 0x20f2 at 0x02 in Lcom/example/spikeapp/library/Library;.hoe
```

このログは例えば次のようなコードを実行すると出力されます：

```MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        new Library().say();
```

```Library.java
public class Library {
    public void hoe() {
        new Optional(); // Optionalクラスはクラスパス上にない
    }

    public void say() {
        Log.d("spike", "hello!");
    }
}
```

Optionalクラスが存在しなくてもLibrary#say()の実行には影響がないため実行自体は意図通りに行なわれますが、もしログに余計な情報を出力させたくないのであれば、例えば次のように存在しないクラスを参照するコードを別クラスに分割して間接的に参照するようにすると良いでしょう：

```MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        new Library().say();
```

```Library.java
public class Library {
public class Library {
    public void hoe() {
        new OptionalLibrary().hoe();  // Optionalクラスを直接参照しないようにする
    }

    public void say() {
        Log.d("spike", "hello!");
    }
}
```

```OptionalLibrary.java
public class OptionalLibrary {
    public void hoe() {
        new Optional();
    }
}
```
tmuxを使いながらログを取る

tmux で ウィンドウ単位のログが取得したかったのでメモ


#何ができる？
tmux の ウィンドウ内の入力・出力を全て記録できます。（時刻情報付き！）

![tmux_always_logging.png](https://qiita-image-store.s3.amazonaws.com/0/25340/545b0913-d408-096f-54cb-13c49c295a04.png)

#動作確認環境
tmux 1.7 ※執筆している 20140808 時点の最新は 1.9a です。

 ※OS
 　　Ubuntu14.04
 　　Fedora14
 　で動作を確認

#.tmux.conf の編集

0. ~/.tmux/log/ フォルダの作成

```
mkdir -p ~/.tmux/log/
```

1. tmux.conf を編集（無い場合は新規作成）

```
 vi ~/.tmux.conf

以下を追加

# ===== logging =====
#
# C-b C-p Start logging.
bind-key C-p pipe-pane -o '/bin/sh -c "while read -r LINE; do echo \"[\$(date +\"%%Y_%%m%%d_%%H%%M%%S_%%N\")] \${LINE}\" >> \${HOME}/.tmux/log/\$(date +%Y%m%d-%H%M%S)-#S-#I.#P.log; done "' \; display-message "Logging start."
# C-b C-o Stop logging
bind-key C-o pipe-pane \; display-message "Logging end."
# C-b v Open new window. Logging always. (-n is set window name.)
bind-key v new-window -n 'logging...' \; pipe-pane -o '/bin/sh -c "while read -r LINE; do echo \"[\$(date +\"%%Y_%%m%%d_%%H%%M%%S_%%N\")] \${LINE}\" >> \${HOME}/.tmux/log/\$(date +%Y%m%d-%H%M%S)-#S-#I.#P.log; done "'
```

```
※#S セッションインデックス
　#I ウインドウインデックス
　#P ペインインデックス
```


# 使い方
##新規ウィンドウを開く（常時ログ取得）
Ctrl+b, v の順で 「logging...」 という名前の新規ウィンドウが開きます。
開いたウィンドウは常に記録されています。

※ウィンドウ名が気に入らない場合は Ctrl+[,] で変更できます。

##手動でのロギング
### === 開始 ===
Ctrl+b, Ctrl+p の順で 

 Logging start.

のような文字が最下部に表示され(一瞬！)、実際にログが出力されていれば OK です。

 ログファイル例：
 /home/user1/.tmux/log/2014_0808_113045-0-0.0.log

※CR などのエスケープ文字、制御文字等が含まれるので、ログファイルの内容の取扱には注意願います。

### === 停止 ===
Ctrl+B, Ctrl+o で停止します。
Logging end. とメッセージが表示されます。（一瞬）


#【メモ】シェルスクリプト組込用のコマンド
これはただの私的なメモです。
ログを取得しながら tmux を開くコマンド

```

新規 tmux セッション開始時
tmux new-session \; pipe-pane 'cat >> LOGNAME'
新規 tmux セッション開始時（日付情報付）
tmux new-session \; pipe-pane -o '/bin/sh -c "while read -r LINE; do echo \"[\$(date +\"%%Y_%%m%%d_%%H%%M%%S_%%N\")] \${LINE}\" >> \${HOME}/.tmux/log/\$(date +%Y%m%d-%H%M%S)-#S-#I.#P.log; done "'

別ウィンドウを開く場合（既に tmux は起動済）
tmux new-window \; pipe-pane 'cat >> LOGNAME'
日付情報付
tmux new-window \; pipe-pane -o '/bin/sh -c "while read -r LINE; do echo \"[\$(date +\"%%Y_%%m%%d_%%H%%M%%S_%%N\")] \${LINE}\" >> \${HOME}/.tmux/log/\$(date +%Y%m%d-%H%M%S)-#S-#I.#P.log; done "'
```

#【参考】tmux 1.7 のビルド
##最新の tmux のリポジトリからビルド

```
git clone http://git.code.sf.net/p/tmux/tmux-code tmux-tmux-code
cd tmux-tmux-code
```

tag 1.7 を 1.7ブランチとしてチェックアウトする

```
git checkout refs/tags/1.7 -b 1.7
```

ビルドする

```
./autogen
./configure
make
sudo make install
```

##ビルドできないときには・・・

aclocal が無い

```
apt-get install automake
```

cursesが無い

```
 sudo apt-get install libcurses-*


※ncurses とは違うの・・・？お兄さん教えて
```

libevent が無い

```
 sudo apt-get install libevent-dev
 
 又は
 
 sudo yum install libevent-devel.i686 -y
```
go getでgithubに置かれた特定ブランチをインストールする


...ことは出来ないっぽい? ので, go getで普通に入れた後ローカルでcheckout, ビルドする

````
$ cd $GOPATH/github.com/username/repo
$ git checkout branch_x
$ go install
````

とすれば更新される
拡張性、再利用性、可読性の高いコードパターン - JavaScript編

快適なコーディングを楽しむための新しいコードパターン（とファイルパターン）を提示します。

*2014-08-09追記：*
*長くなったのでHTML(PHP)編,CSS編,JavaScript編に分けました。*
*過去の投稿からご参照頂ければと思います*

Webコーディングでもっとも対処すべき課題は**範囲（スコープ）を明示し独立させる**ことです。
（HTMLやCSSはスコープがないために読みづらく冗長だと考えます）

HTMLは構造、CSSはプレゼンテーション、JavaScriptは振る舞いというそれぞれの役割の意味をしっかり吟味し根本から再考しています。

##JavaScript
JavaScriptは構造（HTML）を変える能力と、見た目（CSS）を変える能力と計算（計算・チェック・バリデーション・一連の処理への命令など）する能力があります。

###CSSをいじらずHTMLだけで見た目を変える
まず見た目を変える能力は極力使用せず、構造を変えることに着目します。
HTMLのclassを切り替えることで表現を切り替えます※。処理速度の面からもこのほうが良いです。

※アニメーションの場合はtransit.jsの使用を推奨します。
HTMLのclassベースにアニメーションを変えますし、何よりCSS3をつかっているのでGPUアクセラレーションが働き、描画負荷が非常に軽いです。しかも滑らかヌルヌルできれいです。

###計算する能力はクラス化
計算する能力はクラス化します。ちなみにこの計算する能力は唯一JavaScriptにおいてクラス化してもよい部分です。
というのもDOM自体がオブジェクトであり、例えばボックスを量産しそれぞれに位置やカラーをもたせたい場合、わざわざクラスを用意せずともDOMに定義することができます。
つまり、パーツごとに新たにクラスをもたせたいという考え方はナンセンスであり、バリデーションなど計算する能力をクラス化するべきです。
追記：
Webアプリなど大規模になってくると、関連する一連の流れをもつクラスを作るべきでしょう。ひとつのメソッド（※１）に処理を集約し、そのメソッド内にはそのクラスしか使わない小さな関数（※２）を保持します。

※１：私はこれをPrimaryMethodと呼んでいます
※２：私はこれをTinyMethodと呼んでいます

###リスナーとハンドラは分離すべきか？
ハンドラは第二のmain関数とも言えるだけにすこし特殊な扱い方が必要です。

表題の質問に対し答えはノーです。分離しません。
例えば'同じ処理だが微妙にちがう処理'というのはイベントに往々にしてありがちですが、ハンドラを分離すると...

```js:便宜上従来のjQueryのバインドの仕方で解説
$('#box1').click(fn);
$('#box2').click(fn);

function fn(e){...}
```
"微妙にちがう"部分が書けません。引数eで処理を分岐できるならまだいいですが、それ以外の分岐だと関数オブジェクトに引数をとるという冗長な書き方に走らないかぎり実現できないのです。

よって、分離せずハンドラ内部の個別の処理を再利用して軽いコピペで済むようにします。

```js:解決
$('#box1').click(function(){
  ObjA.hoge();     //コピペ
  ObjA.hogehoge(); //コピペ
  ObjB.hoge();     //コピペ
  ObjB.foo();
});

$('#box2').click(function(){
  ObjA.hoge();     //コピペ
  ObjA.hogehoge(); //コピペ
  ObjB.hoge();     //コピペ
  ObjB.bar();
});
```

分離をしない場合、上記のように自ずと内部の処理をメソッドで書くようになると思いますが、
**"正しいオブジェクト指向はif文が排除されていく"**というように、メソッドのちょっとした添削で、さまざまなパターンの処理を簡潔なコードで表現できるので理にかなっていると言えます。

###ファイルパターン
1. class　…　自作クラス
2. lib　…　jQueryやprototype.jsなどのライブラリ
3. plg　…　jQueryなどのプラグイン。自作プラグインもここへ
4. main.js　…　メイン処理（イベントハンドラもここにすべて書く）



##おわりに

さらに快適なコードパターン実現のために、あなたのコードパターンやファイルパターンを教えて下さい。また、私の解説上で難解な部分、指摘箇所なども伝えていただけると大変幸いです。

他HTML(PHP)編,CSS編もご参照ください。
[HTML] Webページでウィンドウの高さに合わせて表示させたいとき


ブラウザのウィンドウサイズはディスプレイごとに異なっていますが、Webページ上のある部分を必ずウィンドウの高さ一杯に表示させたい場合があります。そのような場合に必要なcssの設定です。

ここではページの幅が960pxで、あるページの高さの70%分をウィンドウ一杯に表示させて、残りの30%は画面をスクロールすることで見えるようにする場合を考えます。

```html
<!-- body要素内 -->
<div id="container">
  <div class="first-view">
    （first viewで見せたい部分）
  </div>
  <div class ="hidden-view">
    （first viewでは隠れてる部分）
  </div>
</div>
```

CSSは次のようになります。

```css
* {
  margin: 0 auto;
}

html,
body {
  height: 100%;
}

#container {
  width: 960px;
  height: 143%;
  background-color: #f9f;
  
}

.first-view {
  width: 960px;
  height: 70%;
  min-height: 70%;
  background-color: #9ff;
}

.hidden-view {
  width: 960px;
  height: 30%;
  background-color: #999;
}
```
大切なのはhtmlとbody要素に対して100%を指定することです。CSSの仕様として高さの指定は親要素の高さに依存します。heightの初期値はautoなので内容に依存することになり、htmlやbodyに100%を指定しておかないとウィンドウの高さいっぱいには広がりません。

そして.first-viewと.hidden-viewにはそれぞれWebページ全体に対する高さの比率をheightで指定します。当然ですが、.first-viewのheightの数値とhidden-viewのheightの数値は足すと100%になるようにしてください。

containerのheightには.first-viewのheightの逆数を指定します。first-viewのheightがウィンドウの高さいっぱいに対応するようにしたいので、containerのheightはウィンドウの高さに対して100%以上になることになります。『ウィンドウの高さに対するページ全体の高さの比率』が#containerのheightです。
S3からPHP AWS SDKを使って指定日に更新されたファイルをダウンロードする


日付を指定すると、その日付に更新されたファイルを根こそぎダウンロード。指定しないと前日のファイルをダウンロードっていう感じに動く。getObject()で1個ずつダウンロードしているけど、もっとうまいことまとめてダウンロードする方法ないのかな。downloadBucket()がいい感じにできそうだけど、条件検索できない…。

```
$ get.php 2014-08-01
```

```get.php
<?php

include './aws.phar';

use Aws\S3\S3Client;
use Aws\Common\Enum\Region;

$bucketName = 'バケット名';

// 日付を直接指定した場合
if (isset($argv['1']) && preg_match("/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/", $argv['1'])) {
	$targetDate = $argv['1'];
} else {
	// 前日の日付を設定
	$currentDate = new DateTime('-1day');
	$targetDate = $currentDate->format('Y-m-d');
}
if (!file_exists($targetDate)) {
	mkdir($targetDate);
}
echo $targetDate . "\n";

// キー、シークレットキー、リージョンを指定
$client = S3Client::factory(array(
	'key' => 'キー',
	'secret' => 'シークレットキー',
	'region' => Region::AP_NORTHEAST_1
));

$result = $client->listObjects(array(
	'Bucket' => $bucketName,
	// 'Prefix' => 'hoge', // ここで対象ディレクトリを指定できる
));

// ファイルの一覧
foreach ($result['Contents'] as $object) {
	$date = date('Y-m-d', strtotime($object['LastModified']));

	// 指定日の画像を対象にする
	if ($date == $targetDate && $object['Size'] > 0) {
		echo $object['Key'] . "\t" . $object['LastModified'] . "\n";

		// なんかファイル名の処理したりとか…
		$fileName = $object['Key'];

		// 対象ファイルの情報を取得
		$content = $client->getObject(array(
		    'Bucket' => $bucketName,
		    'Key'    => $object['Key'],
		));
		$content['Body']->rewind();

		// ファイルの保存
		$fp = fopen($fileName, 'w');
		fputs($fp, $content['Body']->read($content['ContentLength']));
		fclose($fp);
	}
}
```
お手軽 O/R Mapper `Sequel`

#<i class="fa fa-cubes"></i> 概要
Sequel: The Database Toolkit for Ruby
https://github.com/jeremyevans/sequel



>"Sequel has restored my faith in Ruby. It's really amazing. The O/RM I've been hoping for for years." 
>Sequelは、私を改めてRubyに夢中にさせてくれた。本当に驚くべきツールだよ。
>これこそ、私が長らく待ち望んでいた O/R Mapper だ。
> -- Sam Smoot（DataMapper の開発者）
>http://sequel.jeremyevans.net/

とあるDBの複数あるテーブルから他のDBの複数のテーブルにデータを移す、データパッチをあてる、みたいな不幸せな境遇がたまにあったりします。でSQLを書くのもアレなのでO/R Mapper でスクリプト書きたいなーと思ったりします。そういうときに手軽なrubyのsequelというgemを教えて貰ったのでメモしておきます。(名前がSQLの語源になったIBMのSEQUELと同じなのでアレですね)。rubyのORMだとrailsのactive recordを使う人が多いかと思いますが、sequelはarより楽チンな感じです。

#<i class="fa fa-file-o"></i> 用例
面倒なのでローカルにあるsqliteファイル `hoge.sqlite3`に接続する例にします。

```rb:sample_with_ar.rb
require 'sqlite3'
require 'active_record'
ActiveRecord::Base.establish_connection(:adapter  => 'sqlite3',:database => 'hoge.sqlite3')

class Item < ActiveRecord::Base
  has_and_belongs_to_many :warehouses
  self.table_name = "items"
end

class Warehouse < ActiveRecord::Base
  has_and_belongs_to_many :items
  self.table_name = "warehouses"
end

class WarehousesItems < ActiveRecord::Base
  belongs_to :item
  belongs_to :warehouse
  self.table_name = "Warehouses_Items"
end

#例）二ヶ月前以降に作成されたItemのレコードを関連するWarehouseと一緒に取得
items = Item.where(:created_at >= Date.today << 2).includes(:warehouses) 

#以下テーブル操作の文が続く
...
```

こんな感じのコードがあったとします。これをsequelで似たような感じで書くと下記のようになります。

```rb:sample_with_sequel.rb
require 'sqlite3'
require 'sequel'
DB = Sequel.sqlite('hoge.sqlite3')

#例）二ヶ月前以降に作成されたItemのレコードを関連するWarehouseと一緒に取得
items = DB[:items].where{created_at >= (Date.today << 2)}.join(:warehouse, :id => :warehouse_id)
#以下テーブル操作の文が続く
...
```

短く書けていい感じですね（まあarでもjoins使えばいいので例としては卑怯かも知れないですが）。構文（http://sequel.jeremyevans.net/rdoc/files/doc/cheat_sheet_rdoc.html ）はだいたいarと同じです。

#<i class="fa fa-comment-o"></i> 使いどころ
arの代用というわけでなく、シンプルなwebアプリでDBに接続したい場合やDB管理者がDBをいじる際（ごりごり生SQL書いてて死ぬ〜って場面）に強力なツールになると思います（自分でも「これをもっと早く知っていれば…」と思っています）。あと、何より使う始めにあたって必要な学習量が少ないので、すぐに使えるようなるのも利点だと思います。
埋め込みを他のパッケージから隠蔽する #golang


以下の記事にも書いているが，構造体型へ別の型を匿名フィールドとして埋め込む場合，型がパッケージ外に公開してあると，パッケージ外からその匿名フィールドにアクセスできてしまう．

* [インタフェースの実装パターン](http://qiita.com/tenntenn/items/eac962a49c56b2b15ee8)

たとえば，以下のように`Hoge`型に`*Fuga`型を埋め込んだ場合，`Fuga`型はパッケージ外に公開されているため，埋め込んだ`Fuga`型の値にもアクセスできてしまう．

```
type Fuga struct {
}

type Hoge struct {
    *Fuga
}
```

```
// パッケージ外からもアクセスできる
hoge := &Hoge{&Fuga{}}
hoge.Fuga = nil
```

また，パッケージ外に公開されていない型を埋め込んだ場合は，パッケージ外からアクセスできない．

```
type fuga struct {
}

type Hoge struct {
    *fuga
}

func NewHoge() *Hoge {
    return &Hoge{&fuga{}}
}
```

```
// パッケージ外からはアクセスできない
hoge := pkg.NewHoge()
hoge.fuga = nil
```

そこで，公開されている型を埋め込みたい場合は，以下のように`type`で新しく公開されない型を作ってやればよい．

```
type Fuga struct {
}

type fuga Fuga

type Hoge struct {
    *fuga
}

func NewHoge() *Hoge {
    return &Hoge{&fuga{}}
}
```

もちろん，埋め込む型が構造体型じゃなくても問題ない．

```
type stringer fmt.Stringer

type Hoge struct {
    stringer
}

func NewHoge(s fmt.Stringer) *Hoge {
    return &Hoge{stringer(s)}
}
```
Docker "No such id" 事件

うおぉ……

# 環境

* Debian wheezy 7.5
* Docker 1.0.1
* docker-py 0.4.0

# 何があった！

imageが消せない！しかも……Dockerデーモンが消そうとしているimage IDが指定したIDと違うぞ！！

＃イメージ的には https://github.com/docker/docker/issues/3258 の6番目のエラーに近いです。

```
(だいたいこんな感じで出る)
> docker rmi a327892260e0f7d68b005b09af5a283a26116f7a407c89367b45f89015b04f70
Error: No such id: 88c0d5abd83a3f30399bf95dcf7862e8e42bfeccda964015255da288b5223597
2014/08/08 11:06:52 Error: failed to remove one or more images
```

```
(docker.log)

[541b0979] -job image_delete(a327892260e0f7d68b005b09af5a283a26116f7a407c89367b45f89015b04f70) = ERR (1)
[error] server.go:1025 Error: No such id: 88c0d5abd83a3f30399bf95dcf7862e8e42bfeccda964015255da288b5223597
```

(´Д｀) サーバさーん、消そうとしてるイメージのID間違ってるよー……

ポイントは、自分が消そうとしたIDはinspectではちゃんと表示され、適切に存在しているようである、ということ。
一方間違ってるイメージIDは存在しません。

# どうした！

間違って判断されている側のイメージID、イメージ自体はリストされないんですが、それを参照しているcontainerは存在することに気付きました。ぺろ、これは……danglingなんとかかんとか！？ (参考: dangling pointer http://www.hotfix.jp/archives/word/2007/word07-34.html)

というわけでそのcontainerを消すと……

走り回る元気なdockerの姿が！ヾ(๑╹◡╹)ﾉ~

この挙動については上にも貼ったこのバグの説明群が参考になります: https://github.com/docker/docker/issues/3258

またしても華麗に現れ役に立つコメントを残していくDocker本家のちあのん(https://github.com/tianon)

    If you don't care about any of your exited containers and want them all dead, it's even simpler: docker ps -a -q | xargs docker rm. You'll get harmless errors for containers that are currently running, and the rest will be removed.

あ、はい。
CloudWatch Logs Agent の設定について調べたことのまとめ

CloudWatch Logs Agent の設定について、調べたことをまとめました。

## はじめに

Agentの設定ファイルは、`/var/awslogs/etc/awslogs.conf`にあります。

/var/log/messagesをログ送信するだけの、簡単な設定ファイルはこんな感じです。
とってもシンプルですね。

```ini
[general]
state_file = /var/awslogs/state/agent-state

[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages
```

## log_stream_name で使えるプレースホルダー

log_stream_name には、{instance_id}の他に、 {hostname} と {ip_address} が使えます。

ベタで書かなくていいのは嬉しいですね。


## file にwildcardを使う

`file = /var/log/messages*`の様にワイルドカードで指定することが可能です。

ファイル名が日付でインクリメントされるようなログをハンドリングしたい場合に有効ですが、
性質が違うログ(access_log_80, access_log_443)を誤ってハンドリングするかもしれないので注意が必要です。


> Only the latest file is pushed to CloudWatch Logs based on file modification time.

指定されたパスに該当するファイルが複数あっても、
ログ送信の対象は、**mtimeがもっとも新しいファイル**になります。


## datetime_formatを指定して、Creation Timeの表示を変える

datetime_formatには、ログから時刻を抽出する際のフォーマットを指定します。

datetime_formatが正しく指定されている場合、
Web Consoleで確認できるCreation Timeに、ログから抽出した時刻を表示させることができます。

datetime_formatが指定されなかったり、Syntaxが間違っていたり、
Syntaxが正しくてもログから時刻が抽出できない場合は現在時刻になります。

生ログの時刻を`datetime_format`でパースできないと現在時刻が使われるようです。


**【緩募】**
一点困ったのは、フォーマットの中にUnix Time Stampの指定する方法がわかりませんでした。
`/var/log/audit/audit.log`などで利用したいのですが、誰か知っている方いらっしゃったら教えて下さい。


## 参考
http://aws.typepad.com/aws_japan/2014/07/cloudwatch-log-service.html
https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/AgentReference.html
日本語ドメイン or クエリ付きURLを変換する



日本語ドメインやクエリに含まれる日本語を簡単に変換してくれるNSStringカテゴリを見つけました。

:octocat: [Wevah/Punycode-Cocoa](https://github.com/Wevah/Punycode-Cocoa)

2つのファイル `NSStringPunycodeAdditions.h/m` をプロジェクトの中に入れ `#import "NSStringPunycodeAdditions.h"` で読み込みます。

```objc
    // ホスト例1 .com
    NSString *target1 = @"お名前.com";
    NSLog(@"%@: %@", target1, [target1 IDNAEncodedString]);
    // => お名前.com: xn--t8jx73hngb.com

    // ホスト例2 .jp
    NSString *target2 = @"総務省.jp";
    NSLog(@"%@: %@", target2, [target2 IDNAEncodedString]);
    // => 総務省.jp: xn--lhr645fjve.jp

    // クエリ付き例
    NSString *target3 = @"https://www.google.co.jp/search?q=日本語";
    NSLog(@"%@: %@", target3, [target3 encodedURLString]);
    // => https://www.google.co.jp/search?q=日本語: https://www.google.co.jp/search?q=%E6%97%A5%E6%9C%AC%E8%AA%9E
```

日本語が含まれるホストの場合は`IDNAEncodedString`、クエリに使われる日本語には`encodedURLString`を使えばいいようです。便利ですね。

ちなみにデコードは以下のように。

```objc
    NSString *encodedTarget1 = @"xn--t8jx73hngb.com";
    NSLog(@"%@", [encodedTarget1 IDNADecodedString]);
    // => お名前.com
    
    NSString *encodedTarget2 = @"xn--lhr645fjve.jp";
    NSLog(@"%@", [encodedTarget2 IDNADecodedString]);
    // => 総務省.jp
    
    NSString *encodedTarget3 = @"https://www.google.co.jp/search?q=%E6%97%A5%E6%9C%AC%E8%AA%9E";
    NSLog(@"%@", [encodedTarget3 decodedURLString]);
    // => https://www.google.co.jp/search?q=日本語
```

PR: 現在iOS8に向けたiPhoneブラウザを開発中です！ 初アプリになるので無事に公開できたら是非一度試してみてください :bow:
[状態マシン図] Latch Stateパターン

これは写真プリンタの状態マシンである。

![photo_printer.png](https://qiita-image-store.s3.amazonaws.com/0/11188/fdc976fc-a06c-9149-81de-00e4f9d1cb34.png)

写真プリンタでは、印刷中に電源オフ要求があっても、インクや紙を無駄にしないよう、すぐには電源オフ処理をしないで、いま印刷している写真を印刷終わってから電源オフ処理を始めたい、という要求がある。

待機中は電源オフ要求があればただちに電源オフ処理を始める。

印刷中は電源オフ要求があったら下の領域でラッチして覚えておき、印刷が終わったところでラッチを調べ、電源オフ要求があったならば、電源オフ処理を始める。

このように、何かをやっている最中に、何かが起きることを覚えておきたい、というときに、直交合成状態を使うことができる。

この形のことを Latch State (ラッチステート)パターンと言う。リアルタイムUMLワークショップという本の中で、ブルースダグラスさんが命名している。

リアルタイムUMLワークショップ [大型本]
ブルース・ダグラス (著), 鈴木 尚志 (翻訳)
[http://www.amazon.co.jp/dp/4798121118/](http://www.amazon.co.jp/dp/4798121118/)
Markdownで表のセルの背景に色をつける方法はないのでしょうか？

表の中の１つのセルの背景に色をつけたいのですが、方法が見つかりません。何か方法はないのでしょうか？

|路線 |Webカラー(16進) |RGB値(10進) |HSV値(10進) |
|:-----------|:------------|:------------|:------------|
|{:bgcolor=#f39700} 銀座線オレンジ Ginza Line Orange|f39700 |243,151, 0 |37,100, 94 |
| {:bgcolor="orange"}銀座線オレンジ Ginza Line Orange|f39700 |243,151, 0 |37,100, 94 |
|{style="background-color: #f39700;"} 銀座線オレンジ Ginza Line Orange|f39700 |243,151, 0 |37,100, 94 |
<Chrome extension>ブラウザキャッシュを疑う（manifest.json）

### ＜問題・課題＞
* manifest.jsonを修正した後にリロードしても更新されない　ってことがよくある
* アイコン画像の更新であればキャッシュをすぐ疑うことができるが、permissionsやbackgroundで読み込むjsファイルの変更とかだとたまに気づかない（自分だけかな・・）


* * *
### ＜解決方法＞
* ブラウザキャッシュをクリアして再度実行してみる（※リロードではない）
Railsのルーティングを読みやすく作っていく


Railsアプリケーションのルーティングは、`config/routes.rb`1ファイルで最初は開発を始めると思います。
ただ、サービスを運用していくとルーティングは膨らみ、メンテナンスコストも馬鹿になりません。
そのため、ルーティングの設定をできるだけメンテナンスしやすく作っておくことでそのコストを下げようという試みです。

Railsのルーティングは、`config/routes.rb` がルーティングの設定ファイルにデフォルトで指定されています。
ただ、これは変更可能ですし、複数のファイルに分割もできます。
昨今のアプリケーションの用途は、Web、native(iOS、Android)、APIサーバ、と多岐にわたるので、

```
config/routes.rb
config/routes/api/v1.rb
config/routes/api/v2.rb
config/routes/web.rb
config/routes/admin.rb
...
```

のように用途や機能に応じてファイルを分割しておくことで、あとから運用していく人がわかりやすくなり、メンテナンスコストを軽減できます。

Rails3の場合は、`config/application.rb`で

```ruby
module TheApplication
  class Application < Rails::Application
    ...
    config.paths["config/routes"] += Dir[Rails.root.join("config/routes/**/*.rb")]
    ...
  end
end
```

Rails4の場合は、

```ruby
module TheApplication
  class Application < Rails::Application
    ...
    config.paths["config/routes.rb"] += Dir[Rails.root.join("config/routes/**/*.rb")]
    ...
  end
end
```

と設定します。