OmniAICreator/Qiita-1.07M huggingface dataset:
Fluent Dashboard＋Norikraでリアルタイムダッシュボードを7分で作る話 #dockerjp


## Fluent Dashboardって？
[Fluent Dashboard](https://github.com/kazunori279/Fluent-Dashboard)は、Fluentdで集計したデータをグラフやテーブルで表示できるGoogle Spreadsheet。[fluent-plugin-https-json](https://github.com/jdoconnor/fluentd_https_out)を使ってイベントログを送ると、以下のようにリアルタイムにデータを表示してくれる。

![Fluent Dashboard](http://i.giflike.com/sLgJtW9.gif)

## 使い方

詳しい使い方は[README](https://github.com/kazunori279/Fluent-Dashboard/blob/master/README.md)にある通りで、Spreadsheetをコピーして公開設定等をポチポチするだけで準備完了。3分もかからない。あとはfluent-plugin-https-jsonのログ送信先URLとしてFluent SpreadsheetのエンドポイントURLを指定すれば動き始める。

### 集計ログの表示向け
任意のFluentdログを受け取ってグラフやテーブルを描けるけど、大量のログを直接受け取ることはできない。集計後のログを3秒に1回ほどの割合で受け取って表示する、といった使い方になる。ログを受け取ってからおよそ1秒程度で描画される。

### Fluentのタグ名でグラフを自動描画
例えば`foo`というタグが付いたイベントログを送ると、同名のシートが作成されて一行ずつシート最上部に挿入されていく。デフォルトでは1シート最大100件保存できて、保存件数は設定で変更可能。ログは古いものから自動的に削除される。つまり、ログのアーカイブ用ではなく主に表示用である。

さらに、タグ名が以下のいずれかで終わる場合はグラフを描いてくれる。

* `_AREA`, `_BAR`, `_COLUMN`, `_LINE`, `_SCATTER`, or `_TABLE`
* `_AREA_STACKED`, `_BAR_STACKED` or `_COLUMN_STACKED`

`_STACKED`が付くと、1行内の各フィールドの値を積み重ねたグラフになる。

### どんな仕組み？

Google SpreadsheetのJavaScriptマクロであるGoogle Apps Scriptには`doGet`と`doPost`という外部からのhttpsリクエストを受け付けるハンドラがあって（！）、それで受信したJSONをApps Scriptコードでシートに挿入する仕組み。俺はスプレッドシートを使ってると思ったらいつのまにかWebサーバを書いてた。何を言ってるのか（略

## nginx > Norikra > Dashboard 構築まで7分
もともとは[Norikra](https://github.com/norikra/norikra)のダッシュボードとして作ったので、Norikraと連携して簡単にダッシュボードを構成するための[DockerfileとDockerイメージ](https://github.com/kazunori279/dockerfiles/tree/master/fluentd-norikra-gas)も作成した。デモとして、

* Google Compute Engineのインスタンスを3つ作る
* Norikraサーバーを立てる（[Dockerfile](https://github.com/kazunori279/dockerfiles/tree/master/fluentd-norikra-gas)）
* nginxサーバーを立てる（[Dockerfile](https://github.com/kazunori279/dockerfiles/tree/master/fluentd-nginx)）
* Apache Benchクライアントを立てる（[Dockerfile](https://github.com/kazunori279/dockerfiles/tree/master/ab)）
* アクセスログからreq/sグラフ、dstatからcpuグラフを描くNorikraクエリを登録する
* Apache Benchから3000 req/sくらいの負荷をかける
* Fluent Dashboardにグラフが表示される

という作業を7分間で済ませているところをYouTubeに載せてみた：

![Screen Shot 2014-04-11 at 3.24.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/7fd9a0ec-5a33-050f-f133-48d19085d6eb.png "Screen Shot 2014-04-11 at 3.24.12 PM.png")

[Fluent Dashboard demo on YouTube](https://www.youtube.com/watch?v=VPNMe4znWDo)

このデモと同じ作業を再現する手順書は[ここ](https://github.com/kazunori279/Fluent-Dashboard/blob/master/demo_instruction.md)に載せておいた。

このデモに出てくるように、Debian + DockerのイメージをGCEに登録しておけば、インスタンス作成後に`sudo docker run`一発でフルスタック構築完了！　になるのでとてもラクだ。GCE+Dockerが快適すぎる... #ステマ

### リクエスト受信からグラフ表示まで10秒
このダッシュボードはリアルタイム性を追求したので、nginxにHTTPリクエストが届いてから10秒ほどでグラフに反映できている。ゲームやキャンペーンサイトのイベント開始時など、今すぐどうなってるか見たい！　って人はこういうダッシュボードがほしいはず。

### そしてlambdaへ
ElasticsearchじゃなくてなぜNorikraか？　それは[lambda architecture](http://goo.gl/RwWPdj)を作りたいからだ。リアルタイム分析部分をNorikra等のオンメモリ系にしておけば、そもそもログを保存しないので、ログ分量が巨大化して重くなったりすることはない。巨大データのハンドリング性とリアルタイム性を両立させるにはこの方向かなと思う。Elasticsearchが重くて困る、過去1年の集計と過去1分の集計の両方をリアルタイムで見たい、といった人にはぴったりなソリューションになるはず。

1〜2週間ほどの内にNorikra+BigQueryのラムダを完成させて公開したいので乞うご期待...!
GithubでPushされたタイミングでブランチをJenkinsからゴニョゴニョする

GithubにはWebHookっていう便利な奴があって、pushされたタイミングでPOSTのリクエストを送れる。

Githubから直接Jenkinsを叩くJenkins（Github plugin)とか(Git plugin)とかもあったけど、ブランチを指定してゴニョゴニョができなそうだったのでWebHookを使ったよ。

## JKじゃなくてJQ
WebHookからJenkinsのAPI叩くとPayloadsってパラメータにJSONが入ってくるので、そいつを解析してブランチ名を取得します。

ここで問題になるのが、どうやってJSONをパースするか。node.js使うとかPython使うとかいろいろあると思いますが、Shellで完結したかったので今回はJQを使いました。

http://stedolan.github.io/jq/download/

そして今回対象のJenkinsは複数台のサーバでクラスタ化されてるため、インストールするのも面倒なのでこのjqコマンドを対象のプロジェクトに保存しちゃいました☆

jqはじまってる！！


## Jenkins側の準備
まずはJenkins側でWebHookを受ける設定をします。

### ビルドのパラメータ化
前述しましたが、WebHookはpayloadというパラメータでJSONを送ってくるので、そのパラメータをうける口を用意します。


ビルドのパラメータ化から文字列を選び、名前:payload、デフォルト値:none等と設定しておきます。

### gitの設定
Jenkinsのgitプラグインは入ってるものとして、gitのレポジトリの設定をします。

このときのポイントはブランチは適当な存在するものにするということです。後ほど、Jsonを解析してブランチを切り替えますが、この時点では適当に設定しておきます。masterでもなんでもいいです。

### ビルドトリガー
ビルドトリガーの設定でリモートからビルドにチェックを入れます。これで外部からAPI経由でビルドできるようになります。認証トークンは適当な文字列を入れましょう。

すると入力欄のしたにサンプルURLが出てくると思います。そのbuildWithParametersのほうを使います。
```
JENKINS_URL/job/vcard_static_code_analysis/buildWithParameters?token=TOKEN_NAME
```
TOKEN_NAMEのところに先ほど設定した認証トークンを入れます。これを後ほどgithub側に登録するのです。

### 前処理
じっさいにゴニョゴニョする前にshellで前処理を行います。

具体的にはJSONをパースして、ブランチを切り替えるという処理です。

```shell-session
#!/bin/bash

echo "the build start! The payload is $payload"

chmod 755 jq

git fetch origin

BRANCH=`echo $payload| ./jq -r '.ref'|sed "s/refs\/heads\///"`

echo "branch is $BRANCH"
git reset --hard origin/${BRANCH}
```
こんな感じです。

これで、前処理が終わったらテストなり静的コード解析なりなんなりとやっちゃってください。

特定のブランチだけ実行するとかもこの時点でif文でも書いてあげれば可能ですね！！


## github側の設定

あとはgithub側の設定だけです。

githubのレポジトリ設定からWebhooks & Servicesを選択。
Add webhookで先ほどのJenkinsで出力されたURLを設定します。Payload versionはjsonを選択します。

これで完成！！！

# さーだれかPushしてこいや！！！！

#### 参考サイト
http://hi-king.hatenablog.com/entry/2014/04/03/164329

こっちのがわかりやすいかもorz
作業メモ：vagrant + chef-solo + EC2の接続で小ハマり

#前提
* VagrantからEC2インスタンスを起動して、chef-soloでプロビジョニングしたい

#はまったこと

* EC2の起動まではVagrantfile設定さえできれば良いので意外と失敗しない。
* vagrant provisionでなぜかrsyncに失敗している様子。(mkdir -p '/vagrant'失敗とか）
* さらにEC2側でchefのインストールをどうするのかも問題。gemでインストールしてもうまく認識されなかった。

#解決策
* EC2インスタンスの/etc/sudoersの''requiretty''を''!requiretty''に変更する。
* rootでcurl -L https://www.opscode.com/chef/install.sh | bashを実行。
* このページにいい情報があった。頑張ればVagrantfileの設定で全部できると。http://chiastolite.github.io/blog/2013/05/10/vagrant-aws/
knife soloでclient秘密鍵無しでknifeコマンドを使いたい

kinfe solo環境作ってGoogleセンセーにお伺い立てながら設定作っていると、`kinfe solo init ～`した後に
`kinfe environment create hogehoge`とか`knife node create fugafuga`とかやると、
エディタで編集した後に、

```
ERROR: Your private key could not be loaded from /etc/chef/client.pem
Check your configuration file and ensure that your private key is readable
```

と怒られて、折角入力した内容が消えていたりしませんか？
……私は何度もこれで入力内容がパァになりました。

「そもそもsoloなのにクライアント鍵聞いてくるってどういう事よ！？」

と思っていましたが、ひょんなことから発見しました。

***-z オプション(=ローカル)を付ける！！！***

これだけで非常に幸せになれました。

```
$ knife environment create hoge -z
$ knife node create fuga -z
$ kinfe role create mugya -z
```

これで[ナントカ].rb を直接編集したりしなくて済みますね！

※ 例によってこれで半日を棒に振りました…orz
AppleScriptが便利そうなので色々メモしてみる


##準備

Macには標準で **AppleScriptエディタ** が付属しているので、それを使います。


##所感

実際に触れてみて、とても自然言語に近いスクリプトだなーという印象を持ちました。
知らずに見たら普通に英文にしか見えません。

例えば、ファイルアクセス。

```applescript
-- ファイルへの書き込み
set filePath to "Macintosh HD:Users:username:anyFile.txt"
set fp to open for access file filePath with write permisson
try
	write "This is a sample text." to fp
on error msg number n
	close access fp
	error msg number n
end try
close access fp
```

インデントあたりがプログラム感を出してますが、それ以外は普通に英文です。


##スクリプトを書く

###変数

変数は特に宣言をせず、いきなり代入できます。

```applescript
-- 文字列 "hoge" を変数 VAL_NAME に代入
set VAL_NAME to "hoge"
```

###ハンドラ（サブルーチン）

AppleScriptではサブルーチンのことをハンドラと呼ぶようです。
なので`on`で定義します。

```applescript
on sayHello()
	-- 画面にダイアログを表示
	display dialog "Hello!"
end
```

###コメント

1行コメントは`--`、ブロックコメントは`(* *)`を使います。

```applescript
-- ここは1行コメント
set one to 1

(*
ここは
ブロック
コメント
*)
set two to 2
```

###スクリプトオブジェクト

AppleScriptはプロトタイプベースのオブジェクト指向言語のようです。なのでオブジェクトを定義できます。

```applescript
script Animal
	property age : 0
	property name : "anyName"

	-- 通常のメソッド
	on say()
		display dialog "My name is " & name
	end say

	-- 引数付きメソッド
	on cry(word)
		display dialog "Cry " & word
	end cry

	-- ラベル式引数
	to hello to val
		display dialog "Hello " & val
	end hello
end script

-- 実行
tell Animal to say              -- => "My name is anyName"
tell Animal to cry("wow")       -- => "Cry wow"
tell Animal to hello to "World" -- => "Hello World"
```

##アプリにメッセージを送る

スクリプトオブジェクトの実行を見てもらうと`tell`を使っているように、オブジェクトに対してメッセージを送る、というのが使うイメージです。
なので、なにがしかのアプリに対して処理をする場合も、アプリ名を名指ししてメッセージを送る、というイメージで実装します。

```applescript
tell application "iTunes" to play the playlist named "トップ 25"
```
pip installにおいてclang: error: unknown argument: '-mno-fused-madd'


Xcode5.1におけるclangの更新によって起こるエラー(よく知らないで書いてる)

```
$ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install SomePackage
```

とすれば実行できるとのこと。

参考: http://rn102.hatenablog.com/entry/2014/03/24/150734
Rails 4.0.4 -&amp;gt; 4.1.0 Update メモ


## まずはこれを読もう
- "Ruby on Railsアップグレードガイド" https://github.com/hachi8833/docrails/blob/develop/guides/source/ja-JP/upgrading_ruby_on_rails.md

## bundle update

- このあたりを新しくして `bundle update`
- （毎回使いたいバージョンの Rails で `rails new` して確認してみるのがいいと思います）

```ruby
gem 'rails', '4.1.0'
gem 'sass-rails', '~> 4.0.3'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0',          group: :doc

# gem 'ransack'
gem 'ransack', github: 'activerecord-hackery/ransack', branch: 'rails-4.1'
gem 'polyamorous', github: 'activerecord-hackery/polyamorous'

```

## rake rails:update

`rake rails:update` するとファイル毎に更新するかどうか聞かれるところを `Y` を選択して、diff を見ながら、いい感じに編集して commit。

## config/secrets.yml
- `config/initializers/secret_token.rb` の内容を `config/secrets.yml` に移して、secret_token.rb を削除

## その他

- アプリ内部で使ってる gem とかの API が変わってたりしたところを対応
 - メソッドないよ、とか怒られたりしたので、gem のソース見て、ああ、今はこうするのね〜みたいなとこを直す

## テストまわしつつ、ローカルで動かす

### libyaml を最新に
libyaml 古いので新しくしよう、みたいなメッセージが表示されて、大変うるさいので、

`brew upgrade libyaml`

で、libyaml-0.1.6 にした。（`brew update` もしないとダメかも）


### フラッシュメッセージが表示されない

- すごいテストが落ちててウヒーって...言いながら調べてたらフラッシュメッセージが表示されてないって。
- "James Brooks : Ruby on Rails Flash messages with Bootstrap" https://coderwall.com/p/jzofog
- :notice とかを文字列にしました。

### そして...

- spec 通らない...けど、ひとまずダンプしておきます。
CreateJS（EaselJS）でタイマを管理するTickerクラスの使い方


Tickerを起動してステージを更新するくらいならテンプレでいろんなとこに情報があるけど、それ以外の使用方法についてはあまりないのでまとめる。最終的に公式ドキュメントの訳みたいになってしまいました。

# Tickerクラス
EaselJSに含まれているクラスで、タイマを管理している。一定間隔でなにか処理したいときに使う。

内部的には`setTimeout`を一元管理している。ブラウザが対応していれば`requestAnimationFrame`を使うこともできる。

FPSを設定できたりするので、このクラス使ってゲームループなんかを作れる。

## なぜタイマを一元管理するのか？
余談ですが、タイマを一元管理する理由をざっと書いておく。ちなみにJavaScriptでタイマの一元管理はよく使われるテクニックのようで、僕自身は[JavaScript Ninja](http://www.amazon.co.jp/JavaScript-Ninja%E3%81%AE%E6%A5%B5%E6%84%8F-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%9F%A5%E8%AD%98%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-Programmers%E2%80%99-SELECTION/dp/4798128457)を読んで知りました。

複数タイマを使うと以下のようなことが問題になる。

- タイマへの参照を管理する必要がある
- ガベージコレクションが発生が多くなってパフォーマンスに影響する


# 使い方
## メソッド
### addEventListener
tickイベントにリスナーを登録する。タイマが初期化されていなかったら初期化される。初期化されるとタイマが起動する。

```Javascript
createjs.Ticker.addEventListener('tick', handleTick);
function handleTick() {}
```

Stageのupdateだけしたい場合は、createjs.Stageのインスタンスを渡すだけでいい。描画だけしたい場合によく使われる。

```Javascript
var stage = new createjs.Stage('canvasId');
createjs.Ticker.addEventLister('tick', stage);
```

### removeEventListener
addEventListernerがリスナーを返してくれるので、それを使ってTickerからリスナーを削除できる。

```Javascript
var listener = createjs.Ticker.addEventLister('tick', handleTick);
function handleTick() {};
createjs.Ticker.removeEventListener('tick', listener); // 削除
```

Stageを渡してリスナー追加した場合

```Javascript
var stage = new createjs.Stage('canvasId');
createjs.Ticker.addEventLister('tick', stage);
createjs.Ticker.removeEventListener('tick', stage); // 削除
```

### removeAllEventListeners
リスナーを全部削除

```Javascript
createjs.Ticker.removeAllEventListeners('tick');
```

### reset
リスナーを全部削除してタイマを止める

```Javascript
createjs.Ticker.reset();
```

### setFPS
FPSを設定

```Javascript
createjs.Ticker.setFPS(12); // 12FPSに設定
```

## プロパティ
### timingMode

ざっくり言うと`setTimeout`を使うか`requestAnimationFrame`を使うかを指定するプロパティ。
以下の値を指定できる。デフォルトは`createjs.Ticker.TIMEOUT`

- `createjs.Ticker.RAF`
フレームレートを無視して`requestAnimationFrame`のハートビートに従う。`getTime`かtickイベントオブジェクトの`delta`を使って時間ベースでプログラミングする必要がある。`requestAnimationFrame `が使えない場合は`createjs.Ticker.TIMEOUT`にフォールバックされる。

- `createjs.Ticker.RAF_SYNCHED`
`requestAnimationFrame`を使うが、フレームレートに従う。TIMEOUTよりフレーム間のバラつきが大きいが、`requestAnimationFrame`の恩恵を受けながら、時間ベースのプログラミングをしなくてもいい。`RAF`と同様に`requestAnimationFrame `が使えない場合は`createjs.Ticker.TIMEOUT`にフォールバックされる。

- `createjs.Ticker.TIMEOUT`
フレームレートに従う。内部的には`setTimeout`で制御される。

場合によるけど、`RAF_SYNCHED`使っておけばいいんじゃないかと

```Javascript
createjs.Ticker.timingMode = createjs.Ticker.RAF_SYNCHED;
```

## tickイベントオブジェクト
tickイベントのハンドラでイベントオブジェクトを受け取れる。

以下はイベントオブジェクトのプロパティ（tick固有のやつだけ）

- `paused` Boolean
Tickerがポーズ中かどうか

- `delta` Number
前回のtickイベント発生から経過した時間（ms）

- `time` Number
Tickerが初期化されてから経過した時間（ms）

- `runTime` Number
timeからポーズ中の時間を引いた時間（ms）

## ちょっとしたこと
### 追加されているリスナーを確認
登録されているハンドラの配列が取得できる。これでちゃんとハンドラが消えてるかを確認したりしてます。

```Javascript
createjs.Ticker._listeners.tick
```
NSURL のブックマークの細かい挙動についてのメモ

同一のファイルを指す fileURL と fileReferenceURL から作ったブックマークは等しい：

```objc
NSURL *URL = [NSURL fileURLWithPath:...];
NSData *b1 = [URL bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
NSData *b2 = [URL.fileReferenceURL bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];

NSAssert([b1 isEqual:b2], @"");
```

同一のファイルを指す URL について、 security scope がないものとあるものから作ったブックマークは等しくない（後者のほうがサイズが大きい）。しかし、それらのブックマークを解決して得た security scope つき URL は等しい：

```objc
NSURL *URL = [NSURL fileURLWithPath:...];
NSData *b1 = [URL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];

NSURL *secURL1 = [NSURL URLByResolvingBookmarkData:b1 options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:NULL error:NULL];
NSData *b2 = [secURL1 bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];

NSAssert(! [b1 isEqual:b2], @"");

NSURL *secURL2 = [NSURL URLByResolvingBookmarkData:b2 options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:NULL error:NULL];

NSAssert([secURL1 isEqual:secURL2], @"");
```

その他の挙動をチェックするときのためにテスト用アプリを作っておいた： https://github.com/uasi/BookmarkTest
emacsで生のnroffファイルを読むとき


ソースと一緒にnroffで書かれたマニュアル(hoge.8 みたいな名前のファイル) が配布されていることがあるが、`man`コマンドのパスを通して表示するのは面倒。

emacsなら普通にバッファに開いて nroff-view (`C-c C-c`) を実行すればきれいに整形される
開発とかに便利なn個のChrome Extension

わりとよく使うものリスト


## [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ja)
cookieの確認、編集、削除等

## [Dev HTTP Client](https://chrome.google.com/webstore/detail/dev-http-client/aejoelaoggembcahagimdiliamlcdmfm?authuser=2)

任意のHTTPリクエストを生成

## [github merge caution](https://chrome.google.com/webstore/detail/github-merge-caution/nimelepbpejjlbmoobocpfnjhihnpked)
[wip]なpull-requestをうっかりマージしないようにする

## [Show Title Tag](https://chrome.google.com/webstore/detail/show-title-tag/pkbffbhglicfngmppdlpmpblfgnkdgio)
長いタイトルをページ内に表示

## [JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc)
jsonを見やすく

## [jquery-injector](https://chrome.google.com/webstore/detail/jquery-injector/indebdooekgjhkncmgbkeopjebofdoid)
ページにjqueryをinjectする

## [Google Chrome to Phone 拡張機能](https://chrome.google.com/webstore/detail/google-chrome-to-phone-ex/oadboiipflhobonjjffjbfekfjcgkhco?hl=ja)
PCで見ているページをAndroidに飛ばす


## [earthquake Notify(緊急地震速報)](https://chrome.google.com/webstore/detail/earthquake-notify%E7%B7%8A%E6%80%A5%E5%9C%B0%E9%9C%87%E9%80%9F%E5%A0%B1/bcepdinmmfbpheociaalfkhbcpekbdbc?hl=ja)
通知がきたらとりあえずtwitterを見る

## [Looks Tiqav To Misawa](https://chrome.google.com/webstore/detail/looks-tiqav-to-misawa/jdidcgkdggndpodjbipodfefnpgjooeh)
textareaで`LGTM`, `tiqav`, `misawa`の画像がmarkdown形式で自動補完されるようにする

## [Markdown Linker](https://chrome.google.com/webstore/detail/markdown-linker/kgadgjmlofjccpefhdagbonmohjknlll)
リンク、ページ、画像等を右クリックでmarkdown形式でクリップボードにコピー
この記事を作るのにも使った


===

随時更新していきます :)
IRCのメッセージに色をつけたりして目立たせる

* IRCで重要な情報を流す場合などに埋もれてしまわないように、メッセージを目立つようにする
* この辺が参考になった
 * http://d.hatena.ne.jp/hirose31/20060824/1156400991
 * http://d.hatena.ne.jp/hirose31/20060824/1156400991

### こんな感じ(結果)
 ![irc.png](https://qiita-image-store.s3.amazonaws.com/0/22341/95608018-acd0-d671-c4e0-48caea9aa22b.png)

## メッセージの装飾
* メッセージに以下のコードを埋め込むことで装飾が可能

| 装飾      | コード
|:---------|----------
| 太字      | ^B (0x02)
| 下線      | ^_ (0x1f)
| 反転      | ^V (0x16)
| 装飾クリア | ^O (0x0f)

### 色を弄る
* さらに文字色、背景色を変更可能
* コードは ^C (0x03)
* ^C文字色[,背景色]テキスト^C という書き方
* 例: 文字色yellow、背景pink
 * \x0308,13hogehoge\x03
 * で
![irc2.png](https://qiita-image-store.s3.amazonaws.com/0/22341/1130432d-93fc-ebcc-c77c-871ef2dc2f15.png) のように表示される

| コード | 色
|:--|:--
| 0 | white
| 1 | black
| 2 | blue (navy)
| 3 | green
| 4 | red
| 5 | brown (maroon)
| 6 | purple
| 7 | orange (olive)
| 8 | yellow
| 9 | light green (lime)
| 10 | teal (a green/blue cyan)
| 11 | light cyan (cyan) (aqua)
| 12 | light blue (royal)
| 13 | pink (light purple) (fuchsia)
| 14 | grey
| 15 | light grey (silver)
ufwを使って簡単にファイアウォールを設定する

## ufw（uncomplicated firewall）のインストール

```
$ sudo apt-get install ufw
```

### CentOSにインストール

http://qiita.com/yoh-nak/items/bd7e7d717bf6450c7d33

## ufwの使い方

```
$ sudo ufw allow 22
$ sudo ufw allow 25
$ sudo ufw allow 80
```

```
$ sudo ufw deny 22
$ sudo ufw deny 25
$ sudo ufw deny 80
```

```
$ sudo ufw allow 22/tcp
$ sudo ufw allow 25/tcp
$ sudo ufw allow 80/tcp
```

```
$ sudo ufw deny 22/tcp
$ sudo ufw deny 25/tcp
$ sudo ufw deny 80/tcp
```

```
$ sudo ufw reload
```

### ファイアウォールを無効にする

```
$ sudo ufw disable
```

### ファイアウォールを有効にする

```
$ sudo ufw enable
```

### 全ての通信を許可する

```
$ sudo ufw default ALLOW
```

### 全ての通信遮断する

```
$ sudo ufw default DENY
```


### ufwの設定を確認する

```
$ sudo ufw status
```

### その他

```
sudo ufw limit 22

sudo ufw from 192.168.XXX.XXX/24 to any port 3128
sudo ufw from 192.168.XXX.XXX/24 to any port 53/udp
```
OpenCV Quiz 5題 簡潔に書こう編

OpenCV C++でコードを書くときに油断すると冗長な書き方になるので注意が必要。なんとなくクイズ形式にしてみる。

小難しいアルゴリズムの他にも画像をちょこちょこ加工する作業もあったりして。そういうところで冗長な書き方をされると無駄に頭を使うので。

今回の大体の問題は自分でポインタのループを書くのが高速だと思います。可読性優先の書き方の話です。

ところどころC++11を使っています。コメントやフォークでの別解歓迎。他の問題は新規投稿で。

# 出題編

## A-1 画像(CV_32F)の0未満の要素0にしよう

## A-2 画像(CV_32F)の1より大きい要素1にしよう

## A-3 BGR画像(CV_8UC3)のBとRを0にしよう

## A-4 グレイスケール画像(CV_8UC1)をGチャネルとしたBGR画像(CV_8UC3)を作ろう

## A-5 画像を反時計回りに90度、180度、270度回転させよう

ここでいう回転は画像のサイズごとの回転です。90度、270度の時は高さが幅に、幅が高さに入れ替わります。

# 解答編

## A-1 画像(CV_32F)の0未満の要素0にしよう

```cpp
// cv::threshold() を使う方法もあるが、こちらの方が簡潔
// CV_8Uの場合は発生しないシチュエーションだが、CV_32Fで線形フィルタの結果を切り落としたいような場合は有効。
cv::Mat out = cv::max(in, 0);
```
## A-2 画像(CV_32F)の1より大きい要素1にしよう

```cpp
// Q1と同様の考え方
// CV_8Uなどでも切り上げ、切り落としにcv::threshold()ではなくcv::max()、cv::min()を使うのは書くのが楽なのでおすすめ。
cv::Mat out = cv::min(in, 1);
```

## A-3 BGR画像(CV_8UC3)のBとRを0にしよう

```cpp
// bitwise_and()を使用する。
cv::Mat out = cv::Scalar(0,255,0,0) & in;
```

## A-4 グレイスケール画像(CV_8UC1)をGチャネルとしたBGR画像(CV_8UC3)を作ろう

フィルタの結果の可視化などで使うことが多い。

```cpp
cv::Mat out(in.size(), CV_8UC3);
cv::merge( std::vector<cv::Mat>(
  {cv::Mat::zeros(in.size(), CV_8UC1), in, cv::Mat::zeros(in.size(), CV_8UC1),}),
  out);
```

## A-5 画像を90度、180度、270度回転させよう

cv::flip()と行列の転置を使う。

```cpp
cv::Mat out;

if(degree90)
{
  cv::flip(in.t(), out, 0);
}
if(degree180)
{
  cv::flip(in, out, -1);
}
if(degree270)
{
  cv::flip(in.t(), out, 1);
}

```
無料ダイナミックDNS ieServerの使い方

ieserver登録画面
http://ieserver.net/entry.html

ieserverログイン画面
http://ieserver.net/login.html

```bash
cd ~
wget http://ieserver.net/ddns-update.txt
```

```bash
cd /usr/local
sudo mkdir ddns
sudo cp ~/ddns-update.txt /usr/local/ddns/ddns-update.pl
```

```bash
sudo nano ddns-update.pl
```

```pl:ddns-update.pl
#!/usr/bin/perl

# ieServer.Net 専用 DDNS IP アドレス更新スクリプト - ddns-update.pl
# 作成者：山本恭弘@Agora Inc.　作成日:2004/03/24
#
# 回線割り当てグローバルIPアドレスを確認し、変化があれば新IPアドレスを
# DDNSに登録。当コマンドを一定の間隔で実行し、IPアドレスの変化を監視＆
# 更新処理する。利用には perl wget cron が利用可能である必要あり。
#
# 回線に割り当てられた IPアドレス は http://ieserver.net/ipcheck.shtml
# へのアクセスによって確認。
#
# cron にて当コマンドを等間隔で実行し、回線IPを確認。変化があればDDNSに
# IPアドレスを登録。DDNSサーバーへの負荷軽減の点から実行間隔は10分以上と
# すること。
# crontab設定例(/usr/local/ddns/ddns.plにスクリプトを置き10分間隔で実行)
# 5,15,25,35,45,55 * * * * /usr/local/ddns/ddns-update.pl

# 以下２ファイルの配置ディレクトリは好みに応じ設定
# 1. 設定IPアドレスワークファイル
$CURRENT_IP_FILE = "/usr/local/ddns/current_ip";

#  2. 設定状況ログファイル
$LOG_FILE        = "/usr/local/ddns/ip_update.log";

# 回線IP確認ページURL
$REMOTE_ADDR_CHK = "http://ieserver.net/ipcheck.shtml";
# DDNS更新ページURL
# wgetをSSL接続可能でビルドしているなら、https:// での接続を推奨
$DDNS_UPDATE     = "https://ieserver.net/cgi-bin/dip.cgi";

# ieServer.Netにて取得したアカウント（サブドメイン）情報を記入
$ACCOUNT         = "ユーザー登録したユーザー名";     # アカウント(サブドメイン)名設定
$DOMAIN          = "ユーザー登録で選択したドメイン名";     # ドメイン名設定
$PASSWORD        = "ユーザー登録で設定したパスワード";     # パスワード設定

if(!open(FILE,"$CURRENT_IP_FILE")) {
    $CURRENT_IP = '0.0.0.0';
    } else {
    $CURRENT_IP = <FILE>;
    close FILE;
}

$NEW_IP = '0.0.0.0';
$NEW_IP = `wget -q -O - $REMOTE_ADDR_CHK`;

if ($NEW_IP ne "0.0.0.0" and $CURRENT_IP ne $NEW_IP) {

    $STATUS = `wget -q -O - '$DDNS_UPDATE?username=$ACCOUNT&domain=$DOMAIN&password=$PASSWORD&updatehost=1'`;
    
    if ($STATUS =~ m/$NEW_IP/) {    
        open (FILE ,">$CURRENT_IP_FILE");
        print FILE $NEW_IP;
        close FILE;
        $TIME = localtime;
        open (FILE ,">>$LOG_FILE");
        print FILE "$TIME $ACCOUNT.$DOMAIN Updated $CURRENT_IP to $NEW_IP\n";
        close FILE;　
    } else {
        $TIME = localtime;
        open (FILE ,">>$LOG_FILE");
        print FILE "$TIME $ACCOUNT.$DOMAIN Update aborted $CURRENT_IP to $NEW_IP\n";
        close FILE;
    }
}
exit;
```

```bash
sudo chmod 700 ddns-update.pl
```

```bash
sudo crontab -e
5,15,25,35,45,55 * * * * /usr/local/ddns/ddns-update.pl
```

## ログの確認

```bash
sudo cat /usr/local/ddns/ip_update.log
```
AWS ELBの証明書を削除する


ELBの証明書はAPI経由で削除することが出来る。
APIへのアクセスは[AWSコマンドラインインターフェース](http://aws.amazon.com/jp/cli/)を使うと便利。

AWSコマンドラインインターフェースはPythonモジュールとして提供されている。以下のコマンドでインストールする。

```bash
pip install awscli
```

# AWSクレデンシャルの設定

AWSのクレデンシャルを`~/.aws/config`ファイルに書く。

```text:~/.aws/config
[default]
aws_access_key_id=[YOUR AWS ACCESS KEY]
aws_secret_access_key=[YOUR AWS SECRET KEY]
region=us-west-1
```

# 証明書の一覧を取得

削除対象の証明書を調べるため、登録済みの証明書一覧を`list-server-certificates`コマンドで取得します。

```bash
aws iam list-server-certificates
```

取得データはJSONです。
`ServerCertificateName`がELBのプルダウンに出てくる証明書の名称です。

```json
{
    "ServerCertificateMetadataList": [
        {
            "Path": "/",
            "Arn": "arn:aws:iam::xxxxxx:server-certificate/old-certificate",
            "ServerCertificateId": "xxxxxx",
            "ServerCertificateName": "old-certificate",
            "UploadDate": "2014-04-10T08:52:28Z"
        },
        {
            "Path": "/",
            "Arn": "arn:aws:iam::xxxxxx:server-certificate/new-certificate",
            "ServerCertificateId": "xxxxxx",
            "ServerCertificateName": "new-certificate",
            "UploadDate": "2014-05-01T02:29:52Z"
        }
    ]
}
```

# 証明書の削除
ELBの証明書は`delete-server-certificate`コマンドから実施する。
証明書の名前は事前に調べておきましょう。

```bash
aws iam delete-server-certificate --server-certificate-name old-certificate
```

参考。

* [ELBのSSL証明書更新の方法](http://aws.typepad.com/sajp/2014/04/elb-ssl.html)
* [AWSコマンドラインインターフェース](http://aws.amazon.com/jp/cli/)
* [aws-cliを試してみる](http://inokara.hateblo.jp/entry/2013/09/13/003118)
* [delete-server-certificate](http://docs.aws.amazon.com/cli/latest/reference/iam/delete-server-certificate.html)
MySQL キー着脱メモ


## テーブルに付いているキーを調べる

```sql
SHOW INDEX FROM table_name
```

**Key_name**カラムがキーの名称です。

## プライマリキー

Create文

```sql
CREATE TABLE table_name (
	column1 int(11) PRIMARY KEY
)
```

```sql
CREATE TABLE table_name (
	column1 int(11),
	column2 int(11),
	PRIMARY KEY (column1, column2)
)
```

追加

```sql
ALTER TABLE table_name
  ADD PRIMARY KEY (column1, column2);
```

削除

```sql
ALTER TABLE table_name
 DROP PRIMARY KEY
```


## ユニークキー

Create文

```sql
CREATE TABLE table_name (
	column1 int(11),
	column2 int(11),
	UNIQUE KEY uk_name (column1, column2)
)
```

追加

```SQL
ALTER TABLE table_name
  ADD UNIQUE uk_name (column1, column2);
```

削除

```sql
ALTER TABLE table_name
 DROP INDEX uk_name
```


## インデックス

Create文

```sql
CREATE TABLE table_name (
	column1 int(11),
	column2 int(11),
	KEY idx_name (column1, column2)
)
```

追加

```sql
ALTER TABLE table_name
  ADD INDEX idx_name (column1, column2);
```

削除

```sql
ALTER TABLE table_name
 DROP INDEX idx_name
```
【Ruby】数列（配列）を簡単につくる

０～１３など、数列がほしいときに
いちいち書くのは面倒くさい。
ループにするのも、大げさな。

Rangeを配列に変換する　って手があった。

```ruby
 [*0..13] # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
```
Raspberry PiをPocket Wifiで固定IPにする

# Raspberry Piを固定IPにする設定

イーモバイルのWifiルーターは暗号化方式をWEPとWPAをきりかえられるようになっているようですが、wpa_supplicant.confの設定方法が異なるようです。

## /etc/network/interfacesの設定

```bash
$ sudo nano /etc/network/interfaces
```

### DHCP

```bash:/etc/network/interfaces
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
```

### 固定IP

```bash:/etc/network/interfaces
auto lo

allow-hotplug wlan0
iface lo inet loopback

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
address 192.168.1.50
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 8.8.8.8

iface eth0 inet static
address 192.168.1.51
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
```

---

# Pocket Wifiと接続する設定

## /etc/wpa_supplicant/wpa_supplicant.confの設定

```bash
$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
```

### DHCP

```bash:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
  ssid="xxxxxxxx"
  scan_ssid=1
  psk="xxxxxxxx"
  proto=RSN
  key_mgmt=WPA-PSK
  pairwise=CCMP
  auto_alg=OPEN
}
```

### 固定IP

#### WEPモード

```bash:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
  scan_ssid=1
  key_mgmt=NONE
  ssid="xxxxxxxx"
  wep_key0="xxxxxxxx"
  wep_tx_keyidx=0
}
```

#### WPA2モード

```bash:/etc/wpa_supplicant/wpa_supplicant.conf

```

# DNSの設定

## /etc/resolv.confの設定

```bash
$ sudo nano /etc/resolv.conf
```

```bash:/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
```

# 設定を反映させる

```bash
$ sudo /etc/init.d/networking reload
```

本体を再起動しないと反映しないかもしれないです。

```bash
$ sudo shutdown -r now
```
[CakePHP 2.x] shell(シェル)からComponent(コンポーネント)を呼び出す

cake初めて一週間。shellからComponentを呼び出したいところで、コツがあったのでメモ。
**OnakahettaShell.php** から **TamagoyakiComponent.php** を呼び出します。

```php
<?php
App::uses('ComponentCollection', 'Controller'); //これが大事
App::uses('TamagoyakiComponent', 'Controller/Component'); 
// ↑このHogeComponentとapp/Controller/Component以下の呼び出したいファイルの『クラスの名前』が一致しているか確認。（まあ基本はクラスとファイル名は一致させる）

/**
* こういうクラス　ちなみにAppShellがShellを継承している
*/
class OnakahettaShell extends AppShell {

    /**
    * TamagoyakiComponent.phpの呼び出し
    */
    public function startup() {
        $collection = new ComponentCollection(); //これが大事です。
        $this->Hoge = new TamagoyakiComponent($collection); //コンポーネントをインスタンス化
        parent::startup();
    }

    /**
     * メイン処理
     */
    public function main() {
        $monya = $this->Tamagoyaki->__fuga(); 
        //↑こんな感じで使えます◎

        Debugger::log($this); // 出力内容は下に記載
        Debugger::log($this->Tamagoyaki); //出力内容は下に

```

ちなみにAppShellはShellを継承しています。

```php:app/console/Command/AppShell.php
<?php
App::uses('Shell', 'Console');
class AppShell extends Shell {
}
```

```php:Debugger::log($this)
object(OnakahettaShell) {
        uses => array()
         .
         .
        Tamagoyaki => object(TamagoyakiComponent) {} <-いた!!
         .
         .
}
```

```php:Debugger::log($this->Tamagoyaki)
object(TamagoyakiComponent) {
        components => array()
        settings => array()
        [protected] _Collection => object(ComponentCollection) {}
        [protected] _componentMap => array()
}
```
メモ: メールサーバー設定: 迷惑メールに入らないようにするチェック項目



## インフラ設定において ##

- [ ] 文字コード (ISO-2022-JP か UTF-8)  
  (Subject 等の MIME エンコードも)
- [ ] Sender アドレスチェック
- [ ] オープンリレー (不正中継) テスト
- [ ] SPF 設定 (DNS)
- [ ] DKIM 設定 (サーバー側, DNS側)
- [ ] IPからのホスト名逆引き設定  
  (さくらだと、どれかのコンパネから)


## メール内容において ##

- 変な (?) URL が一杯入ってないか
- 公序良俗に反する単語が一杯入ってないか
- など (当てにならないと思うのでここまで)
Chef 11.12.2のknife configureが失敗する

2014/04/10現在、最新版であるChef ***11.12.2*** 又は ***11.12.0*** をインストールして「knife configure」を実行すると下記のエラーで失敗します。
(ちなみに試したのはVMware PlayerとVirtualBoxの上のCentOS 6.5のほぼminimal installです。)

```$ knife configure`
ERROR: Ohai::Exceptions::DependencyNotFound: Can not find a plugin for dependency os
```

この現象は既にChefのBTSに上がっています。
https://tickets.opscode.com/browse/CHEF-5211

unit testは完了したっぽいですが、まだFIXはリリースされていないですね。
内部で使用しているohai v7の初期化順に問題があるとかないとか…。
Chef公式からinstall.shでインストールしても、rpmをdownloadしてインストールしても、rubyからgem経由でインストールしてもどれからでもエラーが発生します。
(私はこれで昨日1日を棒に振りました…。)

幸い、Chef 11.10.xには問題が無いようなので11.12.xのFIXが出るまではそっちを使いましょう～。

まだ日本語の情報が出ていなかったのでF.Y.I.ということで。

※ 追記 : 2014/04/16
　Patch上記BTSにpatchが投稿されていますね。
　https://github.com/opscode/chef/blob/master/spec/unit/knife/configure_spec.rb#L22
　これを当てて「直った！」という報告があります。
　私はまだ試していないのですが…。
CakePHPでredirectが効かない時の対処

#現象

画面が真っ白。
または以下のエラーが出る。

Warning: Cannot modify header information - headers already sent ..

#原因

リダイレクト前に何か出力してるから。
例えば、こんな感じ。

```php
debug($user);
return $this->redirect(array('action' => 'index'));
```

この場合、１行目のデバッグを出力してる部分でHTTPヘッダが送信され（headers already sent）るので、２行目のリダイレクトで新しいヘッダを送信しようとすると、Cannot modify header informationになってしまう、ようだ。詳しい理由は知らない。

#対処

php.iniの

```ini:php.ini
output_buffering = Off
```

を

```ini:php.ini
output_buffering = On
```

に書き換えてApacheを再起動するだけ。
モンテカルロ法

モンテカルロ法は、与えられた関数を再現するように、関数の積分をサンプリングした点の和に変換する方法です。

[Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%AB%E3%83%AB%E3%83%AD%E6%B3%95) の説明にもあるように、これは乱数生成の品質に依存します。

### モンテカルロ法の原理

モンテカルロ法による数値計算の原理は、アンケートにおいて、多くの人員が所属する部署からは多数のサンプルを抽出し、少ない人員が所属する部署からは少数のサンプルを抽出し、これで会社全体の意見をアンケートに反映させることができるという考え方に似ています。たとえば円周率の計算については 0 から 1 の範囲の乱数の組を生成して、それを x-y 座標上の点としてみて単位円の第 1 象限に入っているかどうか、その割合から求めるといった具合です。

連続的な値を取る確率変数の場合、確率分布は確率密度関数 f(x) で表現されます。このとき平均値 u と分散 σ^2 は次のようになります。

```math
\mu = \int{xf(x)dx} \\
\sigma^2 = \int{(x - \mu)}^2f(x)dx
```

### 実際にコードで試す

2 つのスポーツチーム A と B がありました。この 2 つのスポーツチームは成績はまったく同点でしたがその分散が異なります。これをモンテカルロシミュレーションで表現します。

```py3
from pylab import *
from scipy.stats import *
import matplotlib.pyplot as plt

runs = 10000

# 各チームの成績
teamperfA = [0.9,0.8,0,9] # チーム A のスコア
teamperfB = [0.9,0.8,0.9] # チーム B のスコア

# チームごとの成績の分散
teamvarianceA = [0.03, 0.04, 0.02]
teamvarianceB = [0.05, 0.08, 0.09] # チーム B のほうが分散が高い

weights = [1.0, 0.95, 0.8]

def result(perf,variance,weights):
    res = 0.0
    for i in range(len(perf)-1):
        res += perf[i] * weights[i] * norm(1,variance[i]).rvs()

    return res

resultsA = zeros(shape=(runs,), dtype=float)
resultsB = zeros(shape=(runs,), dtype=float)

for i in range(runs):
    resultsA[i] = result (teamperfA,teamvarianceA,weights)
    resultsB[i] = result (teamperfB,teamvarianceB,weights)

subplot(211)
width = 2
height=runs

title('Team A')
hist(resultsA, bins=50)
axis([1.4,1.9,0,height/10])

subplot(212)
title('Team B')
hist(resultsB, bins=50)

axis([1.4,1.9,0,height/10])

show()
plt.savefig("image.png")
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/5a003414-b332-9341-5ed5-176eb35d3dce.png)

## 参考

Python matplotlib, Monte Carlo simulation, and basic statistics
http://softwaredevelopmentperestroika.wordpress.com/2013/12/06/python-matplotlib-monte-carlo-simulation-and-basic-statistics/
Raspberry PiにNode.jsをインストール


```bash
$ sudo apt-get update
$ sudo apt-get install -y git-core git scons build-essential scons libpcre++-dev xulrunner-dev libboost-dev libboost-program-options-dev libboost-thread-dev libboost-filesystem-dev

$ wget http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gz
$ tar -zxf node-v0.10.26.tar.gz
$ cd node-v0.10.26
$ ./configure
$ make
$ sudo make install
```
AWS EC2のAmazon Linuxでlogentriesを設定

思いのほか簡単だったけどメモ。

1.ユーザ登録
https://logentries.com/

2.用意されているインストールshを実行

```shell-session
$ wget https://raw.github.com/logentries/le/master/install/linux/logentries_install.sh && sudo bash logentries_install.sh
# 対話式で監視対象を聞かれるのでy/nで進めていく
```

3.あとは1分くらい待っていると、logentriesのWeb管理画面でhostが認識されてログが流れてくる

4.任意のログを監視対象に追加

```shell-session
# Nginxのエラーログを追加
$ sudo le follow /var/log/nginx/error.log --name Nginx-Error
```
OpenSSLの脆弱性,Heartbleed概要と対処

# OpenSSLの脆弱性,Heartbleed概要と対処

* `対象者`:Webサービス開発者など
* `終着点`:セキュリティの脆弱性を解消する

## 概要

脆弱性がある`OpenSSL`の`対象バージョン`は`1.0.1`-`1.0.1f`です。
この脆弱性によりSSLで通信しているコンピュータのメモリが見えちゃいます。

## 対象となるOSについて

* Debian Wheezy (stable), OpenSSL 1.0.1e-2+deb7u4
* Ubuntu 12.04.4 LTS, OpenSSL 1.0.1-4ubuntu5.11
* CentOS 6.5, OpenSSL 1.0.1e-15
* Fedora 18, OpenSSL 1.0.1e-4
* OpenBSD 5.3 (OpenSSL 1.0.1c 10 May 2012) and 5.4 (OpenSSL 1.0.1c 10 May 2012)
* FreeBSD 10.0 - OpenSSL 1.0.1e 11 Feb 2013
* NetBSD 5.0.2 (OpenSSL 1.0.1e)
* OpenSUSE 12.2 (OpenSSL 1.0.1c)

## 対処方法

適宜`sudo`してください。
まずは現在のバージョンを確認します。

```bash
$ openssl version
```

ここで表示される内容が上記の脆弱性のあるバージョンならアップデートします。

```bash
$ yum update openssl  # CentOS
$ aptitude update openssl # Ubuntu, Debian
$ brew update openssl # Mac OS
```

アップデート後にバージョンの確認やらパッチの内容など参照してみてください。
SSLの証明書が傍受されている場合があるので再発行して現在のものは`revoke`しましょう。
この部分は方法・手順が多岐に渡るかと思うので、自身で調べて下さい。
今回の脆弱性を受けて再発行を無償で行っている期間もあるとか。

最後にサーバを再起動します。(apacheです,nginxなどは適宜対応してください。)

```bash
$ service httpd restart # CentOS
$ /etc/init.d/apache2 restart # Ubuntu, Debian
$ apachectl restart # Mac
```

## クライアントとしての対処

後述するテストサイトを使いWebサービスがこの脆弱性から回復しているか確認します。
回復していればパスワードを変更します。
念のため脆弱性の回復に関わらずパスワードを変更しておくとなお安心かと思います。

## 最後に

脆弱性が回復されたかは以下のサイトを見て下さい。

[Heartbleed test](http://filippo.io/Heartbleed/) - 脆弱性を確認されるため自己責任で利用してください。

以下、関連リンク

[The Heartbleed Bug](http://heartbleed.com/) - バグの全貌(英語)
[クロストラスト](https://crosstrust.co.jp/company/information/i20140408) - クロストラスト(Heartbleed サーバ証明書の再発行について)
[Debian.org](https://security-tracker.debian.org/tracker/CVE-2014-0160) - Debian(英語)
[Ubuntu](http://www.ubuntu.com/usn/usn-2165-1/) - Ubuntu(英語)
[Red Hat](https://access.redhat.com/security/cve/CVE-2014-0160) - Red Hat(英語)
Ext JS 4.2.1 でのロケールの設定

ロケールのあて方を書いた日本語サイトがないようなので、書いておきます。
Ext JS の 4.2 以降では locale パッケージが用意されました。
以前のように、 index.html でロケールファイルを読む必要はありません。
日本語のロケールパッケージを宛てるには次の様にします。

###### app.json

    "requires": [
        "ext-locale"
    ],
    "locale": "ja",

requires の中に ext-locale を追加して、
locale に ja を指定します。

Sencha Cmd でプロジェクトをリフレッシュします。

    $ sencha app refresh

これで、各所の英語が日本語になります。

> 以前は sencha.cfg に app.locale=ja と設定すると、書いていましたが、
> app.json に両方書けるとわかりましたので、書き換えました。
Android SDKのadbが見つからない

#Android SDKからadbが消えた？
今までノートにはAndroid SDK入れてなかったけど、出先でも色々したいなと思っていれてみた…の
**だが**

## PATHを通して`adb`しても

```bash
$ adb
No command 'adb' found, did you mean:
〜略〜
adb: command not found.
```

#Android SDKのフォルダの中身を見てみると
`/android-sdk-linux/tools/adb_has_moved.txt`というものが

> The adb tool has moved to platform-tools/
> 
> If you don't see this directory in your SDK,
> launch the SDK and AVD Manager (execute the android tool)
> and install "Android SDK Platform-tools"
> 
> Please also update your PATH environment variable to
> include the platform-tools/ directory, so you can
> execute adb from any location.

```
adbはplatform-tools/へ移動になったよ！

platform-tools/がなければSDK,AVDマネージャで"Android SDK Platform-tools"をインストールしてね！

あ、もちろんplatform-tools/へPATHを通すのも忘れないでね！
```

という事らしい。昔は最初から入っていたような気がするのだけど、配布データの容量削減の目的なのか、変わったようだ。
入れます。

#俺の記憶によると
どこかにsdk_managerみたいなものがあったような気がするのだけど、どこですか？orz

#探してみるとあった
`android-sdk-linux/tools/lib/sdkmanager.jar`
でもこれ単体で実行できなさげ？

```bash
$ java ./android-sdk-linux/tools/lib/sdkmanager.jar
Exception in thread "main" java.lang.NoClassDefFoundError: //android-sdk-linux/tools/lib/sdkmanager/jar
Caused by: java.lang.ClassNotFoundException: ..android-sdk-linux.tools.lib.sdkmanager.jar
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: ./android-sdk-linux/tools/lib/sdkmanager.jar.  Program will exit.
```

ｵｫﾝ

#しょうがないので
Google先生に聞いてみたところ、`android update sdk`しろとのことだったので、しますが、androidはどこにあるの？
→android-sdk-linux/tools/android
* ちなみにandroid-sdk-linux/toolsへ既にPATHを通している場合には問題ない

#(´◔౪◔)۶ﾖｯｼｬ!

```bash
android-sdk-linux/tools/android update sdk
```
これで見慣れた`Android SDK Manager`が現れます。

Tools内のAndroid SDK Platform-toolsをインストールしてやればおｋです。platform-tools/へパスを通すのを忘れずに。
mac で emacs24.3 をインストールする

# Xcode
App Store で Xcode をインストールしておく
Xcode の Preferences->Download で Command Line Tool を落としておく

# wget が使えなかったので使えるようにする
こちらの記事を参考にして入れる
http://www.absolute-keitarou.net/blog/?p=296
`curl -O http://ftp.gnu.org/pub/gnu/wget/wget-1.13.4.tar.gz
tar zxvf wget-1.13.4.tar.gz
./configure –with-ssl=openssl
make
sudo make install `

# emacs インストール
こちらの記事を参考
http://x3mismatch.blogspot.jp/2013/12/mac-os-x-mavericksemacs243.html
`wget http://ftp.gnu.org/pub/gnu/emacs/emacs-24.3.tar.xz
tar xvf emacs-24.3.tar.xz 
tar: Error opening archive: Child process exited with status 254Child process exited with status 254`
解凍できなかった
xzモジュールが足りないようなので入れる
ここ参考
http://apple.stackexchange.com/questions/80269/child-process-exited-with-status-254-error-when-extracting-a-tar-xz-file
`http://tukaani.org/xz/xz-5.0.5.tar.gz
tar xvf xz-5.0.5.tar.gz 
./configure 
make 
sudo make install`
これで再度解凍
`tar xvf emacs-24.3.tar.xz `
パッチがあるみたいなのでおとして当てる
`wget http://svn.sourceforge.jp/svnroot/macemacsjp/inline_patch/trunk/emacs-inline.patch
patch -p0 < emacs-inline.patch`
make してインストールする
`./configure --with-ns --without-x -with-wide-int && make -j4 && make install
/bin/sh: autoheader: command not found`
autoheader がないっておこられる
homebrew で入れれるみたいなのでいれる
`ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
 brew install autoconf`
再度make
`make -j4 && make install`
アプリケーションフォルダにコピー
`cp -R nextstep/Emacs.app/ /Applications/Emacs.24.3app/`
ターミナル上で起動できるように .bashrc とかに記述
`alias emacs="/Applications/Emacs.app/Contents/MacOS/Emacs -nw"`
PHP 配列の要素の存在チェックにおける array_key_exist() と isset() の違い

array_key_exists ではなく、isset を利用しても配列の存在チェックができる。
ただ両者では挙動に違いがあるので注意が必要。

## サンプルコード
```php
<?php
	// array_key_exists と isset を利用した配列の存在チェック
	function check($key, $array)
	{
		$ret1 = array_key_exists($key, $array) ? "Exist" : "Not Exist";
		$ret2 = isset($array[$key]) ? "Exist" : "Not Exist";
		echo "$key exist check : array_key_exists() = $ret1 / isset() = $ret2" . PHP_EOL;
	}

	$array = array("key1" => "value1", "key2" => null);

	check("key1", $array);
	check("key2", $array);
	check("key3", $array);
```

## 実行結果
> $ php test.php
key1 exist check : array_key_exists= Exist / isset= Exist
key2 exist check : array_key_exists= Exist / isset= Not Exist
key3 exist check : array_key_exists= Not Exist / isset= Not Exist

array_key_exists() は配列中にKey値が存在すれば値が何であろうがTRUEを返すが、
issetの場合、Key値が存在してもその値がNULLであった場合、FALSEを返す。
WPF ラジオボタンのグルーピングで引っかかった点

WPFのアプリケーションを開発していて、ラジオボタンを用いたUserControlで引っかかった箇所があったので書いておきます。

ラジオボタンをグルーピングするには、RadioButton コントロールの`GroupName`に同一の名称を設定します。通常であればそれで問題ありませんが、ラジオボタンをUserControlに配置する場合は注意が必要となります。

例えば、以下のソースのようにラジオボタンを持つUserControlを作成し、Window上に複数ならべて配置したとします。

```xml:RadioButtonTestControl.xaml
<UserControl x:Class="RadioTest.RadioButtonTestControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="100" d:DesignWidth="200">
    <Grid>
        <Border BorderBrush="Black" BorderThickness="1">
            <StackPanel Orientation="Vertical">
                <RadioButton Name="btn1" GroupName="buttons" Margin="10">ラジオボタン1</RadioButton>
                <RadioButton Name="btn2" GroupName="buttons" Margin="10">ラジオボタン2</RadioButton>
                <RadioButton Name="btn3" GroupName="buttons" Margin="10">ラジオボタン3</RadioButton>
                <RadioButton Name="btn4" GroupName="buttons" Margin="10">ラジオボタン4</RadioButton>
            </StackPanel>
        </Border>
    </Grid>
</UserControl>
```

```xaml:MainWindow.xaml
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:RadioTest" x:Class="RadioTest.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <local:RadioButtonTestControl Grid.Column="0"/>
        <local:RadioButtonTestControl Grid.Column="1" />
        <local:RadioButtonTestControl Grid.Column="2" />
    </Grid>
</Window>
```

この時、ラジオボタンはUserControl単位でグルーピングされることを期待すると思うのですが（少なくとも私はそうでした）、実際に動かしてみるとUserControl単位ではなくWindow単位で行われるようで、複数配置されたコントロールのラジオボタンすべてが一つのグループにまとめられてしまいます。

UserControl毎にグルーピングを行うためにには、インスタンス毎に異なるGroupNameを指定する必要があります。GroupName名を指定するプロパティをコントロールに追加するか、もっと単純な方法としては以下のように

```csharp:RadioButtonTestControl.xaml.cs
public partial class RadioButtonTestControl : UserControl
{
    public RadioButtonTestControl()
    {
        InitializeComponent();

        string guid = Guid.NewGuid().ToString();
        btn1.GroupName = guid;
        btn2.GroupName = guid;
        btn3.GroupName = guid;
        btn4.GroupName = guid;
    }
}
```

コントロールのコンストラクタでGUIDを取得し、ラジオボタンのGroupNameに設定してやるといいようです。
テキストエリアの中身のテストをしたいときあるじゃん？

```haml:new.html.haml
= form_for @course do |f|
  .field
    = f.label :title
    = f.text_field :title

  .field
    = f.label :body
    = f.text_area :body, value: '何かデフォルトの文章みたいなアレ'

  .submit-button
    = f.submit
```

的なテンプレートがあったとして、これの`#course_body`のデフォルト値がちゃんと正しく入ってるか的なテストを書きたいとする。
そんなときは、

```rb:course_spec.rb
require 'spec_helper'

feature 'Course' do
  describe 'new course' do
    scenario '新しいコースを作成する' do
      visit new_course_path

      fill_in 'course_title', with: 'なんかタイトル'

      # NOTE 大事なのココな
      textarea = find('#course_body')
      expect(textarea.value).to match /何かデフォルトの文章みたいなアレ/

      fill_in 'course_body', with: 'なんか違う文章'

      click_button 'Save'
    end
  end
end
```

って書くと上手くいくらしいよ( ˘ω˘)
Objective C のiteratorパターンを考えてみる


### 概要
最近wantedlyでは、新人研修でjavaのデザインパターンを勉強してます。
ただ使っている言語は、objective-Cだったり、rubyだったりするので、自分の勉強も含めて、それぞれのパターンをそれぞれのどう実装していくか整理しながら進めてます。

### iteratorパターン
forで数を数える場合、最後の数を間違えたりしてバグを生み出すことがあります。
またenumratorを利用することで、数を数えることとコレクションの実装を分けて考えることができます。

### objective-Cでiteratorを利用する方法
NSFastEnumeration protocolを利用します。NSArrayやNSSetやNSDictionaryは、このprotocolを含んでます。


### enumratorの使い分け
* ``for in``で利用するのが基本です

```
for (id object in array) {
    NSLog(@"%@", object);
}
```
* ``while``で書く場合

```
id object = nil;
NSEnumerator *enumerator = ...;
while ((object = [enumerator nextObject])) {
    NSLog(@"%@", object);
}
```
* NSArrayやNSSetやNSDictionaryやNSIndexSetではblockでenumerateを使うことができます。

```
[array enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
    NSLog(@"%@", object);
}];
```

### NSFastEnumrationのプロトコルの使い方
* NSFastEnumerationのプロトコルは、countByEnumeratingWithStateというmethodが必要になります


```BookShelf.h
#import <Foundation/Foundation.h>

#define ARRAY_SIZE 32

@interface BookShelf : NSObject <NSFastEnumeration>
{
    __unsafe_unretained id  _objects[ARRAY_SIZE];
}

@end
```
```BookShelf.m
#import "BookShelf.h"

@implementation BookShelf

- (id)init
{
    self = [super init];
    if (!self) {
        return nil;
    }

    for (int i = 0; i < ARRAY_SIZE; i++) {
        _objects[i] = [NSNumber numberWithInt:i];
    }

    return self;
}

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len
{
    if (state->state >= ARRAY_SIZE) {
        return 0;
    }

    state->itemsPtr = _objects;
    state->state = ARRAY_SIZE;
    state->mutationsPtr = &state->extra[0];

    return ARRAY_SIZE;
}

@end
```
```main.m
#import <Foundation/Foundation.h>
#import "BookShelf.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        BookShelf *bookShelf = [BookShelf new];

        for (id object in bookShelf) {
            NSLog(@"%@", object);
        }
    }
    return 0;
}
```


### 参考
* ここを読むとより詳しいです http://nshipster.com/enumerators/
* Fast Enumerationについて http://news.mynavi.jp/column/objc/105/
* mutationPtrの指定方法 http://stackoverflow.com/questions/7815326/automatic-reference-counting-error-with-fast-enumeration
* 今回のソースのサンプル https://github.com/reikubonaga/objective-c-iterator
CプログラマがやらかしがちなC++のコード

※これは気づいたら追加してくメモという名の愚痴です。ネタがあったらコメントや編集リクエストでよろしくー...と、書いて三年以上経ってから出くわしたうんコードも完全に網羅していてﾜﾛﾀ。

## まえがき
<p>Cの経験が長いプログラマは二つのタイプに分かれる。一つは独自にオブジェクト指向的に凝集度と結合度をコントロールする方法を考えるタイプ。もう一つはそんなことはお構いなしに組んでしまうタイプだ。</p>
<p>これは後者のタイプがC++でやらかしがちな例を列挙し、なぜそれをやらかすのかを推測し、それがなぜダメなのかを解説する試みである。私自身は前者なので後者の考えていることがよくわからないという動機もあるし。</p>
<p>ある意味アンチパターン集と言えるだろう。</p>

## 力任せ

<p>大体どの項目も同じことについて述べている気がするが、とりあえず「三日前の自分は他人」という言葉がある。それとノッている時に吐いたコードはほとんどの場合ク◯の山だ。まず間違いなく次の日あたりに後悔することになる。</p>

1. 聳え立つク◯の山
<p>モジュールやメソッドやオブジェクトを巨大にしてしまうというのはよくある話だ。しかし、Cでも関数の分割は推奨されているのでこれはCの経験が長いからではなく **そんなことはお構いなし** だからこその現象だろう。</p>
<p>これ、お仕事ソースだとほとんどどこにでも存在する現象なので困る。 **一つのファイルが一万行以上あるデバイスドライバのソース** とか勘弁してほしいものだ。</p>
1. 乱◯パーティ
<p>インターフェイスが定まっておらず、どこで何を呼んでいるのかわかったもんじゃない。その当然の帰結として凝集度が低く結合度が非常に高い。</p>
<p>症状は主に、似たようなプログラムを組むのに毎度毎度組み直すとかいう再利用性の低さとして現れる。インターフェイスは分割の要なので当然の帰結といえよう。こういうのに手を入れるのはおっかないんだよなー。</p>

## クラス、オブジェクトに関するもの

<p>力任せよりは色々意識してる分ずっとマシなんだけど、なぜかこの手の間違いは後を絶たない。世界の謎。もうちょっと俯瞰で考えようぜ？</p>

1. オブジェクトになり得ないクラス
<p>ソースを斜め読みしていて**コントローラー**とか**プレイヤー**とか**マネージャー**みたいな**er**や**or**な単語を見かけたら要注意だ。これらは **オブジェクトになり得ないもののクラス** である可能性が非常に高い。</p>
<p>**コントローラ** とか **プレイヤー** は **データとコードの一体化ができていないからこそ存在する** んだ。それらはデータやデータのように見えるものを持っていないのでオブジェクトにはなり得ない。勉強してるけどわかってない人はこれをシングルトンのように実装したりするんだけど...いやいやそうじゃないんだってば。</p>
<p>ではどうなっているべきなのか。ってのは **それらによって操作される対象** こそがオブジェクトなんだ。反射的にわかりそうな程度の話なんだけど。だから修正するには**コントローラーとコントロールされるものを合体**すればおｋ。このアンチパターンにはまってるってことはたぶんこの時点では「コントロールされるもの」はクラスとしては存在していないと思うけど。</p>
<p>で、正しくオブジェクトになっていればデータやコードがほぼ適切に分割されて自然に結合が最小限になる。オブジェクト指向はもともとそういうもの。間違っていると感じたら力技で押し通そうとしちゃダメ。</p>
1. 露出狂
<p>**全部public** からアクセサの羅列まで、カプセル化不足なのがこれ...なんだけど、 **全部public** はともかくこれにも **間違った分割** という別の原因がある。上の **オブジェクトでないものをオブジェクトにする** というのもそれなんだけど、その結果でありがちなのがこれ。</p>
<p>さらに症状は **乱◯パーティ** として連鎖していくことが多そうだ。組んでいてわかる兆候は **カプセル化で悩んだ挙句やたらfriendにしたくなる** あたり。そんな時はどちらかをもう一方のサブクラスにすべきものだったりする。「参照関係は可能な限り一方通行にしとく」というのを心がけると間違いを検出できるだろう。できないと思ったら何かが間違っているということだ。</p>
1. オブジェクトへの参照でないものをオブジェクトのハンドルにする
<p>インスタンスのポインタや参照ではなく、整数の**何とかのID**みたいなものをオブジェクトのハンドルにして、あとでswitch～caseで場合分けするというのがこのアンチパターンの定番だろう。</p>
<p>酷いのになるとRTTIよろしく多態でIDを返させて分岐したりする。その分岐後の処理を仮想関数にしてその分岐自体を多態でやればいいのに。</p>
【WordPress】おすすめプラグイン

#Simple Page Ordering
[Simple Page Ordering 2.2 for WordPress](http://10up.com/plugins/simple-page-ordering-wordpress/)
固定ページ一覧画面上で、簡単に順番の並び替えができる
ドラッグ・アンド・ドロップによって視覚的に操作できるのが良い
DatePickerDialogのonDateSetが2回発生する

android.app.DatePickerDialogを初めて使ったんですけどonDateSetが2回発生する事象にあったのでメモ

```java
        Calendar date = Calendar.getInstance();
        DatePickerDialog dialog = new DatePickerDialog(this, new OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                Log.d("hoge", "onDateSet");
            }
        }, date.get(Calendar.YEAR), date.get(Calendar.MONTH), date.get(Calendar.DAY_OF_MONTH));
        dialog.show();
```

> 04-11 11:55:03.437: D/hoge(19662): onDateSet
> 04-11 11:55:03.447: D/hoge(19662): onDateSet

対応

```java
        Calendar date = Calendar.getInstance();
        DatePickerDialog dialog = new DatePickerDialog(this, new OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                if (!view.isShown()) {
                    return;
                }
                Log.d("hoge", "onDateSet");
            }
        }, date.get(Calendar.YEAR), date.get(Calendar.MONTH), date.get(Calendar.DAY_OF_MONTH));
        dialog.show();
```

> 04-11 12:00:57.835: D/hoge(20291): onDateSet

これでok。

ってホントにこれでいいの？？？

参考
http://stackoverflow.com/questions/12436073/datepicker-ondatechangedlistener-called-twice
vagrant memo

### vagrant memo

最近は、開発環境はlocalのmacにbrewで構築してたんですけど
仕事でvagrant + chefで開発環境を構築する機会があったので
vagrantの最新バージョンをインストールして使ってみた。

### install

* 下記リンクからダウンロードしてインストール

[vagrant download](http://www.vagrantup.com/downloads)

### version

```
$ vagrant -v
Vagrant 1.5.2
```

### up

#### first time

Vagrantfileに設定してる全ての内容を実行する
指定のboxを設定して、指定のprovisionを実行する

```
vagrant up
```

#### on and after second time

VMの立ち上げだけを行う (1.3.0から)

```
vagrant up
```

##### provision (puppet, chef, ansibleなどを再度はしらせたい場合)

```
vagrant up --provision

or

vagrant up
vagrant provision
```

続きを書くかも
IntellijでRVM切替がうまくいかないよーとエラーになるとき

```
.ruby-version Settings: Cannot switch SDK. RVM SDK '2.1.1
```
とか言われる場合
.ruby-versionには"2.1.1"と書いてあるのを"ruby-2.1.1"にすればOK。
「そんなRVMなかったよ」というエラーみたい。

## 参考

http://youtrack.jetbrains.com/issue/RUBY-15058