OmniAICreator/Qiita-1.07M huggingface dataset:
ssh などの引数がコマンドとして解釈されるコマンドに文字列を渡す

（プロンプト文字を `#` としています）

ssh は引数にコマンドを与えることができます。

```
# ssh example.net echo hoge
hoge
```

次のように書くとローカル側で環境変数が展開されて ssh に渡ります。

```
# ssh are@example.net echo "$HOME"
/home/ore
```

次のように書くと ssh には `$HOME` という文字が渡されます。が、ssh はシェル経由でコマンドを実行するのでリモート側で環境変数が展開されます。

```
# ssh are@example.net echo '$HOME'
/home/are
```

なのでこんなふうに書くとローカルとリモートで２回環境変数が展開されます。

```
# HOGE='$HOME'
# echo $HOGE
$HOGE
# ssh are@example.net echo "$HOGE"
/home/are
```

なので `$HOME` という文字をリモートで実行されるコマンドに渡したければ次のように書く必要があります。

```
# ssh are@example.net echo '\$HOME'
$HOME
```

あるいは次のように書きます。

```
# ssh are@example.net echo "'"'$HOME'"'"
$HOME
```

次のようにコマンド全体を1つの引数として ssh に渡しても同じです。


```
# ssh are@example.net 'echo \$HOME'
$HOME

# ssh are@example.net "echo '"'$HOME'"'"
$HOME
```
Yahoo注文詳細API:取得項目について

Yahoo注文詳細APIについてお教え下さい。
http://developer.yahoo.co.jp/webapi/shopping/orderInfo.html

上記仕様のうち、Pay(BillFirstName等)とShip(ShipFirstName等)の項目を指定したところ、
空白で返却されて参りました。

指定の方法が違うのでしょうか。


## リクエスト内容 ##
※実際のリクエストは改行無しで送信しています。
\<Req>
  \<Target>
    \<OrderId>---\</OrderId>
    \<Field>OrderId,OrderTime,PayDate,OrderStatus,DeviceType,PayMethod,PayType,BillLastName,BillFirstName,
BillLastNameKana,BillFirstNameKana,BillZipCode,BillPrefecture,BillCity,BillAddress1,BillAddress2,
BillPhoneNumber,BillMailAddress,ShipLastName,ShipFirstName,ShipLastNameKana,ShipFirstNameKana,
ShipZipCode,ShipPrefecture,ShipCity,ShipAddress1,ShipAddress2,ShipPhoneNumber,ShipRequestDate,
ShipRequestTime,TaxRatio,ShipCharge,PayCharge,GiftWrapCharge,UsePoint,Discount,TotalPrice,
BuyerComments,UnitPrice,CouponDiscount,Quantity\</Field>
  \</Target>
  \<SellerId>---\</SellerId>	
\</Req>


## レスポンス内容 ##
Array (
  [@attributes] => Array  (
    [totalResultsAvailable] => 1
    [totalResultsReturned] => 1
    [firstResultPosition] => 1
   )
  [Result] => Array  (
    [Status] => OK
    [OrderInfo] => Array  (
    [OrderId] => ---
    [DeviceType] => 1
    [OrderTime] => 2014-09-24T00:00:00+09:00
    [OrderStatus] => 2
    [BuyerComments] => Array()
    [Pay] => Array  (
      [PayType] => 0
      [PayMethod] => payment_a1
      [PayDate] => Array()
      [BillFirstName] => Array()
      [BillFirstNameKana] => Array()
      [BillLastName] => Array()
      [BillLastNameKana] => Array()
      [BillZipCode] => Array()
      [BillPrefecture] => Array()
      [BillCity] => Array()
      [BillAddress1] => Array()
      [BillAddress2] => Array()
      [BillPhoneNumber] => Array()
      [BillMailAddress] => Array()
    )
    [Ship] => Array(
      [ShipRequestDate] => Array()
      [ShipRequestTime] => Array()
      [ShipFirstName] => Array()
      [ShipFirstNameKana] => Array()
      [ShipLastName] => Array()
      [ShipLastNameKana] => Array()
      [ShipZipCode] => Array()
      [ShipPrefecture] => Array()
      [ShipCity] => Array()
      [ShipAddress1] => Array()
      [ShipAddress2] => Array()
      [ShipPhoneNumber] => Array()
    )
    [Item] => Array(
      [UnitPrice] => 5965
      [Quantity] => 1
      [CouponDiscount] => Array()
    )
    [Detail] => Array(
      [PayCharge] => 0
      [ShipCharge] => 525
      [GiftWrapCharge] => 0
      [Discount] => 0
      [UsePoint] => 0
      [TotalPrice] => 6490
      [TaxRatio] => 8
    )
  )
)
Bashで文字列をエスケープをする

Bashで文字列をエスケープするのは案外面倒くさい。

そういえばシェル文字列をエスケープするコマンドとかありそうなのに知らないし…。まぁ僕が知らなかっただけで元からあるよって場合は誰か教えて下さい。

**結論を先に書いておくと、今時の新規スクリプトは `printf %q "$v"` を使うのが一番確実かなと思う。**Bash 4.3未満で`~`がエスケープされないバグとかあったけど未来の保守だけ考えれば良くて過去に持ち帰る必要が無いという要件が殆どだろうしやらないよりは1万倍マシ。

# 手順
面倒とはいえやらなきゃいかん。

で、とりあえず `'シングルクオート最強! $a "ho ge"'` てな感じでシングルクオートで囲っておけば日本語や空白文字や変数やダブルクオートとかが入ってても何でもそのまま文字列として扱える。これは特定文字にバックスラッシュを付けるとかよりよっぽど簡単だし、簡単ということはミスや漏れもしにくく安全だってことだ。
でも唯一問題なのがシングルクオートをその中に混ぜられないこと。でもこれは一旦シングルクオートのリテラルを閉じてダブルクオートのリテラルで置き換えてやればOK。つまり `a'g"e` という文字列を使いたければ `'a'"'"'g"e'` としてやればよい。
ちなみにシングルクオート1つの為に一番外側をダブルクオートにする案は変数や一部文字のエスケープが面倒なので却下。


# 関数化
固定値なら上記を手で書いても良いが、変数などで渡ってきた不定な値をエスケープするには手作業は出来ない。というわけで関数化してみる。

```bash:
sh-escape() {
  local s a=() q="'" qq='"'
  for s in "$@"; do
    a+=("'${s//$q/$q$qq$q$qq$q}'")
  done
  echo "${a[*]}"
}
```

別に関数じゃなくてシェルスクリプトにしておいても良い。これは好みの問題でどっちも同じように使える。

```bash:sh-escape.sh
#!/bin/bash
q="'" qq='"'
for s in "$@"; do
  a+=("'${s//$q/$q$qq$q$qq$q}'")
done
echo "${a[*]}"
```

簡単な補足をしておく。

- `a+=("xxx")` は配列aにxxxという文字列をpushするの意味。
    - `a[${#a[@]}]=xxx` と書くこともあるが、vimのシンタックスハイライトが変になるので`+=`の方をよく使うようになった。
- `${s//foo/bar}` で変数sの中のfooを全てbarに置換したものが得られる。
    - 最初の `//` を `/` 1個にすると最初に見つけた1個だけ置換という意味になる。
    - 今回は `"` を全部 `'"'"'` に置換したいので`/`じゃなく`//`を使っている。
    - fooやbarに当たる部分に`"`や`'`を直接書くとバックスラッシュエスケープが必要で面倒なので一旦変数に入れておいてそれを使ってる。
    - ちなみに最初は `a+=("'${s//\'/\'\"\'\"\'}'")` て書いてたんだがBashのバージョンによって挙動が変わってバックスラッシュがそのまま出力されちゃって動作しないケースを発見したのも$qと$qqの変数に置き換えた理由。こういうのがあるからバックスラッシュエスケープは嫌いだ…。


# 動作確認

使い方はこんな感じだ。

```bash:
$ sh-escape 'ho"ge' "fu'ga"
'ho"ge' 'fu'"'"'ga'
$ cmd="echo $(sh-escape 'ho"ge' "fu'ga")"
$ echo "$cmd"
echo 'ho"ge' 'fu'"'"'ga'
$ eval "$cmd"
ho"ge fu'ga
```

これで `eval`も怖くない。


# 活用例
なんでこんな事を始めたかって言うと、tmuxのnew-windowとかnew-sessionとかのオプションがコマンド引数を個別に認識してくれないからだ！

> new-window [-adkP] [-c start-directory] [-F format] [-n window-name] [-t target-window] [shell-command]

manから引用すると↑こんな感じ。この `[shell-command]` てやつが単体の文字列でしか受け付けない仕様なのでムキーってなるわけです。これが `[shell-command] [arg [args...]]` みたいになっててくれれば、引数を配列変数argsに入れておいて `tmux new-window prog "${args[@]}"` とか書けるのに、1つの文字列になってるせいで安全に書きにくいのよ。

で結構多くの人が `tmux new-window "prog ${args[*]}"` と同値な書き方をしちゃってる例を見る。でもこれだとargsのなかに`"ho ge"`ていう値が入ってたら、prog には一つの文字列として渡したいのに、ho と ge ていう二つの引数として渡されちゃうのでそれ駄目じゃん？
ましてや`"; rm -rf *"`みたいな文字列が混じってたらとか想像したら怖すぎる。

というわけで上述した関数を作ったわけだ、ここが目的地。あれを使うと↓こう書ける。

```bash
tmux new-window "prog $(sh-escape "${args[@]}")"
```

あースッキリした！

# 追記：printf で行けた！→いややっぱ駄目ぽ？→バージョン4.3以降ならOK
`printf %q "$value"` これでいいんじゃね？

※ただし%qは、coreutilsパッケージとかに含まれてる/usr/bin/printfではなく、bashのbuildin functionのprintfのみで使えるようです。Bashスクリプト書いてる時はこれでいいけど、使えないケースもあるかもしれないのでその点は留意すること。

※更に追記、printf %qだとチルダ`~`が文字列としてエスケープされない模様。その仕様だとちょっと違ってきちゃうのでやっぱ自前関数作るしか無いのか…？

※更に追記、チルダがエスケープされないのは仕様じゃなくバグだったってことで4.3で直った模様。
TravisCIでubuntu14.04向けのパッケージをインストールする方法

# TravisCIのOS
* デフォルトではUbuntu 12.04
* なのでapt-getでパッケージを取得する場合に、「あれ、インストールされたバージョンが古い！」ということもある
* そのため、最新のパッケージを取得するにはadd-apt-repositoryをしてやらねばならない
* ちなみに、最新のバージョン指定して取得してみても見つかりませんといわれました(12.04なのでというオチ)

# 対応
* .travis.ymlに以下を追記するだけ

```:.travis.yml
...
before_install:
  - sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu/ trusty main universe"
  - sudo apt-get update -qq
...
``` 

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
border-imageをbefore,after擬似要素で使うとRetina対応もできて便利


site: http://develo.org/border-image-after

ボックスの周りに装飾として画像を置きたい場合に背景画像で対応するのもいいのですが
3つに切って・・。真ん中を繰り返しして・・。
さらに透過だった場合どこのタグに背景をいれるか工夫したりするのが大変だなぁと思っていました。

そういう場合はborder-imageを使ったりしていたのですが
border-imageを使うとborder-width分コンテンツが内側によっちゃいますよね・・。
まぁborderなので当たり前ですが・・。
しかも普通にやると画像だけ1/2にすることができないので、Retina対応とかできないんです。

でもこれafterとかbeforeに指定したらborder-widthとか気にせずに使えるんじゃない！？
と思って試してみたらめちゃめちゃ便利！しかもRetina対応もできちゃうし！

みなさんも是非使ってみてください。

[DEMO](http://jsrun.it/kamem/ozK6)

イメージとしてはafterかbeforeをつかってborder-imageを<em>absolute</em>の<em>width,heightともに100%</em>にしてコンテンツの上にかぶしちゃおうという感じです！  
ただしかぶしちゃうと中のリンクがきかなくなっちゃうので、中身のほうが<em>z-index</em>が高くなるように設定してあげればよいかと思います。

さらにさらに、<em>zoomを0.5</em>にすることによってRetinaにも対応出来ちゃいます！  
いいコトづくしじゃん！

HTML
---
<pre class="prettyprint lang-html"><code>&lt;div&gt;
	&lt;h2&gt;normal&lt;/h2&gt;
	&lt;p&gt;...&lt;/p&gt;
&lt;/div&gt;</code></pre>


CSS
---
### 通常
<pre class="prettyprint lang-css"><code>.normal {
	border-width: 100px;
	-moz-border-image: url(http://jsrun.it/assets/n/T/2/b/nT2bz.png) 100 repeat;
	-webkit-border-image: url(http://jsrun.it/assets/n/T/2/b/nT2bz.png) 100 repeat;
	-o-border-image: url(http://jsrun.it/assets/n/T/2/b/nT2bz.png) 100 repeat;
	border-image: url(http://jsrun.it/assets/n/T/2/b/nT2bz.png) 100 fill repeat;
	box-sizing: border-box;
}</code></pre>

### afterを使った場合

<pre class="prettyprint lang-css"><code>.after {
	position: relative;
}

.after:after {
	content: '';
	display: block;
	width: 100%;
	height: 100%;
	position: absolute;
	top: 0;
	left: 0;
	border-width: 100px;
	-moz-border-image: url(http://jsrun.it/assets/n/T/2/b/nT2bz.png) 100 repeat;
	-webkit-border-image: url(http://jsrun.it/assets/n/T/2/b/nT2bz.png) 100 repeat;
	-o-border-image: url(http://jsrun.it/assets/n/T/2/b/nT2bz.png) 100 repeat;
	border-image: url(http://jsrun.it/assets/n/T/2/b/nT2bz.png) 100 fill repeat;
	box-sizing: border-box;
	zoom: 0.5; /* Retina対応 */
}

.after > * {
	position: relative;
	z-index: 1;
}</code></pre>

border-imageってなんかいまいち使いづらいなぁと思っていたので、これを思いついてからすごい使いやすくなった気がします！  
border-imageを使って作業を楽にしちゃいましょー。

ちなみにジェネレーターは[border-image-generator](http://border-image.com/)を使うと簡単に設定できちゃいます。
CoffeeScriptが1.9でgenerator構文をサポート

追記: タイトル変更。v1.9 でリリースされました(2015/01/30)

ES6以降にやや慎重な対応をみせるcoffeescriptですが、やっとgenerator構文がサポートされたようです。

[Add yield support · Issue #3073 · jashkenas/coffeescript · GitHub](https://github.com/jashkenas/coffeescript/issues/3073 "Add yield support · Issue #3073 · jashkenas/coffeescript · GitHub")

色々と構文の候補がありましたが、関数ブロックの中にyieldキーワードが存在する場合は自動的にジェネレーター関数になるような仕様に落ち着いたみたいです。


## generator概要(知ってる人は読み飛ばしてよい)

関数ブロックの中でyieldを使うと関数がgenerator化されます。yield化された関数は実行されるとgeneratorを返し、
generatorは.next()を叩くと次のyieldキーワードで渡された値が取得できます。もう一度叩くとその位置から次のyieldキーワード、またはreturnまで実行されます。

これを利用して、たとえば計算状態を保存したまま次のフィボナッチ数を返す関数を作ったりできるわけです。

応用として非同期関数を見た目上同期的に受け取ったりも出来ます(coの例を参照)

基本的な挙動としては、JavaScriptのgeneratorはPythonのgeneratorそのまま移植した感じです。


## 実行環境

今回は node v0.11 と coffeescriptの開発版で動かすとします

```
# node v0.11系をいれる
nodebrew install-binary 0.11
nodebrew use 0.11
npm install jashkenas/coffeescript -g # master の HEADをいれる

# 実行
coffee --nodejs --harmony main.coffee
```

## yiledキーワードで関数をgenerator化

```coffee
x = ->
  yield 0
  yield 1
  yield 2

gen = x() # generatorを生成
console.log gen.next()
console.log gen.next()
console.log gen.next()
```

結果

```
{ value: 0, done: false }
{ value: 1, done: false }
{ value: 2, done: false }
{ value: undefined, done: true }
```

yield式自体はundefinedと評価されているっぽいですね(最後のyieldが暗黙のreturnされてる)
とはいえ普通のユースケースを考えるとdo式使ってこう書く感じになりそう

```coffee
x = do ->
  yield 0
  yield 1
console.log x.next().value
console.log x.next().value
```

## yield from

あるgeneratorが別のgeneratorに依存するすることもできます

```coffee
x = do ->
  yield from do ->
    for i in [3..4]
      yield i
```

イマイチ使いどころ

## coで同期的に実行する

coを使うと非同期関数の呼び出しを見た目上同期的に書くことができます！！！
この例はPromiseを使います。(coの使用例見る限りピュアなcallbackとかもサポートしているみたいですが)

```coffee
co = require 'co'

# sleep :: Int -> Promise Int
sleep = (ms) -> new Promise (done) ->
  setTimeout (-> done ms), ms

# serialize
do co ->
  console.log 'sleep 1'
  a = yield sleep(1000)
  console.log 'sleep 2'
  b = sleep(500)
  console.log 'sleep 3'
  console.log a, b
```

僕はこれがやりたいがためにgeneratorを待ってたといっても過言ではないです。


## ところでgeneratorっていつ使えるの

Nodeは実行環境を限定できるので(オプション付きですが)使えるようになるでしょう
Firefoxは実は昔からサポートしていて、Chromeも開発チャンネルだと有効化されてるんでしたっけ。node-webkitやAtom Shell、Chrome拡張, Firefox拡張だと動作環境を限定できるのでとくに問題無いです。


generator使うにしろ使わないにしろ、非同期部分をPromise化しておくと嬉しいはずです。


で、書いたあとに気づいたけど http://qiita.com/pomutemu/items/3e0c02aa4391f38a2901 の記事があったけど勿体無いので貼っとく
スペルミスでエラーが出たら、正しい名前を教えてくれる gem を作った

スペルミスでエラーが発生して「おかしい、どこもおかしくない…」みたいなことが良くあるので、正しそうな method や class, attribute があったら教えてくれる gem を作った。

## [yuki24/did_you_mean](https://github.com/yuki24/did_you_mean)

```ruby
gem 'did_you_mean', group: [:development, :test]
```

*binding\_of\_caller* とか *debug\_inspector* を使っているので、本番環境では絶対に使ってはダメだ。

### ローカル変数の名前やメソッド名を間違えた場合

```ruby
class User
  attr_accessor :first_name, :last_name

  def to_s
    "#{f1rst_name} #{last_name}" # f1rst_name ???
  end
end

user.to_s
# => NameError: undefined local variable or method `f1rst_name' for #<User:0x0000000928fad8>
#
#     Did you mean? #first_name
#
```

### クラス名を間違った場合

```ruby
class Book
  class TableOfContents
    # ...
  end
end

Book::TableofContents # TableofContents ???
# => NameError: uninitialized constant Book::TableofContents
#
#     Did you mean? Book::TableOfContents
#
```

### public なメソッド名を間違えた場合

```ruby
# In a Rails controller:
params.with_inddiferent_access
# => NoMethodError: undefined method `with_inddiferent_access' for {}:Hash
#
#     Did you mean? #with_indifferent_access
#
```

### ActiveRecord モデルのカラム名を間違えた場合

```ruby
User.new(nmee: "wrong flrst name")
# => ActiveRecord::UnknownAttributeError: unknown attribute: nmee
#
#     Did you mean? name: string
#
```

## 実際に助かった時の図

![did_you_mean.png](https://qiita-image-store.s3.amazonaws.com/0/225/bb9563e1-8b3e-b885-4aa0-341989123be3.png)

あと、URL helper が提供するメソッド（`users_path` とか）が、複数形なのかどうかよく忘れるので、そういうときも結構助けられます。



ぜひ使ってみて、フィードバック下さい！
OAuthでomniauth-facebookが何をやっているかを見てみた

## 背景

omniauthを使ってFacebookとのOAuthをやってみた、といった記事はネット上にたくさん転がってる。
けど、どうやって実現しているかについて、詳細を解説しているサイトを見かけたことがなかったのでまとめておく。

## 対象バージョン

* omniauth (1.2.1)
* omniauth-oauth2 (1.1.2)
* omniauth-facebook (1.6.0)


## omniauth-facebook

アプリとFacebookとの間に立ってFacebookとのOAuthをしてくれるgem。
中核となるOmniAuth::Strategies::Facebookクラスはrack middlewareになっていて、特定のパスへのアクセスを起点にOAuthのリクエスト開始・Callback処理を行う仕組みになっている。


#### 継承関係

OmniAuth::Strategies::Facebookの継承関係は以下の通り。

![Class Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/17647/74aa62c7-731f-d2ce-48bb-6c55cbf0e92a.png)

OAuthの基本的な機能やrack middlewareとしての機能についてはOmniAuth::Strategyに実装されている。
OAuth2.0に関連する部分はOmniAuth::Strategies::OAuth2に、
Facebookに関わる部分がOmniAuth::Strategies::Facebookに実装されている。


#### シーケンス

大きく以下の3つのフェーズに分けられる。
ざっくりとしたシーケンスは下図参照。

* FacebookへのOAuthリクエスト (下図 2)
 * /users/auth/facebookへのリクエストをフックする
 * 必要なパラメータを埋めてFacebookへリダイレクトする
* Facebookでの認証 (下図 3,4)
 * 認証・アプリ認可する
* Callback処理 (下図 5)
 * Authorization Codeを元にアクセストークン取得
 * アクセストークンを使ってユーザ情報取得
 * ユーザ情報からAuthHashを生成してenvに埋める
 * アプリをコールする

![Qiita20140926_omniauth-facebook.jpg](https://qiita-image-store.s3.amazonaws.com/0/17647/84198354-2e51-b8ad-f7c2-1b2c3c4ab5b9.jpeg)

AuthHashはアプリケーションで認証情報やユーザ情報を扱うための情報が入ったhash。
詳細は[こちらを参照](https://github.com/mkdynamic/omniauth-facebook#auth-hash)。



#### クラス図

主な登場人物は

* application
* omniauth-facebook (omniauth, omniauth-oauth)
* oauth2
* facebook

![Qiita20140926_omniauth-facebook_class.jpg](https://qiita-image-store.s3.amazonaws.com/0/17647/11f9d08a-9f14-6782-552c-88687c5a2869.jpeg)

特定のパスへのアクセスをhookしてomniauth-facebookでhook。
omniauth-facebookとFacebookとのやりとりにはoauth2が使われている。
その際のHTTPクライアントはfaraday。
OAuthの基本的な登場人物 (アクセストークン、Authorization Code等)はOAuth2に抽象化されていることが分かる。
AuthHashはomniauthの概念なので、omniauthに定義されている。
Cakephp + Bootstrap で ドロップダウンボタン

もう少しきれいになりそうではあるが

# Helper

```php
	public function dropDown($name, $links = array()) {
		return $this -> Html -> tag("div", join("", array(
			"",
			$this -> Form -> button("SELECT<span class='caret'></span>", array(
				"",
				"class" => "btn btn-default dropdown-toggle",
				"id" => $name,
				"data-toggle" => "dropdown"
			)),
			$this -> Html -> nestedList($links, array(
				"class" => "dropdown-menu",
				"role" => "menu",
				"aria-labelledby" => $name
			), array("role" => "presentation"))
		)), array("class" => "dropdown"));
	}
```

# View

```php
<?php echo $this -> FormAssist -> dropDown("link1", array(
				$this -> Html -> link("Users", array(
					"plugins" => "admins",
					"controller" => "users",
					"action" => "index"
				), array(
					"role" => "menuitem",
					"tabindex" => -1
				)),
				$this -> Html -> link("Addresses", array(
					"plugins" => "admins",
					"controller" => "addresses",
					"action" => "index"
				), array(
					"role" => "menuitem",
					"tabindex" => -1
				)),
			));
 ?>
muninの3分間チューニング

## はじめに

お手軽で便利なモニタリングツールの<strong>munin</strong>ですが、セットアップが簡単で見た目も重くなさそうなので、小規模なプロダクト（サーバ）では比較的使っているケースが多いかと思われます。
ただ、実はこの子そのままだとリソースばっかり食ってしまってどうしようもないんですよね。
5分おきにグラフを生成したりするので、言い換えれば5分おきにPerlのバッチ処理が走る事になります。
しかもその処理にはシステム情報を取るスクリプトも含まれているので、色々巻き込んで大変なことに。
EC2のt1.microインスタンスあたりでは、こいつだけでCPUもメモリもほぼ100％食いつぶすなんてこともあります。
なので、ここで簡単にできるチューニングをまとめます。

## 手順1. 実行間隔の調整

muninは/etc/cron.d/muninで定義した通りにcronで実行されます。
デフォルトでは以下の通りです。

```lang:/bin/bash
# vi /etc/cron.d/munin

#
# cron-jobs for munin
#

MAILTO=root

*/5 * * * *     munin test -x /usr/bin/munin-cron && /usr/bin/munin-cron
```
/usr/bin/munin-cronは、引数を特に与えなければ/usr/bin/munin-update（各データを取得する）と/usr/bin/munin-graph（各データのグラフを生成する）と/usr/bin/munin-html（muninのページ全体を更新する）の3つを順次実行します。
つまり、デフォルトのままでは、バカ正直に上記3つを5分毎に繰り返しているということになります。
munin-updateはともかくとして、munin-graphは別にさほど急いで更新されなくても問題ないケースが大半です。
ましてmunin-htmlなど1日1回も更新すれば十分なので、ここは3つそれぞれ分離してしまいましょう。
そうすると、こんな感じです。

```lang:/bin/bash
# vi /etc/cron.d/munin

MAILTO=root

*/5 * * * *     munin test -x /usr/bin/munin-cron && /usr/bin/munin-update
10 */1 * * *    munin test -x /usr/bin/munin-cron && /usr/bin/munin-graph
30 08 * * *    munin test -x /usr/bin/munin-cron && /usr/bin/munin-html
```
なお、1時間おきにする場合は、なるだけ00分などlogrotateやその他cronとバッティングしないように調整しましょう。
グラフ生成は比較的負荷がかかります。

## 手順2. 不要なプラグインを外す
munin-node-configureという便利ツールを使用すると、プラグインを自動的にインストールしてくれます。
これはほんとうに便利なんですが、例えば「NTPなんて見ないよ！」「mysqlはRDSにしちゃったし他で管理するからいいや！」なんてことになった時に意外と外すのを忘れがちです。
プラグインは以下の場所にあります。

```lang:/bin/bash
# ls -l /etc/munin/plugins
lrwxrwxrwx 1 root root 40  1月 28 19:54 2013 apache_accesses -> /usr/share/munin/plugins/apache_accesses
 /usr/share/munin/plugins/uptime
lrwxrwxrwx 1 root root 31  1月 23 18:13 2013 vmstat -> /usr/share/munin/plugins/vmstat
```
外し方は簡単で、このシンボリックリンクをrmコマンドで削除してmunin-nodeを再起動するだけです。
これだけでもmunin-updateやmunin-graphを実行する際の負荷がかなり変わります。

## 手順3. 外部連携を極力なくす
設定していないことも多いと思われますが、muninはlocalホスト以外にも外部のmunin-nodeの生成したデータを参照することが可能です。
しかしこれは便利な一方で参照する側・される側両方の負荷の温床にもなります。
停止したサーバや関係のなくなったサーバの設定は逐次/etc/munin/munin.confから削除しましょう！

## 手順4. Perlをアップデートする
muninの大半の部分はPerlで書かれています。
Perlは大分枯れて安定している言語ですが、今でもちょくちょくアップデートが配信されています。
Perlのアップデートでパフォーマンスが上がることも考えられるので、ぜひアップデートしておきましょう！
※ muninもPerlもyumなどのパッケージでインストールしていれば基本的に問題ありませんが、依存性に十分ご注意ください。



muninは時代遅れと言われることはありますが、お手軽かつ比較的信頼性の高いツールなのでまだまだ現役張っていけると思います。
中身をイジイジすることも簡単にできるので、そっちのチューニングにも今後手を伸ばしてみたいとおもいます。
IE の Date.parse と微妙に違う ISO 8601 の話

　客先から「IE で、日付が表示されてないよ」と問い合わせがありました。Google Chrome だと問題ないので、気付きませんでした。よくあることのような気がするので、調べた結果をまとめます。

　問い合わせのあった部分は、データベースに格納された日時を文字列で出力して javascript の Date.parse にかけていました。たとえば、次のような処理です。`Date.parse("2014-09-22 07:16:37.294268")` 指摘されたとおり、これをIEで実行すると `NaN` が帰ってきました。短くして `Date.parse("2014-09-22")` でも同じです。なんということでしょう。

　[Microsoft のドキュメント](http://msdn.microsoft.com/ja-jp/library/ie/ff743760(v=vs.94).aspx) には、最初に `Date.parse` は [ISO 8601](http://ja.wikipedia.org/wiki/ISO_8601) 形式で解釈しようとする、失敗したら別の方法で解釈する…というような事が書いてあります。よくよく眺めてみると、データベースから取り出した日時は微妙に ISO 8601 を満たしていません。日付と時間の区切り文字が半角スペースになっています。wikipedia によると、正しい ISO 8601 は T で区切られるもののようです。そこで、今度は修正して `Date.parse("2014-09-22T07:16:37.294268")` を実行しました。今度は、期待したとおりの結果が帰ってきました。

　使っているデータベースは PostgreSQL です。どうしてこのような独自形式で日時を返すようになっているのでしょうか。[Postgres のドキュメント](https://www.postgresql.jp/document/9.1/html/datatype-datetime.html) の 8.5.2 節を読んでみると、ISO 8601 で出力していることになっているようです。ここには T の区切り文字は登場しません。よくわかりませんね。

　ExtJS にある `Ext.Date.parse` を使えば、T のあるなしに関わらず解析できます。ただし、このメソッドは第二引数に、解釈に使用するパターンを与えなくてはいけません。ISO 8601 で解釈させるには `"c"` を与えます。たとえば、`Ext.Date.parse("2014-09-22 07:16:37.294268", "c")` のように書きます。とりあえずこれを使うことにして問題は解決しましたが、PostgreSQL の挙動や Date.parse の挙動は釈然としないものがあります。

追記： Document Mode が IE7 や IE8 の場合、Date.parse が ISO 8601 に対応していないようです。危険ですね。
Javascriptで簡単にスタックトレースを出力する(Chrome限定)

以下の記事を見ていて思ったのですが、

http://qiita.com/halhide/items/caf81a7166d92dcfdcd1

どうせChromeに限定するのであれば、console.error("message")とすれば、catchされない例外と同じフォーマットでスタックトレースを出力してくれます。Chrome以外は対応していませんが、エラーにはならず普通にコンソール出力されるだけです。

任意のフォーマットでスタックトレースを出力したい時には使えませんが、単にエラー箇所を知りたい時、エラー出力のラッパーを作りたいだけのとき、普通にthrowすると予期しない場所でcatchされてしまい、スタックトレースが見られないというときなどに重宝します。
EC2上でCoffeeFormationを利用するまでのメモ

# はじめに
備忘録として記載します。
CoffeeFormationについては以下URLを参照してください。
- [CoffeeFormation](http://qiita.com/j3tm0t0/items/37af51dbe302ad46ad7a)
- [CoffeeFormation 1.0.1 update](http://qiita.com/j3tm0t0/items/ee46a6c25f51755bc5b0)

# 手順
EC2はデフォルトインストールされた状態を想定

```/bin/bash
// nodejs npmをインストールするためにepelリポジトリから取得
$ sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install -y --enablerepo=epel nodejs npm
// npmコマンドでCoffeeFormationに必要なパッケージをインストール
$ sudo npm install -g inherits
$ sudo npm install -g csfn
$ sudo npm install -g coffee-script
// EC2上からCloudFormationへ連携できるように設定
$ vi ~/.awscredential
 // 新規作成
 AWSAccessKeyId=[Your AWS AccessKeyId]
 AWSSecretKey=[Your AWS SecretKey]
$ vi ~/.bashrc
 // 最終行に以下を追記
 export AWS_CREDENTIAL_FILE=~/.awscredential
$ . ~/.bashrc
```

**Let's enjoy CoffeeFormation!**
ActionScript3でリフレクションを利用してメソッドへアクセスする

これを使うとメソッドへ動的アクセスすることができます。

```as3
public function Main():void 
{
	//	thisに文字列指定で呼び出せる
	this["hoge"] ();
	
	//	Functionオブジェクトを利用しても呼び出せる
	var fnc : Function = this["hoge"] as Function;
	fnc.call ();
}

public function hoge () : void
{
	trace ( "hoge!" );
}
```

###おまけ
オブジェクトの中のメソッドを列挙する(Publicメソッドのみ)

```as3
import flash.utils.describeType;

public function Main():void 
{
	 var description:XML = describeType(this);
	 for each ( var obj : XML in description.method )
	 {
		 trace ( obj.@name );
	 }
}

public function hoge1 () : void
{
}

public function hoge2 () : void
{
}

public function hoge3 () : void
{
}

public function hoge4 () : void
{
}
```
dockerコンテナからマウントしたホストディレクトリへの操作が拒否される

#事象
コンテナからマウントしたディレクトリに対して操作を行うとアクセスが拒否される。

たとえばこんなコマンドを実行する。

```bash
docker run -i -v ${PWD}/hostdir:/guestdir -P centos touch /guestdir/test.txt
```
アクセス拒否され失敗する。

```bash
touch: cannot touch '/guestdir/test.txt': Permission denied
```

#原因
SELinuxが邪魔している可能性がある。

SELinuxのが有効か無効かを`getenforce`コマンドで確認
実行結果が`Enforcing`だとSELinuxが有効になっている。

#回避する方法は２つ

##その１：SELinuxを無効にする

一時的にSELinuxを無効にするには、

```bash
setenforce 0
```


##その２：`privileged`オプションを指定する

`docker run`コマンドを実行時に`--privileged`オプションを指定する。

```bash
docker run --privileged -i -v ${PWD}/hostdir:/guestdir -P centos touch /guestdir/test.txt
```

詳しくは、docker runコマンドのリファレンス参照
[Runtime Privilege, Linux Capabilities, and LXC Configuration](http://docs.docker.com/reference/run/#runtime-privilege-linux-capabilities-and-lxc-configuration)
Ransackで日付型のFrom-To検索をする


ちょっとやり方がわからなかったので。
GithubのIssueに書いてありました。

Create a 'between' query with ransack?
https://github.com/activerecord-hackery/ransack/issues/101



### View

```html:hoge.html.erb
<%= f.label :created_at_gteq %>
<%= f.text_field :created_at_gteq %>

<%= f.label :created_at_lteq %>
<%= f.text_field :created_at_lteq %>
```


### Console

```shell
Item.search(:created_at_gteq => "2014-09-10", :created_at_lteq => "2014-09-25").result.to_sql

=> "SELECT `items`.* 
FROM `items`  
WHERE ((`items`.`created_at` >= '2014-09-10 00:00:00' 
AND `items`.`created_at` <= '2014-09-25 00:00:00'))"
```
xcodebuildで使えるSDKのリストを表示する

Xcodeをバージョンアップして、コマンドラインでビルドするときに指定するSDKがわからなくなったら、
以下のコマンドで調べられます。

```
$ xcodebuild -version -sdk

MacOSX10.9.sdk - OS X 10.9 (macosx10.9)
SDKVersion: 10.9
Path: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
PlatformVersion: 1.1
PlatformPath: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform
ProductBuildVersion: 13F26
ProductCopyright: 1983-2014 Apple Inc.
ProductName: Mac OS X
ProductUserVisibleVersion: 10.9.5
ProductVersion: 10.9.5

iPhoneOS8.0.sdk - iOS 8.0 (iphoneos8.0)
SDKVersion: 8.0
Path: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk
PlatformVersion: 8.0
PlatformPath: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
ProductBuildVersion: 12A365
ProductCopyright: 1983-2014 Apple Inc.
ProductName: iPhone OS
ProductVersion: 8.0

iPhoneSimulator8.0.sdk - Simulator - iOS 8.0 (iphonesimulator8.0)
SDKVersion: 8.0
Path: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk
PlatformVersion: 8.0
PlatformPath: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform
ProductBuildVersion: 12A365
ProductCopyright: 1983-2014 Apple Inc.
ProductName: iPhone OS
ProductVersion: 8.0

Xcode 6.0.1
Build version 6A317
```
MarkdownからWordやPDF生成ができるようにする (またはPandoc環境の構築方法) (2014/09版)

> [ブログエントリ](http://k1low.hatenablog.com/entry/2014/02/16/205839)の内容を最新情報に変更しています。改めて環境を作ったら一部パッケージ名などが変わっていたので。

## Pandoc

[Pandoc](http://johnmacfarlane.net/pandoc/) は「a universal markup converter」という説明のとおり、あるマークアップ言語で書かれたドキュメントを他のドキュメント形式に変換するツールです。

### 前提

- Mac OS X (Marvericks)
- Homebrew

### Pandocのインストール

PandocはHaskell製のツールなのでまず、Haskellの環境の構築

    $ brew install haskell-platform

同時にHaskellのパッケージマネージャのcabalもインストールされるので、cabalにPATHを通します

    export PATH=$PATH:/Users/k1low/.cabal/bin

cabalを利用してpandocをインストール

    $ cabal update

    ...
    Note: there is a new version of cabal-install available.
    To upgrade, run: cabal install cabal-install

    $ cabal install cabal-install
    $ cabal install pandoc


ここまでで``pandoc``コマンドでMarkdownファイルをWord(.docx)に変換できます。

    $ pandoc input.md -o output.docx

### PDF出力環境のインストール

PandocでのPDF出力はLaTeXを通して実行しているので、日本語LaTeX環境を作る必要があります。

今回は日本語LaTeX環境としてLuaTeX-jaを使うことにしました。

### MacTeXの最小構成をインストール

MacにTeX環境を構築するMacTeXをそのままインストールすると相当大きいので、[BasicTeX](http://www.tug.org/mactex/morepackages.html)だけインストールします。

    $ brew install basictex

``tlmgr``というTeX用のパッケージマネージャがインストールされるので、まずはPATHを通します。

    export PATH=$PATH:/usr/texbin/

``tlmgr``で必要なパッケージをインストールします。

    $ sudo tlmgr update --self
    $ sudo tlmgr update --all
    $ sudo tlmgr install collection-langjapanese collection-latexrecommended collection-fontsrecommended


ここまでで``pandoc``コマンドでMarkdownファイルをPDF(.pdf)に変換できます。

    $ pandoc input.md -o output.pdf -V documentclass=ltjarticle --latex-engine=lualatex

## 使用してみた感想

- やはり表操作はExcelが最強。ただ、それを諦めてでも方眼紙Excelよりかはかなり気分が良い。
- Wordは「変換したものをそのまま納品する」という夢のようなことは難しい。
    - 逆に言えば「変換したものを体裁を整える前提」なら全然あり。
    - PDF出力のほうならLaTeXのdocumentclassを作り込んだらいけるかも。

## 参考URL

- http://sky-y.github.io/site-pandoc-jp/users-guide/
- http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee
- http://blog.mitaki28.info/5/
- http://tex.stackexchange.com/questions/75166%E3%81%97%E3%82%85%E3%81%86%E3%82%8A/fontenc-with-t1-option-gives%E3%81%97%E3%82%85%E3%81%86%E3%82%8A-error-font-not-loadable-metric-tfm-file-not
iOS8でUITableViewCellの並び替えを実行したときにセル上の並び替えアイコンが消える


iOS8の端末?iOS8 SDKでビルドした場合?にセクションを跨いだセルの移動を実装したときに並び替えのアイコンが消えるという現象が発生しました。  
解決策としては、cellForRowAtIndexPathでCellに対してsetEditingを行うことで対応可能みたいです。  
とりあえず、これで動いていますが間違ってるかもしれません。

```obj-c
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
        [cell setEditing:NO animated:YES];
        return cell;
}

```
iptablesを使ったbashの脆弱性対策のワークアラウンド

最近話題のbash脆弱性、[JPCERTからも注意喚起](https://www.jpcert.or.jp/at/2014/at140037.html)がでています。

Redhatからも Bashのcodeインジェクションの問題についてのページが提供されています。

[Resolution for Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271) in Red Hat Enterprise Linux](https://access.redhat.com/articles/1200223)

この中に以下のiptablesをつかったワークアラウンドがありました。

```lang:bash

# iptables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP 
# ip6tables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP

```

**28 29 20 7B** は でexploitに使われる無名関数**'() {'** の16進数表示です。ただ、これってスクリプトの関数定義等であればどこでも使われそうな文字列なので、
パッケージ中のこの文字列があると問答無用でドロップされるというのは怖い感じです。ただ、完全修正されたパッチが9/26 10:00 JST現在ないはずなので、自分の個人環境には適用しようとおもいます。DeepSecurityが個人利用できればいいんですけど。。。

備忘のため[原因に言及しているtweet](https://twitter.com/tetsutalow/status/515065405518270464)も書いておきます。なるほど。
チェックボックスが効かなくなるlabelとinput要素のヒモ付けの妙

久しぶりにHTMLではまったメモです。

```html
<label>
<input type="checkbox">メルマガを受け取る
</label>
```

みたいなよくあるラベルの使い方をしているHTMLを組んで、
Railに組み込んでフォーム系の機能でよくある実装をしたら、
FirefoxやIEでチェックボックスが効かなくなるという不思議な事態に陥りました。Chromeは大丈夫。

JSで`change`イベントも取れないので、ブラウザのバグとかCSSみたいなレベルじゃない感じがしたので調べてみました。

Webインスペクタで出力されているHTMLをみると次のような感じ。

```html
<label>
<input type="hidden" name="hogehoge[mailmagazine]">
<input type="checkbox" name="hogehoge[mailmagazine]">メルマガを受け取る
</label>
```

チェックボックスの直前に`input[type='hidden']`要素が入っていて、これはどうやらRails側で挿入されるものらしいです。

この時点で条件がいくつか考えられるので、jsdo.itでサンプルをつくって検証してみました。

http://jsdo.it/yd_niku/8Pcu/

どうやらラベルにひもづけられる子要素のコントロールは出現順で最初の1つのみのようです。

結果的に`label`要素が`input[type='hidden']`要素に紐付いてしまうため、子要素であってもラベルとチェックボックスのほうとは連動しない、ということのようです。

今回は、(Railsの中身の処理を変えられないこともあり)`id`属性と`for`属性で明示的にヒモ付けることで回避することがきました。

```html
<label for="hoge">
    <input type="hidden">
    <input type="checkbox" id="hoge">
    メルマガを受け取る
</label>
```

よく考えれば当たり前な挙動ですが、Chromeでは動いちゃったりもあり、`label`要素は必ずクリッカブルなフォームコントロールに紐づくという思い込みではまってしまったなーというオチでした。
【ZF2】モデルでのスキーマ指定

# 【ZF2】モデルでのスキーマ指定 #

zf2でスキーマを指定する場合は、　　
**TableGateWay**を初期化する際第一引数にテーブル名の文字列を渡す代わりに、
下記のようにスキーマを指定した**TableIdentifier**のオブジェクトを渡す。

    
    public function setDbAdapter(Adapter $adapter, $schema = 'default')
    {
     $table = new \Zend\Db\Sql\TableIdentifier($this->tableName, $schema);
     $tableClassName = 'Application\Model\Table\\' . $this->tableClassName;
     $resultSetPrototype = new ResultSet();
     $resultSetPrototype->setArrayObjectPrototype(new $tableClassName());
     $this->gateway = new TableGateway($table, $adapter, null, $resultSetPrototype);
     }
    

## ZF2変わり過ぎ！ ##
クラスオートロードやイベント管理、Actionヘルパーの廃止など、
かなり別ゲーになっているので、続編だと思って油断していると　　
マイグレーションの際に(´・ω・`)ってなる　　　

[http://stackoverflow.com/questions/16133393/zend-framework-2-action-helper](http://stackoverflow.com/questions/16133393/zend-framework-2-action-helper "Zend framework 2 action helper? - Stack Overflow")
> This only reduces your work of migration you will be loosing lots of advantages of ZF2 and also you can't really exploit the features of a framework .
Gitで使用できる環境変数

`GIT_AUTHOR_NAME`とか`GIT_DIR`とか`GIT_SSH`とか環境変数を設定して`git`コマンド実行しているサンプルをたまに見るけど、環境変数の一覧みたいなのはどこにあるんだろうと探してみました。

```sh
$ man git
```

の

`ENVIRONMENT VARIABLES`ってところにありました。

- GIT_INDEX_FILE
- GIT_INDEX_VERSION
- GIT_OBJECT_DIRECTORY
- GIT_ALTERNATE_OBJECT_DIRECTORIES
- GIT_DIR
- GIT_WORK_TREE
- GIT_NAMESPACE
- GIT_CEILING_DIRECTORIES
- GIT_DISCOVERY_ACROSS_FILESYSTEM
- GIT_AUTHOR_NAME
- GIT_AUTHOR_EMAIL
- GIT_AUTHOR_DATE
- GIT_COMMITTER_NAME
- GIT_COMMITTER_EMAIL
- GIT_COMMITTER_DATE
- EMAIL
- GIT_DIFF_OPTS
- GIT_EXTERNAL_DIFF
- GIT_DIFF_PATH_COUNTER
- GIT_DIFF_PATH_TOTAL
- GIT_MERGE_VERBOSITY
- GIT_PAGER
- GIT_EDITOR
- GIT_SSH
- GIT_ASKPASS
- GIT_CONFIG_NOSYSTEM
- GIT_FLUSH
- GIT_TRACE
- GIT_TRACE_PACK_ACCESS
- GIT_TRACE_PACKET
- GIT_LITERAL_PATHSPECS
- GIT_GLOB_PATHSPECS
- GIT_ICASE_PATHSPECS
- GIT_REFLOG_ACTION

たくさんある！

Gitに関する自動化をするときに指定してあげると便利になると思うので、それぞれどういうときに使えるのか調べたい。でも全部使う事はあまりないのかな。
SIerを退職する前に身につけておきたいスクショの撮り方

kawasimaです。SIerです :whale2: 

http://togetter.com/li/701166

少々前にこういう話が盛り上がっていたようですが、イマドキSIerがどうやってExcelスクショを撮っているか世間的に認知されていないようなので、お話しておこうと思います。

## スクショの撮り方

世間ではいろいろツール化されているようですが、テストのためのスクショなので、スクショメインのツールでは本末転倒です。そこで、Seleniumと統合したテスト用ブラウザを開発しています。

https://github.com/kawasima/teslogger/

### セットアップ

jarファイルをダウンロードし実行します。 WindowsならばjarファイルをExplorerからダブルクリックするだけです。
https://github.com/kawasima/teslogger/releases

使うブラウザに応じてドライバのインストールが必要です。

* [IE](https://code.google.com/p/selenium/wiki/InternetExplorerDriver)
* [Chrome](https://code.google.com/p/selenium/wiki/ChromeDriver)
* [Firefox](https://code.google.com/p/selenium/wiki/FirefoxDriver)

### 使い方

無事起動すると、以下のようなスプラッシュ画面が立ち上がります。

![splash](http://farm8.staticflickr.com/7380/12337541364_831cf0d17d.jpg)

テストしたいブラウザを選択してください。
そうすると、ブラウザとカメラアイコンのついたミニウィンドウが表示されます。

![](http://farm4.staticflickr.com/3723/12337541054_b2a2ab24f6.jpg)

適当に遷移して、カメラボタンを押すと

![](http://farm8.staticflickr.com/7432/12337542764_9ed4cb6d39.jpg)

jarファイルの位置にscreenshotsというディレクトリが作られ、その下にキャプチャ画像が撮られていきます。

![](http://farm6.staticflickr.com/5548/12337540424_b46a23cff4.jpg)

「Test Case Id」の欄にテストケースのIDを入力しておけば、screenshotsのディレクトリ下にケースIDのディレクトリが作られます。

※ ウィンドウ下の「OK」「NG」ボタンは、将来的に使う予定のもので、現在(v0.1.0)は押しても何も動作しません。


### 自動テストで使う

ここまでは手動のテストでの使い方ですが、Seleniumで作っているので当然、自動テストもシームレスにできます。

以下のような、簡単なスクリプトを書いておき、ウィンドウ左上の「Load」ボタンを押すとファイルダイアログが開くので、スクリプトのファイルを選択します。

```clojure
(to "http://www.google.com")
(take-screenshot)
(input-text "#gbqfq" "clojure")
(implicit-wait 3000)
(click "#gbqfba")
```

そうすると、自動的にテストを実行してくれます。キャプチャを取りたいタイミングで`(take-screenshot)`を書いておくと、同じくscreenshotsに撮られていきます。

スクリプトは[clj-webdriver](https://github.com/semperos/clj-webdriver)を使っていますので、どういうコマンドがあるかは[そちらのAPI](https://github.com/semperos/clj-webdriver/wiki/Taxi-API-Documentation)をご確認ください。

clj-webdriverの優れた点は、Selenium１時代の簡単な表記のノリでSelenium2のWebDriverが動かせるというところですね。これならSIerがExcelからテストスクリプトを出力するのも簡単ですね :smirk: 

## この程度ならVBAでもできるんだけど…

そうですね。
これまでスクショに関しては、数多くのSIerがあまたの使いやすいオリジナルツールを開発してきたことでしょう。

ですが、Excelスクショの世界は、キャプって終わりではなく

* 取得したスクショを過不足なく集めるのって骨が折れる
* スクショに対しての説明書きの追記は?
* Excelへのキレイに貼り付けるのが大変なんだけど…
* データベースの更新内容のエビデンス取得も要るよね?

などなど、まだまだ課題があります。

これらに関しても、実は解決策は作ってあります。続きはClojure夜会にてお話いたします。ぜひ足を運んでみてください！

http://01e8c979c4e57f83dd63bf3d4a.doorkeeper.jp/events/14626

(2014/10/16 追記)
Clojure夜会で発表したスライドで、上記課題について触れております。ご参照ください。

http://www.slideshare.net/kawasima/excel-40109001
bashのshellshockについて(メモ)

ようやく終息が見えてきたbashのアレ(shellshock)についてのメモ

!!!内容無保証!!!



 
## 最初の脆弱性確認コマンド (CVE-2014-6271)

```console:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
```
 
↑は各ディストリビュータでパッチが出てるのでそれを適用すればとりあえず再現しなくなります。
すでにbotが上記脆弱性を狙った攻撃を仕掛けているので、すぐさまパッチなりアップデートを当てたほうがいいです。

→(UPDATE)悪意のあるDHCPサーバがこれらの脆弱性を使ってdhcpを細工すると、ここに接続されたdhcpクライアントは危険に晒されます。CGIを使っていないから無関係とは言えなくなりました。bashが入っているLinuxやUnix等は必ずアップデートしましょう。
 https://www.trustedsec.com/september-2014/shellshock-dhcp-rce-proof-concept/


  
## CVE-2014-6271の対策があたっていても引っかかりそうなコマンド (CVE-2014-7169系列)

```console:

$ rm -f echo && env X='() { (a)=>\' sh -c "echo date"; cat echo
 
$ rm -f echo && env -i X='() { (a)=>\' bash -c 'echo id'; cat echo
 
$ rm -f echo && env X='() { (a)=>\' bash -c "echo echo unko"; [[ "$(cat echo)" == "unko" ]] && echo "echo is unko!"

```
 
前段でechoファイルを消しているにもかかわらずechoファイルが生成されてしまいます。
これについては、UbuntuではUpdateが来て、これらはFixされました。
Redhat系もUpdateが来ています。


## CVE-2014-7186とCVE-2014-7187 について
7186は構文解析の際にメモリ外のアクセスが起こる可能性がある問題で、7187は深いネストを作った場合に任意コードの実行の可能性があるという問題です。

7186はredhatでは修正されています。
7187はそもそも起こりえない話では？（というか攻撃者は応用できないでしょう）ということですが、とりあえず直されています。

これらはおそらくですが、shellshockで話題になったので他の不味い問題が無いかソースを見直した結果発見されたという感じですね。

これらは残していても今回のshellshockとはさほど関連性が無いため、ubuntuではとりあえず保留みたいです。
→(UPDATE)9/28?29の時点でUbuntuのほうでこれらのセキュリティアップデートがありました。念の為アップデートしておきましょう。

参考　
Bug 1146791 - (CVE-2014-7186) CVE-2014-7186 bash: parser can allow out-of-bounds memory access while handling redir_stack　https://bugzilla.redhat.com/show_bug.cgi?id=1146791

Bug 1146804 - (CVE-2014-7187) CVE-2014-7187 bash: off-by-one error in deeply nested flow control constructs
https://bugzilla.redhat.com/show_bug.cgi?id=1146804

## ルータやアプライアンス製品について

多くの家庭用ルータは製品のFLASH ROMの容量をなるべく少なく済むようにするのが基本ですのでbashではなくbusyboxのashを使います。
今回の問題はbashの特殊な機能(構文)に起因するものなで、ashにはそのようなものはないのでbashのような問題は起こりません。
(ashでテストしましたが上記脆弱性はありませんでした)

ですが、顧客のニーズが高度化していることもあり、独自にbashを導入している事例も考えられます。

但し、機材によってはbashが使われている可能性もなくはないので、心配ならメーカに問い合わせましょう。
また「参考」にかかれているサイトにも各社対応状況等が乗っていますので確認しましょう。
もし、ファームウェアのアップデートがある場合はただちに適用しましょう。
もしくは、web系(外部からルータに入ってブラウザで操作できるなどの)サービスを止めるなど、一時的にサービスを停止することも視野に入れてください。

参考:
Linuxアプライアンス類もBash脆弱性対策を　http://sknn.tumblr.com/post/98562833688/linux-bash
bashの脆弱性、国内メーカーの対応状況　10月1日お昼現在まとめ  http://www.itmedia.co.jp/enterprise/articles/1410/01/news081.html
JVNVU#97219505 GNU Bash に OS コマンドインジェクションの脆弱性(ベンダ情報の欄) http://jvn.jp/vu/JVNVU97219505/

## 影響範囲について

* Linuxをサーバとして運用している場合<BR>影響大です。すぐにUpdateしましょう。できればWAFも併用するとより安心安全です。
* Linuxクライアントとして運用<BR>悪意あるDHCPの問題があるので影響大です。すぐにUpdateを
* Windowsしかつかってないよ<BR>影響はないでしょう
* お家でラズベリーパイを使っていて、HTTPを動かしている<BR>影響大です。すぐにUpdateなりbashにパッチを当てましょう
* Openblocks使ってるんだけど。。。<br>ご愁傷さまです。多分サポートは終わってるのアップデートを待つのは厳しいです。<br>bashのソースを取ってきてRedhatかubuntuの当該パッチを自力で適用してbashの再構築を行いましょう...
* Android(なんたらModとか、または独自で改造したりrootとっている)<BR>改造済みAndroidはrootを取得する段階でbashが入る可能性が高いので、updateできる場合はすぐさまupdateを
* 無改造のAndroidは大丈夫?<BR>問題ありません。androidは独自のshを使っています。
Error: Failed to create the AWS Elastic Beanstalk application version

git aws.pushして下記エラーが出る。

``Error: Failed to create the AWS Elastic Beanstalk application version``

AWSコンソール上で、ElasticBeanstalkアプリケーションの任意のバージョンを削除するとpush成功する。
ElasticBeanstalkアプリケーションは、アプリケーションバージョンを500を上限として作成管理する。
android アニメーションライブラリ


Android View Animations
https://github.com/daimajia/AndroidViewAnimations

EasyAndroidAnimations
https://github.com/2359media/EasyAndroidAnimations

FoldableLayout
https://github.com/alexvasilkov/FoldableLayout

MPAndroidChart
https://github.com/PhilJay/MPAndroidChart

ViewPagerTransforms
https://github.com/ToxicBakery/ViewPagerTransforms

Android Flip 3D View Animation and Transition
https://github.com/genzeb/flip
MacでOpenGLなソースのコンパイルでハマりそうになった

# 背景

glfwのサンプルコードを探して、付属のLinux向けのMakefileを使ってビルドを試みた

# 意図した表示にならない

ビルドが出来たので、動かしたが、VRMAMのゴミが表示される。

# 原因

X11向けのlibGLをリンクしていた為

## 問題ありな実行ファイル

```shell-session
% otool -L glfwsample
glfwsample:
	/usr/local/lib/libglfw.dylib (compatibility version 1.0.0, current version 1.0.0)
	/opt/X11/lib/libX11.6.dylib (compatibility version 10.0.0, current version 10.0.0)
	/opt/X11/lib/libGL.1.dylib (compatibility version 1.2.0, current version 1.2.0)
	/opt/X11/lib/libXrandr.2.dylib (compatibility version 5.0.0, current version 5.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
```

## 正しく表示される実行ファイル

```shell-session
% otool -L glfwsample
glfwsample:
	/usr/local/lib/libglfw.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
	/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
```

# まとめ

Xquartzを入れた環境で、XCode嫌いだとハマるかも。

```
-lX11 -lGL
```

はOSXでは

```
-framework OpenGL
```

に変更すると吉かも。

# 関連記事

- [Macでglfwのサンプルと動かしてハマりそうになった事](http://abrakatabura.hatenablog.com/entry/2014/09/26/044600)
MySQL5.6新機能を利用しないデータの暖気

##MySQLのデータの暖気

システム再起動直後のDBは、データがメモリ上にのっていないために、そのままサービスに投入するとディスクがささる可能性がある。
MySQL5.6からInnoDBのデータを暖気できる機能が実装されたが、それ以前のバージョンのMySQLを利用している場合の暖気方法について簡単にまとめる。

ポイントとしては、InnoDBのprimary keyとテーブルデータの暖気には、SELECT COUNT(*)を使うイメージが強いが、secondary keyのwarmupまで考える場合ではそれだけだと不十分であるというところになると思う。なお下記の暖気方法では、BLOB型やTEXT型には対応していない。

##InnoDB

###テーブルのデータとprimary keyのwarmup

```data_and_primary
SELECT COUNT(*) FROM [テーブル名]
```

###secondary keyのwarmup

下記の疑似コードのような感じでsecondary key毎に暖気する。

```secondary
for [キー] in [キーのリスト]
do
  SELECT COUNT(*) FROM [テーブル名] FORCE INDEX([キー])
done
```


##MyISAM
データディレクトリをcatする。MyISAMのデータ部分については、あくまでOSのページキャッシュの機能を用いて暖気する形になる(RDSのようなマネージドなDBでは実行できなそう)。
指紋認証でログインできるiOSアプリ開発

# パスワード管理アプリ『1Password』が提供
これはネット検索していたときにたまたま見つけた記事です。メモとしてここに記しておきます。

**記事：[【動画アリ】指紋認証でアカウントにログイン！パスワード管理アプリ『1Password』がiOS 8でパワーアップ](http://www.appps.jp/115575/)**

この記事を見る限りだと、パスワード管理アプリ『1Password』を利用しているユーザーが利用できるらしいです。GitHubで公開されているらしいです。

# 1Password App Extension|GitHube
[https://github.com/AgileBits/onepassword-app-extension](https://github.com/AgileBits/onepassword-app-extension)
FlatBuffersのtableに構造体(Class)を格納する

# 概要
API使ってバイナリでの値渡しにconst char *で渡すのを想定した実装をテストする

-> 結果出来ませんでした。
バイナリ扱うのでサイズも渡さないと駄目でした。

ついでにuint8_t(unsigned char)で渡すことにしました。(^^;


# FlatBuffersって何？
・[C++でデータを保存する(FlatBuffers編)](http://qiita.com/YukkiYukinori/items/0f52f8f7b7d059689e5c)
・[Google、FlatBuffersをオープンソース化: 効率の良いクロスプラットフォームのシリアライゼーションライブラリ](http://www.infoq.com/jp/news/2014/06/flatbuffers)
上記にまとまっている。
データの受け渡しにJSONを利用していて容量やパースの速度が気になる方におすすめ。
最近だと2014/9/17にC#に対応したとある。Unityで動くかは試していない。
C#のバージョン次第かと。
[ベンチマーク](http://google.github.io/flatbuffers/md__benchmarks.html)を見ると容量以外はProtocol Buffers LITEより優秀に見える。
今後使うシーンが増えると期待してみる。
Cocos2d-xへの導入も難しくない。何処に設置したかは下記にメモだけ残しておきます。

# 調べたこと
FlatBuffersのtableに構造体の格納方法。
下記を読めば書いてある。やりたいことだけ抽出した内容を記載。
・[monster_test.fbs](https://github.com/google/flatbuffers/blob/master/tests/monster_test.fbs)
・[test.cpp](https://github.com/google/flatbuffers/blob/master/tests/test.cpp)

```fbs:block.fbs
// example IDL file

namespace schema;

enum Color:byte { Red = 0, Green, Blue = 2 }

union Any { Block }  // add more elements..

struct Break { 
  blockNum:short;
  color:Color = Blue; 
}

table Block {
  peerId:string;
  blocks:[Break];
}

root_type Block;
```


```cpp
flatbuffers::FlatBufferBuilder builder;
Break breakBlock[] = { Break(1,Color_Blue),Break(2,Color_Red) };
auto _breakBlock = builder.CreateVectorOfStructs(breakBlock, 2);
auto peerId = builder.CreateString("hoge");
auto __blocks = CreateBlock(builder,peerId,_breakBlock);
FinishBlockBuffer(builder,__blocks);
    
auto str = std::string(reinterpret_cast<const char *>(builder.GetBufferPointer()),
                           builder.GetSize());
builder.Clear();
    
auto block = GetBlock(str.data());
auto tests = block->blocks();
for (auto it = tests->begin(); it != tests->end(); ++it) {
    log("%d %d",it->blockNum(),it->color());
}
```

# 設置した場所

* cocos2d_libs.xcodeproj -> external/flatbuffers に[include/flatbuffers](https://github.com/google/flatbuffers/tree/master/include/flatbuffers) 以下を設置した
* cocos2d_libs.xcodeproj -> external/flatbuffers/schema を作ってfbsとスキーマを設置した。

あとは、flatcをschemaのパスに実行する簡単なシェルを作った
Nginx のリバースプロキシ設定のメモ


Nginx でリバースプロキシをする場合に、どうやってセキュアなリクエストであることをアプリケーションに伝えるか？のメモ。

Nginx - Rails の場合
----

NginxでリバースプロキシするときにもSSLはNginxで処理させる場合が多く、プロキシされるアプリケーションサーバにはSSLが解かれた状態でリクエストが届く。
そのため次のヘッダをNginxでつけるように設定する必要がある。

```
server {
  listen 80;
  server_name hoge.com;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    index index.html index.htm;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:3000;
  }
}
```

AWS で ELB と組み合わせて使う場合
-----

ELB - EC2(Nginx + Rails) 構成の場合には普通、ELBでSSLを終端する。
その時、ELBは次のヘッダをリクエストに付加してEC2側に送ってくれる。

```
X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-Port: 443
X-Forwarded-Proto: https
```
ELB で SSL を終端してしまうと、Nginxにとっては $scheme が HTTP となる。
これではアプリケーションサーバ側にもともとのプロトコルが伝わらない。
アプリケーション側からセキュアなリクエストなのかどうかを判別する必要がある場合には困る。
で、アプリケーション側でスキームを知る必要がある場合には、次のように設定する。

```
server {
  listen 80;
  server_name hoge.com;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    index index.html index.htm;
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:3000;
  }
}
```

Railsの force_ssl は次の条件でSSLによるアクセスで有ることを判定する([Rack::Request#scheme](https://github.com/rack/rack/blob/b0818268fd9f4026a1b0fb205cc1060ee38a23cc/lib/rack/request.rb#L186) メソッドに実装がある)。

- HTTP_X_FORWARDED_SCHEME の値
- HTTP_X_FORWARDED_PROTO の値
- HTTP_X_FORWARDED_SSL の値

上記の設定は X-Forwarded-Proto ヘッダを使って SSL であることを Railsに伝えており、force_ssl が機能する。
QiitaViewer

某社へ作品提出を求められて、30分で作ったQiitaViewerです。 :blush: 

https://github.com/kakignu/Qiita

30分で作ったので、使いにくい部分もあるかもしれませんが、Obj-Cを勉強し始めた方の手助けになればと思い、Qiitaにも公開します。

何かツッコミどころがあれば、突っ込んで下さい。
一文字もどして型セーフ　>> 演算子, putback(), stringstream

cin, cout はデータ型に敏感なので入力された文字から型システムを利用。

1文字入力から数値へ。

```cpp

char ch;
cin >> ch;

if(isgidit(ch)) {
   cin.putback(ch);
   int n;
   cin >> n; // このcinはユーザー入力を促さない。
}
cout << n << endl;

```

> stdin: 1000
> stdout: 1000

別のドキュメントで教えてもらったstringstreamを利用。

int から std::stringへ

```cpp

int year = 2014;
string str;
stringstream ss;

ss << year;
str = ss.str();

```

std::string から int へ

```cpp

string date = "2014/9/1";
stringstream ss;
int value;
char delim;

ss.str(date);

while(ss) {
    ss >> value >> delim;
    // 年、月、日を別の領域にコピー
}


```
Objective-C対応のctags


大抵の環境にinstallされているctagsは
デフォではObjective-Cには未対応ですが・・・

--


```1
git clone https://github.com/mcormier/ctags-ObjC-5.8.1.git
```


```2
./configure ; make clean ; make ; make install
```


出来上がった実行バイナリ ctags はPathの通った適切な場所へCopy


```ctagsの起動オプション例
ctags -R --langmap=objc:.h.m --languages=objc
```
-
これでObjCでもタグジャンプ
sentinel属性

`sentinel`属性について調べてみた。

いつものように[Function Attributes - Using the GNU Compiler Collection (GCC)](https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)を読んでみると、関数宣言に指定して、関数の最後の引数(オプションで引数の位置を指定可能)がNULLになっていることを保障する機能らしい。何が嬉しいんだろうと思って、systemdで使われている場所を見てみると、ほぼすべて、可変引数を取る関数に指定されていた。なるほど。

例えば、systemdには`strjoin`というユーティリティ関数があるが、これに`sentinel`属性が指定されている。

```c:src/shared/util.h
char *strjoin(const char *x, ...) _sentinel_;
```

joinという名前になっているが、`strjoin`は間に文字列を挟む訳ではない。単に、文字列を繋げるだけである。(strcat(3)の高性能版と言える。) 可変引数がすべて文字列だとすると、確かに引数の最後がNULLだと扱いやすいかもしれない。

ちなみに`strjoin`はファイルパスやdbusのオブジェクトパスの文字列を構築するのに便利である。例えば、cgroupsのためのパス文字列の構築に使われている。

```c:src/shared/cgroup-util.c
static int join_path(const char *controller, const char *path, const char *suffix, char **fs) {
        char *t = NULL;

        if (!isempty(controller)) {
                if (!isempty(path) && !isempty(suffix))
                        t = strjoin("/sys/fs/cgroup/", controller, "/", path, "/", suffix, NULL);
                else if (!isempty(path))
                        t = strjoin("/sys/fs/cgroup/", controller, "/", path, NULL);
                else if (!isempty(suffix))
                        t = strjoin("/sys/fs/cgroup/", controller, "/", suffix, NULL);
                else
                        t = strappend("/sys/fs/cgroup/", controller);
```
カーマーカー法による線形計画法

# 線形計画問題
線形計画問題とは目的関数、制約条件がともに線形の形で表されており、以下のようなベクトル${\bf x}$を最小化する問題として表現されます。

```math
\min {\bf c}^T{\bf x}
\\subject \ \ {\bf A}{\bf x}\le {\bf b}
```

ここで${\bf x}$の次元を$n$、制約数を$m$とすると、${\bf x},{\bf c}, {\bf b}$は$n$次元ベクトル、${\bf A}$は$m \times n$の行列です。

# カーマーカー法
線形計画問題の解法として[単体法](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AC%E3%83%83%E3%82%AF%E3%82%B9%E6%B3%95)というものが古くからあるのですが、大規模な問題では効率が悪く、そちらでは今回紹介する内点法が用いられています。
線形計画における内点法では、カーマーカー法というアルゴリズムがかなり有名です。このアルゴリズムはソフトウェア界の特許の話でもよく出てくる話で、コードにしてもとてもシンプルに書けて、美しいアルゴリズムだと言われています。
以下がpythonで記述したカーマーカー法の関数です。

```py
#!/usr/bin/python
#coding:utf-8
import numpy as np

def karmarkar_method(x, c, amat, b,
                     gamma=1.0, eps=1.0e-3, nloop=30):
    """
    Karmarkar法による線形計画問題の解法
    object  min z = c^T * x
    subject Ax <= b
    """
    for n in range(nloop):
        vk = b - amat * x
        gmat = amat.T * np.diag(1.0 / np.square(vk.A1)) * amat
        d = np.linalg.pinv(gmat) * c
        if np.linalg.norm(d) < eps:
            break
        hv = -amat * d
        if np.max(hv) <= 0:
            print("Unbounded!")
            x = None
            break
        alpha = gamma * np.min(vk[hv > 0] / hv[hv > 0])
        x -= alpha * d
        yield x
    #return x


if __name__ == "__main__":
    c = np.matrix([[-1.0],
                   [-1.0]])
    amat = np.matrix([[1.0, 1.0],
                      [1.0, -1.0]])
    b = np.matrix([[0.5],
                   [1.0]])
    # 描画
    from pylab import *
    ax = subplot(111, aspect='equal')
    x = np.arange(-3.0, 3.01, 0.15)
    y = np.arange(-3.0, 3.01, 0.15)
    X,Y = meshgrid(x, y)
    t = np.arange(-3.0, 3.01, 0.15)
    func = lambda x, y : c[0, 0] * x + c[1, 0] * y
    const = [lambda x : -amat[0, 0] / amat[0, 1] * x + b[0, 0] / amat[0, 1],
             lambda x : -amat[1, 0] / amat[1, 1] * x + b[1, 0] / amat[1, 1]]
    Z = func(X, Y)
    s = [const[i](t) for i in range(2)]
    pcolor(X, Y, Z)
    for i in range(2):
        ax.plot(t, s[i], 'k')
    for x in karmarkar_method(np.matrix([[-2.0], [-2.0]]), c, amat, b, gamma=0.5, eps=1.0e-3, nloop=30):
        print(x)
        ax.plot([x[0,0]], [x[1,0]],'ro')
        axis([-3, 3, -3, 3])
    show()
```

今回は描画用に最小値だけでなく途中経過も返すようにしています。
以下に最小値に向かう様子の図を示します。

![karmarkar.png](https://qiita-image-store.s3.amazonaws.com/0/14516/88ff2533-98af-c88a-3671-51f0758cb3e0.png)

青い領域が目的関数が小さくなる領域を示していて、赤い点が青い方向に向かいつつ、制約となっている線の手前でストップしているのが分かります。
現在、内点法は二次計画問題や非線形計画問題にも用いられていますが、カーマーカー法はその先駆けとも言えるアルゴリズムなのですね。
railsで画像を扱う


## urlからs3に画像をアップする
### 該当のファイルのcontent typeを知る
```
res = Net::HTTP.start(uri.host, uri.port) do |http|
  http.get(uri.path, {'User-Agent' => UrlConcern::USER_AGENT})
end
res.content_type
```

### 高さと幅を知る

```
res = Net::HTTP.start(uri.host, uri.port) do |http|
  http.get(uri.path, {'User-Agent' => UrlConcern::USER_AGENT})
end
magick = Magick::Image.from_blob(res.body).shift
width = magick.columns
height = magick.rows
```

* http://stackoverflow.com/questions/9997541/how-to-validate-image-width-and-height-on-upload-with-carrierwave-mini-magick-a

### s3にアップする
```
option = {
  'Content-Type' => res.content_type,
  'Content-Length' => res.body.length,
  'x-amz-acl' => 'public-read',
  'Cache-Control' => "max-age=#{24*60*60*7}, private, must-revalidate",
}

s3_storage.put_object(s3_bucket, path, body, option)
```