OmniAICreator/Qiita-1.07M huggingface dataset:
modernIEの導入方法まとめ

# ModenIEの導入と使い方について。

modernIE

https://www.modern.ie/

OSとIEバージョンの組み合わせを試せます。

CSSレベルなら互換性モードとかIETesterなどを使うのもありですが、結局JSのランタイム、メモリの扱いなどが異なるので、
サポートするならこれを使うしないです。

https://www.modern.ie/

## 導入方法

### VMクライアントのインストール

OSとわず使えるVirtualBoxがおすすめです。

https://www.virtualbox.org/

### Diskイメージのダウンロード

サイトからダウンロードするだけです。
必要な環境をダウンロードします。

（Mac版のみ）

ダウンロードに時間がかかるので、
先に一括でダウンロード、結合、解凍まですることおすすめします。

cURL ですべて入手する、を選択してcurlのコマンド入手します。
そのあとに結合、解凍のコマンドを加えます。

```shell-session
curl -O -L "https://www.modern.ie/vmdownload?browserOS=IE8-XP&parts=2&platform=Mac&virtPlatform=virtualbox&filename=VMBuild_20141027/VirtualBox/IE8/Mac/IE8.XP.For.Mac.VirtualBox.zip{.001,.002}"

cat cat IE8.XP.For.Mac.VirtualBox.zip{.001,.002} > IE8.XP.For.Mac.VirtualBox.zip  #結合コマンドを加えます。

unzip IE8.XP.For.Mac.VirtualBox.zip #解凍コマンドを加えます。
```

上記コマンドをプロンプトにコピーするか、ファイルに書いて実行させて放置します。

###起動する
解凍してできたディレクトリを適当な場所に移動します。
移動が終わったらダブルクリックします。

virtualBoxが起動するのでそのまま進むとimport完了です。

起動の前にネットワークを設定します。

環境設定->ネットワーク->アダプター1

を選択して割り当ての箇所をブリッジに変更します。

ブリッジとはVMが直接ルータに接続しにいくようなイメージです。
ホストOS同様にルータのIPアドレスをもらいにいきます。

NATを設定してもよいのですが、この方法が一番ラクです。

###確認する。

ホストOSにローカル環境がある場合は、ipconfigやifconfigで自分のIPを調べます。

IEをひらいてIPとパスを入力してローカルを確認します。
サーバに展開している場合はそのアドレスを開きます。

無事表示できたらOKです。

接続できない場合は、ipconfigでIPを確認して割り振られているか確認してみてください。
プロキシの設定も必要です。

### XPの場合の注意事項

英語版XPには日本語フォントがはいってないので自分でインストールする必要があります。

例えば以下のようなものがあります。

http://sourceforge.jp/projects/ipafonts/

インストール方法はこのへんを参考してください。

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/windows_fonts_addnew.mspx?mfr=true

検証して実際に修正するとなるとレイアウト崩れ、
パフォーマンス問題など問題はたくさんあります。

css3使ってないんで、古いIEでも動くと思います。
なんて気軽にいうと確実に赤字案件化します。

特に複雑なajaxアプリケーションをIE6,7,8で動かすのは指南の技です。
頻出するメモリリークと性能と戦うことになります。

IE対応するにはVMで検証して、といった大変な検証と修正プロセスを
金額にして提示すべきです。

そうしたらみんなYahooBBがモデルを紙袋にいれてくばっていた時代に
普及したブラウザをサポートしたいなんていう人がいなくなることを心から願っております。

あの時代にajaxを扱うアプリケーションがどれぐらいあったか、
冷静に考えてほしいです。

ましてや同じコードでスマートフォンでもみれるようにしたい、
なんて本当に愚かな要求だと思います。
Wordpressでアップデートできない問題(wp-includes\update.php on line 295)

wp-includes\update.php on line 295にエラーが出て、WordPressのアップデートが出来ない事がありました。WordPress側の問題かと思いましたが、サーバーの名前解決が上手く行っていないことが原因でした。

vagrant上で

```
ping yahoo.co.jp
```
とやっても名前の解決されず・・。

自分はVagrant上に構築していたので、いったん

```
vagrant destroy
```

をして

```
vagrant up
```

で再作成することで元に戻りました。
[Swift]Finderのようなファイル名のソート


`localizedStandardCompare`を使えば簡単に実現できるもよう。

ファイル一覧を表示する画面などで、普通に文字列比較でソートしただけでは、数字部分が1->10->2というような不自然な並びになりますが、それを自然な並びにすることができます。

```swift:
import UIKit

let orgFilenames = ["aaa1", "aaa2", "aaa10", "aaa20"]
println("元の配列", orgFilenames)

let sortedFilenames1 = orgFilenames.sorted(<)
println("通常のソート", sortedFilenames1)

let sortedFilenames2 = orgFilenames.sorted {
    $0.localizedStandardCompare($1) == NSComparisonResult.OrderedAscending
}
println("Finderのようなソート", sortedFilenames2)
```

```text:出力結果
(元の配列, [aaa1, aaa2, aaa10, aaa20])
(通常のソート, [aaa1, aaa10, aaa2, aaa20])
(Finderのようなソート, [aaa1, aaa2, aaa10, aaa20])
```
circle.ymlとGemfileどっちにもrubyのバージョンを書けるが今のところcircle.ymlのほうは省略できない

ローカル環境で使うrubyのバージョンはGemfileのrubyメソッドで固定したいが、circle.ymlにもrubyのバージョンを書く必要があってDRYじゃなくて辛かったのでサポートに聞いてみた。

![a.png](https://qiita-image-store.s3.amazonaws.com/0/26528/5b9df8ba-2b31-3fc8-c598-664d2e8caf6a.png)

ということで、今のところは省略不可。
Rails4.2.1のCircleCIでMySQLのutf8mb4を使うと落ちるのの修正法

[kamipo氏のutf8mb4モンキーパッチ](http://qiita.com/kamipo/items/101aaf8159cf1470d823)を使っていると、Rails4.2.1とCircleCIの組み合わせで下記のような感じで落ちる

```shell
$ export RAILS_ENV="test"
export RACK_ENV="test"
bundle exec rake db:create db:schema:load --trace
** Invoke db:create (first_time)
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:create
** Invoke db:schema:load (first_time)
** Invoke db:load_config 
** Execute db:schema:load
-- create_table("comments", {:force=>:cascade})
   -> 0.0058s
-- add_index("comments", ["user_id"], {:name=>"index_comments_on_user_id", :using=>:btree})
rake aborted!
ActiveRecord::StatementInvalid: Mysql2::Error: Index column size too large. The maximum column size is 767 bytes.: CREATE  INDEX `index_comments_on_user_id` USING btree ON `comments` (`user_id`) 
```

CircleCIが実行している`rake db:schema:load`が`config/initializers`に入っている神パッチを読んでくれないのが原因。そのため、`db:schema:load`ではなく`db:migrate:reset`を使うようにcircle.ymlを書きかえる。

```diff
diff --git a/circle.yml b/circle.yml
index c49f32c..2ebe72a 100644
--- a/circle.yml
+++ b/circle.yml
@@ -19,3 +19,6 @@ dependencies:
 +database:
+  override:
+    - export RAILS_ENV=test; export RACK_ENV=test; bundle exec rake db:migrate:reset --trace
```

exportが重なっているのがびみょうに不自然だが、これは既存のCircleCIとできるかぎりあわせるため。

これでおｋ
Rubyでpemテキストで配布された証明書を使ってhttpsアクセスする簡単な方法


秘密鍵と公開鍵のファイルを作ってそのファイルを読み込ませるTIPSとかは結構あるけど、
pemでテキストとして提供された両者を環境変数などで設定して接続する簡単な（かつPaasとかでは扱いやすい）やり方が意外と検索でHITしなかったのでメモ。
（注意：Rubyは超初心者です）

```ruby:pem.rb
# The following text should be stored in environmental variables!
pem = <<'PEM'
-----BEGIN RSA PRIVATE KEY-----
YOUR PRIVATE KEY
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
YOUR PUBLIC KEY
-----END CERTIFICATE-----
PEM

https = Net::HTTP.new('YOUR_DOMAIN', 443)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
key = OpenSSL::PKey::RSA.new(pem) # private key 
cert = OpenSSL::X509::Certificate.new(pem) # public key
https.key = key
https.cert = cert

# Your https access
res = https.post('/homge/add', 'id=1&....')

```

よくのってるのは、certファイルのパスを指定したり、
p12形式にエンクリプトしてとかだけど、単純に
テキスト形式で配布されている鍵は、そのまま使ったほうが
簡単かと思います。
（Herokuにのせる場合は、sslアドオンとかつかわず、heroku configで
環境変数にいれればOK）
リーンキャンバスとインセプションデッキってどっちが重要？

聞かれたから書いてみる
あくまで私の理解である。
キャンバスには詳しくないので間違いもあると思う

# 結論
どちらも重要

# 違い(追記した)
ビジネスマップキャンバスは開発チームの外の人に、主にネクタイを締めた人に、「何を作りどう稼ぐか」という憲章である
対してインセプションデッキは上記に加え、開発チームも含んだ憲章である

## xxキャンバス
ビジネスマップキャンバスとかリーンキャンバスとかいわれるやつ
これはビジョンを明示するものである。
資金調達の際にエンジェルや銀行、VCに見せて、「こいつらに金を出す価値あるか？」を判断させるものである
また、ジョインする人間にこのチームはどこにむかっているか、どこで稼ぐかを明示し、同じ方向に走らせるためのもの。
「あーこいつらとは合わないわ」を事前に知るためのものでもある

## インセプションデッキ
デッキは、「ビジョンを明示するもの」であると同時に「プロジェクトの憲章」でもある

# 憲章
## 結論
チームの体制、目的、開発の進め方などを示したチームの基本方針である
マネージャーや顧客側担当者の交代によって、チームの同意事項や成果、あるいは努力して作り上げてきた文化がちゃぶだい返しをくらわないために作る

## 前置きの世界史の話
中世、中国や西欧では重臣がそれぞれ派閥を形成していて、重臣が失脚するとその下についていた人間もまとめて首を切られる
粛清とか解官とか左遷とかそういう形で。
そうするとそういう人たちについていた人間も利権や財産の没収が行われたりする
Give and Takeで、見返り目当てにいろいろ尽くしてきたのに、リターンの部分だけ持ってかれたりする
お国のためにいろいろ頑張っても代替わりしたら全部没収されたらやる気にならない、そこでマグナカルタのような憲章が要求された

## 憲章を作りたかった目的
憲章の改正には国王といえどそう簡単にできない
国王や偉い大臣、大貴族の上に憲章をおくことで、「そう簡単に体制はかわらない」＝「今の努力の成果が途中で取り上げられたりしない」ことを保証しようとした

## 開発チームで憲章を作ることの意味
トップやマネージャーがかわるとプロジェクトの体制がガラッと変わってしまう。
それは避けたい

残された開発者が欲しかったもの - プロマネブログ http://getlife.hateblo.jp/entry/2015/03/30/031101

```
要は、

    ドキュメント　・・・　都度メンテナンス　→　ドキュメント不要。ソース見りゃいいでしょ。
    テストコード　・・・　seleniumを使って自動でテスト　→　メンテが面倒。PrintScreenでエビデンスを貼り付けろ。
    リファクタリング　・・・　気にならなくてもこまめに改善。問題発生前に先手を打つ　→　別に直さなくてもよし。困ったときに何とかすれば。
    進捗管理　・・・　マイルストンが守られれば細かい進捗はあまり気にしない。ガントチャートでの進捗管理は面倒だし不正確なことも多いので不要。　→　excelのガントチャートで進捗度合い書け。定量で進捗率を出せ。毎日報告書を提出しろ。

などなどのような形で、今までの組織運営の考え方がガラリと変わったら。。。みたいなコトが心配ってわけですね。
```

ということを避けるためにもインセプションデッキは作りたい
上の例は開発チームに寄りすぎているが、実際にはよりプロダクトオーナー寄りになる。
私の感覚では、インセプションデッキは判断基準を定義することで、文化を定義しようとしているように見える



ビジョンを示すことを重要だが、それ以上に文化を定義することが重要なんだと思った。まる。
lombokのAccessorsがべんり

# Accessorsとは？

lombok 0.11.0から導入されたexperimental機能 (1.16.2現在)。
普段のGetter/Setterと併用して、prefix, fluent, chainという3つのオプションを設定できる。

## prefix

prefixオプションは、変数の前に付加している文字列をGetter/Setterから除去してくれる。

```java
public class Hoge {
    @Accessors(prefix = "m") @Getter @Setter
    private String mName;
}
```

たとえば、Androidだとclass変数の前に "m" をつける習慣があるがこれを除去できる。

```java
Hoge hoge = new Hoge();
hoge.setName("hoge");
hoge.getName();
```

## chain

chainは setterの戻り値をInstanceに変更して、method chainを可能にする。

```java
public class Hoge {
    @Accessors(prefix = "m" chain = true) @Getter @Setter
    private String mFirstName;

    @Accessors(prefix = "m" chain = true) @Getter @Setter
    private String mLastName;
}
```

```java
Hoge hoge = new Hoge();
hoge.setFirstName("John").setLastName("Doe");
```

## fluent

fluentはset/getというSetter/Getterのメソッドprefixを除去してくれる

```java
public class Hoge {
    @Accessors(prefix = "m" chain = true, fluent = true) @Getter @Setter
    private String mFirstName;

    @Accessors(prefix = "m" chain = true, fluent = true) @Getter @Setter
    private String mLastName;
}
```

```java
Hoge hoge = new Hoge();
hoge.firstName("John").lastName("Doe");
hoge.firstName(); // John
```

# 参考

- [Accessors (Lombok)](http://projectlombok.org/api/lombok/experimental/Accessors.html)
ArrayBufferの分割/結合方法

# あらまし
ArrayBufferに格納された比較的サイズの大きいデータ(バイナリファイルなど)をリモートへ送信や受信したり、ウェブワーカーに渡す際に、UIのブロックを防ぐために小さな単位に分割したい場合がある。ここではArrayBufferを指定のサイズのセグメントに分割する方法と、複数のArrayBufferを単一のArrayBufferに結合する方法を紹介する。

# 分割
分割はArrayBufferのslice関数で行う。slice関数は、指定の開始から終了位置までのデータを保持した新しいArrayBufferオブジェクトを返す関数である。sliceされたデータは、もとのArrayBufferとは共有されず、新たにコピーされる。

```js
function segmentation(arrayBuffer, segmentSize)
{
	var segments= [];
	var fi = 0;
	while(fi*segmentSize< arrayBuffer.byteLength){
		segments.push( arrayBuffer.slice(fi*segmentSize, (fi+1)*segmentSize) );
		++fi;
	}
	return segments;
}
```

## 実行例
サイズ100のArrayBufferをサイズ30のセグメントに分割。30, 30, 30, 10のサイズの4つのArrayBufferに分割される。

![image](https://qiita-image-store.s3.amazonaws.com/0/58790/143c5d88-26cc-fb15-d549-e9252a90a1a0.png)


# 結合
一旦Uint8Arrayで結合後のサイズ分の領域確保してから、set関数を使って各セグメントを該当位置に格納していゆく。

```js
function concatenation(segments)
{
	var sumLength = 0;
	for(var i = 0; i < segments.length; ++i){
		sumLength += segments[i].byteLength;
	}
	var whole = new Uint8Array(sumLength);
	var pos = 0;
	for(var i = 0; i < segments.length; ++i){
		whole.set(new Uint8Array(segments[i]),pos);
		pos += segments[i].byteLength;
	}
	return whole.buffer;
}
```

## 実行例
サイズ100のArrayBufferをサイズ30のセグメントに分割し、さらにそれらを結合して元に戻す。


![image](https://qiita-image-store.s3.amazonaws.com/0/58790/a62bf667-c04d-8b45-0a98-d550921b21dc.png)
stylusカスタム関数でCSS背景画像のキャッシュをコントロールしたい！

##ブラウザキャッシュめんどいよね！！
案件によってApache設定触れなかったりするし、そもそもApache設定よくわかんないし、ブラウザキャッシュさせないってのもなんかアレだし、結局htmlとかcssのソース上でキャッシュコントロールするのが楽チンだよね！絶対そうだよね！

で、「読み込みCSS?hogehoge」みたいなことするでしょ！

```html:index.html
<!-- 読み込みcssに日付とかつけちゃう！ -->
<link rel="stylesheet" href="style.css?201512121212">
```

そうするとCSS自体はキャッシュ殺してフレッシュな感じでグッドだけど、backgroundで指定してる画像とかがキャッシュ効いちゃったりして、スーパーリロードしなきゃいけなかったりするよね！


だからこうしたい！

```css:style.css
/*
画像ファイル名の後ろに日付とかつけちゃう！
*/
.hoge {
	background-image: url('../images/bg_hoge.jpg?201512121212');
}
```

そして日時がファイル保存時に自動的に更新されたら常にフレッシュ！つまりめちゃ楽チンだよね！


##できた！

###環境
- gulp
- stylus(+nib)

```stylus:style.styl
@charset "UTF-8";
@import 'nib'

/*
画像ファイル名の後ろに日付とかつけちゃう！
*/
updateTime = '?'date()
.hoge
	background-image url('../images/bg_hoge.jpg'(updateTime))


```

```coffee:gulpfile.coffee
fs          = require('fs')
path        = require('path')
gulp        = require('gulp')
filter      = require('gulp-filter')
stylus      = require('gulp-stylus')
csscomb     = require('gulp-csscomb')
cssbeautify = require('gulp-cssbeautify')
date_util   = require('date-utils')
nib         = require('nib/lib/nib')


#    ________  _________________  __  ___   ________  ___   ______________________  _   __
#   / ____/ / / / ___/_  __/ __ \/  |/  /  / ____/ / / / | / / ____/_  __/  _/ __ \/ | / /
#  / /   / / / /\__ \ / / / / / / /|_/ /  / /_  / / / /  |/ / /     / /  / // / / /  |/ /
# / /___/ /_/ /___/ // / / /_/ / /  / /  / __/ / /_/ / /|  / /___  / / _/ // /_/ / /|  /
# \____/\____//____//_/  \____/_/  /_/  /_/    \____/_/ |_/\____/ /_/ /___/\____/_/ |_/

styl_customfunc = (style)->
	style.define 'date', ->
		updateTime = new Date()
		updateTime = updateTime.toFormat("YYYYMMDDHH24MISS")
		return updateTime


#  _       _____  ______________  __
# | |     / /   |/_  __/ ____/ / / /
# | | /| / / /| | / / / /   / /_/ /
# | |/ |/ / ___ |/ / / /___/ __  /
# |__/|__/_/  |_/_/  \____/_/ /_/

gulp.task 'w', ->
	# stylus
	gulp.watch "./src/*.styl", (file)->
		srcFileName = path.basename file.path

		regex = /^\_/;
		buildTarget = file.path
		if (regex.test(srcFileName))
			buildTarget = "./src/*.styl"

		console.log "styl2css : #{buildTarget}"
		gulp.src buildTarget
			.pipe filter(["*","!_*"])
			.pipe stylus
				use: [nib(),styl_customfunc]
				compress: false
			.pipe(csscomb())
			.pipe cssbeautify
				indent: '\t'
			.pipe gulp.dest "./build"

```


これで常にフレッシュ！楽勝！いぇい！
Docker + iPythonで画像処理（OpenCV編）

##iPythonでOpenCVを使う

↓こちらに分かりやすい説明がありました。
[nbviewer.ipython.org/github/payashim/tutorial-opencv-python-pyconjp2014/blob/master/pyconjp2014_payashim.ipynb](http://nbviewer.ipython.org/github/payashim/tutorial-opencv-python-pyconjp2014/blob/master/pyconjp2014_payashim.ipynb "nbviewer.ipython.org/github/payashim/tutorial-opencv-python-pyconjp2014/blob/master/pyconjp2014_payashim.ipynb")

手抜きとか言わないで。

##顔認識をやってみる

↓こちらに（以下略）
[python+OpenCVで顔認識をやってみる - Qiita](http://qiita.com/wwacky/items/98d8be2844fa1b778323 "python+OpenCVで顔認識をやってみる - Qiita")

手抜きとか言わないで。

↓やってみたNotebook
[nbviewer.ipython.org/github/suto3/git-public/blob/master/python/Python27/iPython/docker/pillow_opencv/docker-opencv01.ipynb](http://nbviewer.ipython.org/github/suto3/git-public/blob/master/python/Python27/iPython/docker/pillow_opencv/docker-opencv01.ipynb "nbviewer.ipython.org/github/suto3/git-public/blob/master/python/Python27/iPython/docker/pillow_opencv/docker-opencv01.ipynb")

実行結果
![lena-detected.jpg](https://qiita-image-store.s3.amazonaws.com/0/26107/e26624ac-1924-5944-6e84-cffde4fd962d.jpeg)

[Pillow環境構築 -- Docker + iPythonの場合（あと、OpenCVも） - Qiita](http://qiita.com/suto3/items/949532ba83c0da671df2 "Pillow環境構築 -- Docker + iPythonの場合（あと、OpenCVも） - Qiita")
Docker + iPythonで画像処理（Pillow編）

iPythonが起動してしまえばあとは同じ

Dockerは意識しないで、普通のiPython + Pillow 環境として使えます。（当たり前といえば当たり前だけど）

というわけで、書くことがない。

↓ 一応、動作確認をしたNotebookを貼っておきますね。

[nbviewer.ipython.org/github/suto3/git-public/blob/master/python/Python27/iPython/docker/pillow_opencv/docker-pillow01.ipynb](http://nbviewer.ipython.org/github/suto3/git-public/blob/master/python/Python27/iPython/docker/pillow_opencv/docker-pillow01.ipynb "nbviewer.ipython.org/github/suto3/git-public/blob/master/python/Python27/iPython/docker/pillow_opencv/docker-pillow01.ipynb")


[Pillow環境構築 -- Docker + iPythonの場合（あと、OpenCVも） - Qiita](http://qiita.com/suto3/items/949532ba83c0da671df2 "Pillow環境構築 -- Docker + iPythonの場合（あと、OpenCVも） - Qiita")
clearIntervalが効かない時

hoverしたらsetIntervalが始まり、条件を満たしたらclearIntervalしたかった。
しかし、短時間に何回もhoverを繰り返したときに、clearIntervalが効かなくなることがあった。
そんな時の解決策。


## ページが表示されたらsetIntervalが始まり、「ストップ」をクリックしたらclearIntervalする場合

```html
<div class="box"></div>

<div class="stop">ストップ</div>
```

```js
boxAime = setInterval(boxChange, 50);

var boxWidth = 0;
function boxChange(){
	boxWidth++;
	$('.box').width(boxWidth);
}

$('.stop').click(function(){
    clearInterval(boxAime);
});
```

## 「スタート」をhoverしたらsetIntervalが始まり、条件を満たしたらclearIntervalする場合(不完全)

```html
<div class="box"></div>

<div class="start">スタート</div>
```

```js
$('.start').mouseenter(function(){
	startChange();
});

function startChange(){
	boxAime = setInterval(boxChange, 50);
}

var boxWidth = 0;
function boxChange(){
    boxWidth++;
    if(boxWidth > 100){
        clearInterval(boxAime);
    }
    $('.box').width(boxWidth);
}
```

連続して何回もhoverすると、止まらなくなってしまう。

## 「スタート」をhoverしたらsetIntervalが始まり、条件を満たしたらclearIntervalする場合(解決策)

原因は、連続してhoverしたことによって、setIntervalがいくつも実行されてしまっていたが、clearIntervalは1つしか止めていなかったからです。

clearIntervalは、引数にsetInterval実行時の戻り値を渡すことで処理を止めています。
なので、setIntervalの戻り値を全て保持し、全て止めるようにすれば良いです。

```html
<div class="box"></div>

<div class="start">スタート</div>
```

```js
$('.start').mouseenter(function(){
	startChange();
});

var arrChangeCnt = new Array();
function startChange(){
    arrChangeCnt.push(boxAime = setInterval(boxChange, 50));
}

var boxWidth = 0;
function boxChange(){
	boxWidth++;
	if(boxWidth > 100){
		if (arrChangeCnt.length > 0) {
           clearInterval(arrChangeCnt.shift());
       }
	}else{
		$('.box').width(boxWidth);
	}
}
```
jsFiddleを使ってみる

http://doc.jsfiddle.net/basic/introduction.html
コード載せるときなど便利そうなのでjsfiddleを使ってみることにしました。なお、後で見つけたため上記リンクには参考程度で以下の内容はそれに沿っていません。

#Sign up
メールアドレスが必要です。確認メールは送られてきませんでした。登録後、基本情報の入力画面に遷移しますが入力は必須ではないようです。お好みでどうぞ。左上のEditorから作成開始です。

#Left Panel
今回はボタンを押すとalertがでるサンプルをつくります。左枠でいろいろ設定できるようです。

##Frameworks & Extensions
jQueryなど使用するライブラリを選択できます。設定すると自動的に読み込まれるため、本体での定義は不要のようです。
onLoad, onDomReadyなどは自作のコードの実行タイミングを設定します。

##Fiddle Options
* Name your fiddle: 作成物の名前。埋め込み時にタイトルバーに表示されます。
* Description: 作成物の説明。公開Fiddleリストに表示されます。
* Normalized CSS: Normalize.cssの適応
* Body tag: 必要ならBodyタグを定義できます。例：`<body class="dark_ui">`
* DTD: DOCTYPEを指定。
* Framework script attribute: 自動的に設定されるスクリプトタグに属性を追加できます。

##External Resources
CSSかJSの外部リソースを読み込みます。

##Languages
使用言語を選択できます。coffeescriptとscssを使用することにしました。Jadeは使えないようです。

##Ajax Requests
Ajaxにも対応？してるようです。詳しくは
http://doc.jsfiddle.net/use/echo.html
を参照してください。今回は使わないので触りません。

#Right Panel
##HTML(左上）
上記の説明で察しがついていると思いますが、headタグなどは自動的に作成されるため、bodyタグの中身のみ記述します。今回は簡単にこうしました。

```
<input type="button" id="target" value="BUTTON"/>
```

##Script（左下）
スクリプトを記述します。実行タイミングはFrameworks & Extensionsで指定したタイミングになります。今回はonLoad時に次のcoffeescriptを実行するようにしました。

```
$("#target").on 'click', ->
    alert 'Hello'
```

##css/scss（右上）
スタイルを記述します。今回特に必要ないのですが一応つぎのスタイルを指定しました。このスタイルも自動的に読み込まれます。

```
input {
    width: 100%;
}
```

#Run
上部のRunボタンを押し、Fiddleを実行します。
右下のResult Panel（右下）にボタンが表示され、押すとアラートがでるはずです。

#Save
出来上がったら上部のSaveボタンで保存します。

#Share
保存できたら上部のShareメニューから共有できます。

https://jsfiddle.net/kzqooq/azcjbohv/

#感想
バージョン管理もできるみたい。こつこつ修正しながら説明していくときに使えそう。類似サービスは他にもあるみたいなので、そっちも試していきたい。
MySQL勉強会メモ

likeの前方一致なら、インデックスは効く。
プライマリーキーが多いと、Innodbの仕様で、countでも遅くなる。

セミシンクの設定がある場合はあまり使わないなら消す。
innodb_double_write=0
webシステムとかだと、基本鉄器に０らしい。
innodb_purge_threadはいらない

innodb_data_file_path=自動拡張にしていたほうがいい？
innodb_buffer_pool_size= ８割くらいで取っておけばいい。
innodb_log_file_size＝１G以下で良い。

あまり性能が変わらなければ下記は１でもいい。
innodb_flush_log_at_trx_commit = 0
でいいらしい。１にすると、更新の性能が２割くらいになっちゃう。
sync_binlog=0がいい。３割くらい遅くなる。

テンポラリのテーブルのサイズ　片方だけはダメ
ちょっと大きい方がいいらしい。
max_heap_table_size = 64M
tmp_table_size = 64M

###追加(MySQL5.6用)
performance_schema = 0　あまり使わないので、
metadata_locks_hash_instances = 256
innodb_buffer_pool_instances = 1　増やしすぎると性能が落ちる
innodb_thread_sleep_delay = 1000
innodb_concurrency_tickets = 1000
innodb_adaptive_max_sleep_delay = 0

下記は参考に・・・・
#SlowLog and log
general_log = 0
general_log_file=/usr/local/ca/mysql/logs/mysql.log

slow_query_log = 1
slow_query_log_file = /usr/local/ca/mysql/logs/slow-log.log
long_query_time = 5

relay-log=/usr/local/ca/mysql/data/sem-dbstoragemaster02-relay-bin
server-id = 12

ログサイズを変える場合は、今のログをどこかへ退避してからでないと立ち上がらない。
MySQLメモリ使用量確認SQL

```sql:メモリ使用量確認
select
@@GLOBAL.KEY_BUFFER_SIZE as GLOBAL_KEY_BUFFER_SIZE,
@@GLOBAL.INNODB_BUFFER_POOL_SIZE as GLOBAL_INNODB_BUFFER_POOL_SIZE,
@@GLOBAL.INNODB_LOG_BUFFER_SIZE as GLOBAL_INNODB_LOG_BUFFER_SIZE,
@@GLOBAL.INNODB_ADDITIONAL_MEM_POOL_SIZE as GLOBAL_INNODB_ADDITIONAL_MEM_POOL_SIZE,
@@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE as THREAD_BUFFER_SIZE,
@@GLOBAL.KEY_BUFFER_SIZE + @@GLOBAL.INNODB_BUFFER_POOL_SIZE + @@GLOBAL.INNODB_LOG_BUFFER_SIZE + @@GLOBAL.INNODB_ADDITIONAL_MEM_POOL_SIZE + @@GLOBAL.NET_BUFFER_LENGTH
 + (@@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE) * @@GLOBAL.MAX_CONNECTIONS AS TOTAL_MEMORY_SIZE,
 (@@GLOBAL.KEY_BUFFER_SIZE + @@GLOBAL.INNODB_BUFFER_POOL_SIZE + @@GLOBAL.INNODB_LOG_BUFFER_SIZE + @@GLOBAL.INNODB_ADDITIONAL_MEM_POOL_SIZE + @@GLOBAL.NET_BUFFER_LENGTH
 + (@@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE) * @@GLOBAL.MAX_CONNECTIONS)/1024 AS TOTAL_MEMORY_SIZE_kb,
 (@@GLOBAL.KEY_BUFFER_SIZE + @@GLOBAL.INNODB_BUFFER_POOL_SIZE + @@GLOBAL.INNODB_LOG_BUFFER_SIZE + @@GLOBAL.INNODB_ADDITIONAL_MEM_POOL_SIZE + @@GLOBAL.NET_BUFFER_LENGTH
 + (@@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE) * @@GLOBAL.MAX_CONNECTIONS)/1024/1024 AS TOTAL_MEMORY_SIZE_mb,
 (@@GLOBAL.KEY_BUFFER_SIZE + @@GLOBAL.INNODB_BUFFER_POOL_SIZE + @@GLOBAL.INNODB_LOG_BUFFER_SIZE + @@GLOBAL.INNODB_ADDITIONAL_MEM_POOL_SIZE + @@GLOBAL.NET_BUFFER_LENGTH
 + (@@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE) * @@GLOBAL.MAX_CONNECTIONS)/1024/1024/1024 AS TOTAL_MEMORY_SIZE_gb
 \G
```
xhprofインストールメモ

```shellコマンド:shell
$ cd /usr/local/src/archive
$ wget http://pecl.php.net/get/xhprof-0.9.4.tgz
$ tar zxvf xhprof-0.9.2.tgz
$ mv xhprof-0.9.4.tgz ../source
$ cd ../source/xhprof-0.9.2/extension/
$ phpize
$ ./configure
$ make
$ make install

$ sudo vim php.ini
[xhprof]
extension="xhprof.so"
xhprof.output_dir="/tmp"

$ php -i | grep xhprof
xhprof
xhprof => 0.9.2

$ sudo yum install --enablerepo=epel graphviz graphviz-gd
$ cp -a xhprof_* /usr/local/apache2/htdocs/
```
CakePHPのメモ

# テストファイルの追加
1. `cake bake`
2. Test Case > Component > yes > {component name} > `Please provide...`[^1]
3. ファイルを開くとテスト関数が作成されていて便利

[^1]: 使用するモデル名答えます。[参考](http://d.hatena.ne.jp/ChiKa/20070907/1189155679)

# テスト追加時
1. `/test.php`にアクセス
1. 対象のファイルを選択
1. OKの場合は、`assertions`の数字が増えている

# `Referenced fixture class (Test\Fixture\Fixture.php) not found`が出る
作成したテストファイル内で、`$fixtures`を削除する。
アプリケーション操作まとめ

#PathFinder

##基本操作

 - コピー -> `cmd + C`
 - カット -> `cmd + X` 
 - 貼り付け -> `cmd + V`
 - 取り消す -> `cmd + Z`
 - 全選択 -> `cmd + A`
 - 検索 -> `cmd + F`
 - 情報を見る -> `cmd + I`
 - プリント -> `cmd + P`
 - 戻る -> `cmd + [`
 - 進む -> `cmd + ]`
 - 親フォルダ -> `cmd + ↑`
 - 開く -> `cmd + ↓`
 - 複製 -> `cmd + D`
 - 削除 -> `cmd + delete`
 - ページ設定 -> `shift + cmd + P`
 - フォルダ作成 -> `shift + cmd + N`
 - 名称変更 -> `shift + cmd + R`
 - デュアルブラウザ - > `F1`
 - 左右入れ替え -> `F2`
 - 右枠へコピー -> `F5`
 - 右枠へ移動 -> `F6`
 - 右枠へ圧縮 -> `F7`
 - 右枠へ解凍 -> `F8`

***
#Witch

 - 起動中アプリ選択 -> `control + tab`
 - 進む -> `control + j`
 - 戻る -> `control + k`

***
#BetterTouchTool

 - 4本指で左へスワイプ -> `左スペースへ移動`
 - 4本指で右へスワイプ -> `右スペースへ移動`
 - 3本指で下へスワイプ -> `cmd + W`
 - 3本指で左へスワイプ -> `cmd + [`
 - 3本指で右へスワイプ -> `cmd + ]`
 - 3本指で下へスワイプ -> `cmd + N`

***
#ClipMenu

 - ClipMenu呼び出し -> `shift + cmd + V`
 - スニペットメニュー呼び出し -> `shift + cmd + B`

***
#Crome
 - 新しいタブ -> `cmd + T`
 - 新規ウィンドウ -> `cmd + N`
 - シークレットウィンドウ -> `shift + cmd + N`
 - 閉じたタブを開く -> `shift + cmd + T`
 - ファイルを開く -> `cmd + O`
 - 場所を開く -> `cmd + L`
 - ウィンドウを閉じる -> `shift + cmd + W`
 - タブを閉じる -> `cmd + W`
 - ページを別名で保存 -> `cmd + S`
 - ページの場所をメールで送信m -> `shift + cmd + I`
 - ページを印刷 ->`cmd + P`
 - 取り消し -> `cmd + Z`
 - やり直し -> `shift + cmd + Z`
 - コピー -> `cmd + C`
 - ペースト -> `cmd + V`
 - カット -> `cmd + X`
 - ペーストしてスタイルを合わせる -> `shift + cmd + Z`
 - 全選択 -> `cmd + A`
 - 検索 -> `cmd + F`
 - ページ再読み込み -> `cmd + R`
 - 拡大 -> `cmd + +`
 - 縮小 -> `cmd + -
 - コンソール表示 -> `option + cmd + C`
 - ホーム ->`shift + cmd + H`
 - 戻る -> `cmd + [`
 - 進む -> `cmd + ]`
 - 全履歴を表示 -> `cmd + Y`
 - ブックマークに追加 -> `cmd + D`
 - 次のタブ -> `shift + cmd + ]`
 - 前のタブ -> `shift + cmd + [`
 - ダウンロード情報表示 -> shift + cmd + J`
コッホ曲線をPython Turtleで描画する


プログラミングコンテスト攻略のためのアルゴリズムとデータ構造参考にしてコッホ曲線を書いてみた

![Screenshot 2015-03-30 11.12.56.png](https://qiita-image-store.s3.amazonaws.com/0/6410/b8dac8f0-243c-6d3a-e77c-07792869b029.png "Screenshot 2015-03-30 11.12.56.png")


```python
from math import cos, sin, pi

class Point:
    def __init__(self, x=0.0, y=0.0):
        self.x = x
        self.y = y

def koch_pos(n, a, b):
    if n == 0:
        return
    th = pi * 60.0 / 180.0

    s, t, u = Point(0.0, 0.0), Point(0.0, 0.0), Point(0.0, 0.0)
    s.x = (2.0 * a.x + 1.0 * b.x) / 3.0
    s.y = (2.0 * a.y + 1.0 * b.y) / 3.0
    t.x = (1.0 * a.x + 2.0 * b.x) / 3.0
    t.y = (1.0 * a.y + 2.0 * b.y) / 3.0
    u.x = (t.x - s.x) * cos(th) - (t.y - s.y) * sin(th) + s.x
    u.y = (t.x - s.x) * sin(th) + (t.y - s.y) * cos(th) + s.y

    for pos in koch_pos(n - 1, a, s):
        yield pos
    yield s.x, s.y
    for pos in koch_pos(n - 1, s, u):
        yield pos
    yield u.x, u.y
    for pos in koch_pos(n - 1, u, t):
        yield pos
    yield t.x, t.y
    for pos in koch_pos(n - 1, t, b):
        yield pos


def koch(n, a, b):
    yield a.x, a.y
    for pos in koch_pos(n, a, b):
        yield pos
    yield b.x, b.y

if __name__ == "__main__":
    from turtle import *
    a = Point(-500.0, 0.0)
    b = Point(500.0, 0.0)
    n = 5
    t = Turtle()

    first = True
    for x, y in koch(n, a, b):
        if first:
            first = False
            t.penup()
            t.setpos(x, y)
            t.pendown()
        else:
            t.setpos(x, y)

    exitonclick()


```
【俺メモ】log4jsでファイルを分けてログを出力

# log4jsをインストール

```shell-session
$ npm install log4js
```

# 設定ファイルを別出し

とりあえず、app.jsと同じとこにファイルを作ってや。
んで、ログファイルはlogフォルダの下にできるで。

```js:log4js-setting.json
{
    "appenders": [
        {
            "type": "dateFile", //日付でローテーション
            "category": "request", //リクエスト用のログ
            "filename": "./logs/request", //ファイルのパスとファイル名のヘッダ部分
            "pattern": "yyyyMMdd.log", //日付のフォーマットと拡張子
            "alwaysIncludePattern": "true" //日付跨ぎの強制ローテーションを有効
        },
        {
            "type": "dateFile",
            "category": "error", //エラー用ログファイル
            "filename": "./logs/error",
            "pattern": "yyyyMMdd.log",
            "alwaysIncludePattern": "true"
        }
    ]
}
```

# 組み込み

```js:app.js
var log4js = require('log4js'); //log4jsモジュール読み込み

log4js.configure('log4js_setting.json'); //設定ファイル読み込み

var reqlogger = log4js.getLogger('request'); //リクエスト用のロガー取得
var errlogger = log4js.getLogger('error'); //エラー用のロガー取得

reqlogger.info('this is request log'); //リクエストログ出力
errlogger.error('this is error log'); //エラーログ出力
```

エラー時はエラーオブジェクトを出力する事があるかも知れへんから
Node.js標準モジュールのutil.inspectを使うのがよろし。

# 実行結果

```text:request20150330.log
[2015-03-30 17:25:41.152] [INFO] request - this is request log
```

```text:error20150330.log
[2015-03-30 17:25:41.154] [ERROR] error - this is error log
```

細かいフォーマットはまた別な話
ssh接続でToo many authentication failuresが出る


## 課題
ssh-agentに鍵を追加すると、ログインするときに下記のエラーが表示された。
Received disconnect from local_id: 2: Too many authentication failures for yamaura
 
## 原因
ログインしようとした環境はパスワード認証にも関わらず、鍵認証でログインしようとしているため。
 
## 解決策
パスワードを使うようにする。
 
下記のコマンドでログインする。

```
ssh ip_adress -A -l user_name -o PreferredAuthentications=password
```

もしくは~/.ssh/config に下記設定を行う。

```
Host dev
  HostName id_adress
  User user_name
  IdentitiesOnly yes
```

## 参考
http://d.hatena.ne.jp/modified/20120612/1339492459
https://blogs.da-cha.jp/index.php/momokuri/aws-ssh-too-many-authentication
SublimeText をterminalから起動


忘れてしまいそうなので、メモ。
(MACを想定してます)

```bash
/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl
```

これで起動できます。

プロジェクトフォルダのTOPで

```bash
/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl .
```
と入れればフォルダと一緒に開いてくれる。

ファイルを同時に開く場合はファイル名を渡す。

aliasをはっとけばさっとプロジェクトをopenできます。

```.bash_profile
alias subl="/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl"

alias open_project="subl /project/path"
【プログラミング学習】便利な学習サイト一覧　※自分用

* ShareWis（シェアウィズ）

> http://share-wis.com/

* Progate　プログラミング言語を学ぶサイト

> http://prog-8.com/

* Atlassianのgit学習サイト

> https://www.atlassian.com/ja/git
PHPで先月の初日と末日

PHPでは単に`new DateTime("last month")`では、先月の日付が求められないようです。例えば、3月30日に、`new DateTime("last month")`を実行すると3月2日の日付のオブジェクトが生成されます。

```php
// 先月の初日
var_dump(new DateTime("first day of last month midnight"));

// 先月の末日
var_dump(new DateTime("last day of last month 23:59:59.999999"));
```
Ubuntu16.04にてpxe boot

## パッケージインストール

```bash:インストール
apt-get install -y isc-dhcp-server
```

```bash:dnsmasqを停止しておくこと！！
systemctl disable isc-dhcp-server
systemctl stop isc-dhcp-server
killall dnsmasq
```

## 雛形をダウンロード

```bash:
git clone https://github.com/tukiyo/dnsmasq.ipxe.git
cd dnsmasq.ipxe
sed -i -e 's/en4/eth0/' stop.sh
sed -i -e 's/en4/eth0/' start.sh
sed -i -e 's/en4/eth0/' dnsmasq.conf
```

eth0は `enp0s25`などの場合もあり

## 起動

* eth0を192.168.9.9に固定しておく。

```bash:
sudo sh start.sh
```

これで動いた

----

## nfsを使う場合

```
sudo apt install -y nfs-kernel-server
```

```bash:/etc/exports
/srv/centos5        192.168.9.0/24(ro,sync,no_subtree_check)
```

```
sudo mount -o loop CentOS-5.11-i386-bin-DVD-1of2.iso /srv/centos5/
sudo exportfs -rav
```
【Arduino】はじめの一歩！Lチカ挑戦の前準備編　〜Arduinoの選び方、LEDの選び方〜

みなさんこんにちは！

最近IoTが盛り上がってますが、IoTやってみたいけど電気わからないから・・・
なんて諦めてませんか？
そんな方に向けたちょっとしたTipsをお届けします！

上手く制御しRaspberry Piなどと組み合わせると
こんな事も出来ますよ！グローバルアドレスでブラウザからアクセスして
スイッチを制御なんていうくだらないことをやってますw
https://www.youtube.com/watch?v=26_oX7qJKNE

# 0-0. 電気の基本
電気の基本は、

電流(A)＝電圧(V)／抵抗(Ω)

です。
これだけ覚えておけば通常はあまり困ることはありません！
（ちょっと大げさかもですが）

LEDはだいたい2V程度の電圧が必要です。そして、最大電圧が5Vと言うのが多いです。
最大電圧が5Vのものは、直接Arduinoにつなげても良いですが、壊さないために
3V低下させる抵抗を入れた方がいいでしょう。
そして、LEDは電流値によって明るくも暗くもなります。
LEDの仕様にもよりますが、例えば、10mAの電流を流したいとき、

10mA = 3V / X（抵抗値）
X（抵抗値） = 3V / 10mA = 0.3kΩ = 300Ω

程度の抵抗を入れておけば良いことになります！
ここ重要！！！

**低くしたい電圧値 / 流したい電流**


# 0-1. Arduinoってなんなの？
簡単に言うと、マイコンです！昔懐かしZ80とかそういったたぐいです。
詳しくは
http://ja.wikipedia.org/wiki/Arduino

# 0-2. Arduinoって何が出来るの？
アイデア次第です！
上手く制御してあげれば、ブザーなどを利用して音楽も奏でられます。

# 0-3. Arduinoってどうやって制御するの？
（ほぼ）C or C++言語です！
http://arduino.cc/en/Main/Software
上記より、Arduino用IDEをダウンロード出来ます。
WindowsユーザーはFTDIドライバをインストールする必要があります。


さて本題です。

# 1. 安くすませたい方向け
ハンダづけをしなくてもいいけど、安く済ませたい方は
以下をそろえるだけでLチカ出来ます。

http://akizukidenshi.com/catalog/g/gM-09059/
http://akizukidenshi.com/catalog/g/gP-04303/
http://akizukidenshi.com/catalog/g/gC-05371/
http://akizukidenshi.com/catalog/g/gI-04111/

の合計4点を買えばLチカ出来ます。

# 2. スターターキット
少し高くても安心出来るものが欲しい方は以下のようなセット品をどうぞ
https://www.switch-science.com/catalog/181/


# 3. その他
突き詰めればもっと安くも出来ます！
ハンダづけも大丈夫って方は、
https://www.switch-science.com/catalog/181/
なんてものを使用するのもありですよ〜！

あるいはICで買うってのもありかも！
https://www.switch-science.com/catalog/663/

Atmel ATmega328（他にもありますが）さえ乗っていれば、基本は
Arduinoでプログラムすることが出来ます。
http://www.amazon.co.jp/%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%EF%BC%88SainSmart%EF%BC%89-Nano-3-0-%E4%BA%92%E6%8F%9B%E3%83%9C%E3%83%BC%E3%83%89-for-Arduino/dp/B00761NDHI
こんなのも安くてオススメです！


次は実際のスケッチでも書きましょうかね。
【Rails】まだValidatorのテストで消耗してるの？

# Custom Validator
RailsにおけるCustom Validatorについては[Ruby on Rails Guides](http://guides.rubyonrails.org/active_record_validations.html#custom-validators)や「[てめえらのRailsはオブジェクト指向じゃねえ！まずはCallbackクラス、Validatorクラスを活用しろ！](http://qiita.com/joker1007/items/2a03500017766bdb0234)」などの記事に触れられているとおりである．
Modelはごちゃごちゃさせたくないし，Validatorとして切りだしちゃえば使い回しも効くよね！という話（ざっくり）．


## Validatorのテスト
Custom Validatorのテストについては[RailsでCustom validatorをテストする](http://qiita.com/r7kamura/items/70c22300499b795af19c)にて言及されている．
特定のModelに依存したテストを書くのはおかしな話だからダミーのクラスを用意しよう！みたいな感じ．

> ```ruby
> let(:model_class) do
>   Struct.new(:url) do
>     include ActiveModel::Validations
> 
>     def self.name
>       'DummyModel'
>     end
> 
>     validates :url, full_http_url: true
>   end
> end
> ```
> \- <cite>[RailsでCustom validatorをテストする - Qiita](http://qiita.com/r7kamura/items/70c22300499b795af19c)</cite>

ただ，これを各Validator Spec毎に毎回書くのは面倒だなーと思う．サボりたい．

## RSpec::ValidatorSpecHelper
ということで，Validatorのテストで手抜きするためのgemを作った（[**izumin5210/rspec-validator_spec_helper**](https://github.com/izumin5210/rspec-validator_spec_helper)）．
勝手にダミークラスを生成して`validates`や`validates_with`も設定してくれるというものになっている．

`EachValidator`継承クラスの場合は1つのカラムにしか依存しないので，`let`を利用して`value`に値を突っ込むことでvalidateしてくれる．
あとは`is_expected`やワンライナー`should`等で`be_valid`/`be_invalid`を見てあげればよい（`subject`にダミークラスをnewしたものが入ってる）．

```ruby
describe EmailValidator, type: :validator do
  describe '#validate_each' do
    context 'with invalid format address' do
      let(:value) { 'kokoro.pyonpyon' }
      it { is_expected.to_not be_valid }
    end

    context 'with valid foramt address' do
      let(:value) { 'kokoro.pyonpyon@example.com' }
      it { is_expected.to be_valid }
    end
  end
end
```

`EachValidator`じゃない（`Validator`を直接継承している）場合は，validationに関係するカラム名を`attribute_names`として渡してあげる．

```ruby
describe NotOverlappedValidator, type: :validator do
  let(:attribute_names) { [:begin_at, :end_at] }
  let(:begin_at) { Time.parse("2014-12-24T12:00:00+09:00") }

  describe '#validate' do
    context 'when end_at is overlapped' do
      let(:end_at) { Time.parse("2014-12-24T09:00:00+09:00") }
      it { is_expected.to_not be_valid }
    end

    context 'when end_at is not overlapped' do
      let(:end_at) { Time.parse("2014-12-24T19:00:00+09:00") }
      it { is_expected.to be_valid }
    end
  end
end
```

値を宣言するだけでValidationのテストができるので，とても楽になる．

# References

* [**izumin5210/rspec-validator_spec_helper**](https://github.com/izumin5210/rspec-validator_spec_helper)
* [パーフェクト Ruby on Rails](http://www.amazon.co.jp/gp/product/4774165166/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4774165166&linkCode=as2&tag=masayuki5210-22)
* [Active Record Validations — Ruby on Rails Guides](http://guides.rubyonrails.org/active_record_validations.html#custom-validators)
* [てめえらのRailsはオブジェクト指向じゃねえ！まずはCallbackクラス、Validatorクラスを活用しろ！ - Qiita](http://qiita.com/joker1007/items/2a03500017766bdb0234)
* [RailsでCustom validatorをテストする - Qiita](http://qiita.com/r7kamura/items/70c22300499b795af19c)
rsyslogでリモートのsyslogをメール送信

## ネットワーク構成

* 192.168.11.39 : rsyslogサーバ(CentOS7) 
* 192.168.11.2 : mailサーバ 
* 192.168.11.254 : cisco機器
* 192.168.11.1 : ルーター

# 設定

## cisco側

```bash:
(conf)#logging trap notifications
(conf)#logging host 192.168.11.39
```

## rsyslogサーバ側

### udp514でLISTEN

```diff:/etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
```

### メールサーバ設定

```diff:/etc/rsyslog.conf
$ModLoad ommail
$ActionMailSMTPServer 192.168.11.2
$ActionMailFrom rsyslog@syslog.server
$template mail_subject,"syslog:%fromhost%:%msg%"
$template mail_body,"%fromhost%\r\n%msg%"
$ActionMailSubject mail_subject
$ActionExecOnlyOnceEveryInterval  -1
```

### 送信元ごとに保存先指定

```bash:/etc/rsyslog.conf
$ActionMailTo my@mailaddr
:fromhost-ip, isequal, "192.168.11.254" /var/log/rsyslog/192.168.1.254
if $fromhost-ip == '192.168.11.254' then :ommail:;mail_body
& stop
```


## syntax check

```bash:syntax&nbsp;check
# rsyslogd -N 1
rsyslogd: version 7.4.7, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.
```

## rsyslogリスタート

```bash:
# systemctl restart rsyslog
```

----

# syntax error例

## & ~

> Mar 30 07:10:09 syslog1 rsyslogd-2307: warning: ~ action is deprecated, consider using the 'stop' statement instead [try http://www.rsyslog.com/e/2307 ]

```diff:/etc/rsyslog.conf
- & ~
+ & stop
```

## $ActionMailTo

> rsyslogd: no recipient address given - specify $ActionMailTo [try http://www.rsyslog.com/e/2071 ]
> rsyslogd: error during parsing file /etc/rsyslog.conf, on or before line 66: errors occured in file '/etc/rsyslog.conf' around line 66 [try http://www.rsyslog.com/e/2207 ]

```diff:/etc/rsyslog.conf
+ $ActionMailTo my@mailaddr
  :fromhost-ip, isequal, "192.168.11.254" /var/log/rsyslog/192.168.11.254
  if $fromhost-ip == '192.168.11.254' then :ommail:;mail_body
& stop

+ $ActionMailTo my@mailaddr
  :fromhost-ip, isequal, "192.168.11.1" /var/log/rsyslog/192.168.11.1
  if $fromhost-ip == '192.168.11.1' then :ommail:;mail_body
& stop
```

* ommail の直前に$ActionMailToを都度書かないといけなかった。
bitbucketとwerckerでhubotをherokuに自動deployしてslackに通知する

- http://razokulover.hateblo.jp/entry/2014/05/21/000306
- http://morizyun.github.io/blog/wercker-ci-rspec-capistrano-deploy-auto/

ここを参考にやる


## wercker上での作業
#### 1. ユーザ登録

https://app.wercker.com/sessions/new

ここからやる。
Sign upするとメールが送られてくるのでリンクをクリックすると、ログイン出来る。

#### 2. アプリケーション登録

- `Add an application`をクリックする
- `Choose a Git provide`でBitbucketを選択して認証する
- `Select a repository`でCIしたいリポジトリを選択
- `Configure access`でrecommendedされている`Add the deploy key to the selected repository for me`を選択
- `Setup your wercker.yml`でファイル作って自分のリポジトリにpush
- `Awesome! you are all done!`になるのでFinish!`Make my app public`

#### 3. Settings→DEPLOY TARGETSでdeployの設定

- Add deploy targetで追加
- herokuを選ぶ
- Deploy target nameはお好みで。 productionとかかな
- Auto deployにチェックを入れる。ブランチはmaster
- Herokuのapi keyとかdeployするHeroku app nameとか。英語を読めば簡単に登録出来る。


だいぶメモが雑になって来た

## Bitbucket上での作業
- さっき作成した`wercker.yml`を追加するだけでいいはず。
- これでmasterにMergeすると自動deployされる。。はず。
- Deployの履歴は、werckerのDeploysで確認出来る。

雑なメモだ

ここまでやれば、masterにMergeされたりpushされると自動deployされる環境は整う。


## Deployしたらslackに通知する
https://github.com/wantedly/step-pretty-slack-notify

これが便利そうなのでこれを使う


#### 1. slack側の設定
- `Integration`の`Incoming WebHooks`を追加してWebhook URLを得る

#### 2. wercker側の設定
- `SLACK_WEBHOOK_URL`という環境変数を設定する
- Settings→PIPELINE→Add new variableで`SLACK_WEBHOOK_URL`とslack側で取得したWebhook URLを設定する

#### 3. wercker.ymlを変更する
以下のような感じにした。

hubotをdeployするだけなので、いろいろけずった。
もっと削れるのかな。この辺の書き方がよくわからなくて、何度も失敗した。

```yaml
box: wercker/nodejs
build:
steps:
- script:
name: echo hubot build
code: |
echo "hubot build"
after-steps:
- wantedly/pretty-slack-notify:
webhook_url: $SLACK_WEBHOOK_URL
deploy:
steps:
- heroku-deploy
after-steps:
- wantedly/pretty-slack-notify:
webhook_url: $SLACK_WEBHOOK_URL
```


## 所感
簡単にいろいろ出来て便利だったー
Macで最初にやる設定変更

Macって人によって使い心地が本当に違うので、自分なりの設定を残しておく。

**2016/12/23に画像共々更新**

# キーボード
`Ctrl+スペース`はEclipseとかXcode、AndroidStudioで使いたいのでチェックは外す。
なんかいつの間にかSpotlightは`Ctrl+スペース`じゃなくて`Cmd+スペース`になってたので心置き無く外せる。

<img width="780" alt="スクリーンショット 2016-12-23 13.12.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/0687cbea-2e1d-448d-f3ac-da62adc8217f.png">


`Alt+\`とかすごくめんどくさいので`¥`じゃなくて`\`に。
あと数字も全角で入力なんてしないのでチェック外す。

<img width="780" alt="スクリーンショット 2016-12-23 13.30.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/3d51fae7-7992-06af-e6cc-4ca3f0cec402.png">


# アクセシビリティ
ズーム機能って便利だよね。

<img width="780" alt="スクリーンショット 2016-12-23 13.32.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/c34e7a37-d82b-6039-30ac-cd509d5c57b8.png">


ドラッグ有効にすると操作しやすい。

<img width="780" alt="スクリーンショット 2016-12-23 13.32.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/472c2768-cc1d-2c4c-0ba5-ec832fda4379.png">


# トラックパッド
トラックパッドのもろもろ。
使わないのは誤操作防止の意味でもチェックは外す。
Macはトラックパッドが本当に優秀。

<img width="780" alt="スクリーンショット 2016-12-23 13.36.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/99924165-c269-685c-d5f3-a5bb2ac3d79e.png">

<img width="780" alt="スクリーンショット 2016-12-23 13.36.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/c797a5b4-bedc-7c01-c497-02fdab82d769.png">

<img width="780" alt="スクリーンショット 2016-12-23 13.37.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/c32e5d29-2a8c-9074-8fdc-3974959eee55.png">


# 日付と時刻
日付見えた方がいいし、秒も見えると何かと便利。

<img width="780" alt="スクリーンショット 2016-12-23 13.43.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/6bcf6f13-846f-8dc5-11aa-f565653109fa.png">


---

他にも初期状態から変えてる箇所があるかもしれないので、気づいたら更新します。
(Yosemite) Composerのインストール + FuelPHPプロジェクト作成

# はじめに
OS X YosemiteでComposerをインストールして利用する。

# 環境
OS X Yosemite (iOS 10.10.2)

# 前提条件

* HomeBrewでphpをインストールしていること。 
していない場合、下記の通りエラーが発生する。

```
$ brew install homebrew/php/composer
Cloning into '/usr/local/Library/Taps/homebrew/homebrew-php'...
remote: Counting objects: 8380, done.
remote: Total 8380 (delta 0), reused 0 (delta 0), pack-reused 8380
Receiving objects: 100% (8380/8380), 1.72 MiB | 496.00 KiB/s, done.
Resolving deltas: 100% (5598/5598), done.
Checking connectivity... done.
Tapped 446 formulae
==> Installing composer from homebrew/homebrew-php
composer: Missing PHP53, PHP54, PHP55 or PHP56 from homebrew-php. Please install one of them before continuing
Error: An unsatisfied requirement failed this build.
```

# 手順

## Composerのインストール

```
$ brew install homebrew/php/composer
$ composer --version
Composer version 1.0.0-alpha9 2014-12-07 17:15:20
```

## FuelPHPプロジェクト作成　

```
$ composer create-project fuel/fuel:dev-1.7/master プロジェクト名
```
anyenv環境構築済みのDockerfile

メモ書き
ひとまずCentOS7ベースで作成

```
FROM centos:7

# System update
RUN yum -y update

# Soft install
RUN yum install -y vim tar zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel gcc libyaml-devel libffi-devel gdbm-devel ncurses-devel git make

# anyenv
RUN git clone https://github.com/riywo/anyenv /usr/local/anyenv
RUN echo -e "if [ -d /usr/local/anyenv ] ; then" >> /etc/profile.d/anyenv.sh
RUN echo -e "    export PATH=/usr/local/anyenv/bin/:\$PATH" >> /etc/profile.d/anyenv.sh
RUN echo -e "    eval \"\$(anyenv init -)\"" >> /etc/profile.d/anyenv.sh
RUN echo -e "    for D in \`ls /usr/local/anyenv/envs\`" >> /etc/profile.d/anyenv.sh
RUN echo -e "    do" >> /etc/profile.d/anyenv.sh
RUN echo -e "        export PATH=\"/usr/local/anyenv/envs/\$D/shims:\$PATH\"" >> /etc/profile.d/anyenv.sh
RUN echo -e "    done" >> /etc/profile.d/anyenv.sh
RUN echo -e "fi" >> /etc/profile.d/anyenv.sh
RUN echo -e "export ANYENV_ROOT=\"/usr/local/anyenv\"" >> /etc/profile.d/anyenv.sh
ENV PATH /usr/local/anyenv/bin:$PATH
ENV ANYENV_ROOT /usr/local/anyenv
```
標準入力で渡された数値群をFixnumとして受け取る方法～mapとprocの入門を添えて～

# この記事のサマリ
・標準入力で渡されたスペース区切りの整数群は、「inputs = gets.split.map(&:to_i)」とすれば、各要素に対してto_iで、数値化された状態で受け取ることができる
・もし、上記「&:to_i」の部分が説明できない人は、この記事を読むとわかるようになるはずです。

# 背景
[paiza](http://paiza.jp/member/guide)という、プログラムを書く技術を計測(課題がいくつかあって、それに対してコードを提出→採点という流れ)して、それを転職に利用できるという、プログラマーと企業とのマッチングを行うサイトがあり、情報収集や勉強がてら利用させていただいているのですが。。。
paizaの環境の都合上(オンラインでリアルタイム採点をするため)、標準入力で受け取ったテストデータが、期待通り動作するか？というのが、問題を解く大前提になっているます。そのため、必ず「標準入力を適切に受け取る」というコードが必要になります。
問題の中には、「スペース区切りで入力され、かつそれがすべて数値」ということも珍しくありません。そんな時、入力値をsplitして、さらにmap(&:to_i)として、文字列ではなく数値として受け取ることが多かったのですが、この(&:to_i)って部分を、ちゃんと説明できないなぁってことに気づいて、勉強がてら整理してみることにしました。

# 何も考えずに、とりあえず受け取る場合

たとえば、「標準入力から３つの数値(x,y,z)を受け取り、x * y + z の結果を標準出力に表示する」という例があったとします。

```rb
op1 , op2 , op3 = gets.split
puts op1.to_i * op2.to_i + op3.to_i
```
こんな感じで「標準入力から３つの引数を受け取って、計算して表示するイメージになるかと思いますが、getsで取得した値は、文字列ですので、数値計算をする場合は「to_i」を使ってあげる必要があります。3つくらいなら無視できる人もいるかもしれませんが、ちょっとイケてないですよね。。

# ちょっとmapを使っておしゃれにしてみる

さっきの例では、やっぱりto_iがたくさんでてきていて冗長なので、排除したいですよね？
そんなとき、便利なのが、mapやcollectです。
「mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。collectメソッドの別名です。」とのことです。引用元：[http://ref.xaio.jp/ruby/classes/array/map](http://ref.xaio.jp/ruby/classes/array/map)
mapを使うか、collectを使うかは、宗教論争のようなものがあるみたいなのですが、今回の場合は文字列を数値にマッピングするイメージになるので、mapを使った方が直観的だと思います。
素直にmapを使うとこんな感じで書けます。

```rb
op1 , op2 , op3 = gets.split.map{|v|
  v.to_i
}
puts op1 * op2 + op3
```

結構すっきりしましたね。標準入力で渡された値を、splitして、それらをすべてto_iしてあげた上で、op1 ,op2, op3に渡すようにしたため、to_iが1回だけになりました。

# さらにすっきりさせましょう
先ほどは、mapメソッドに対して、{|v| v.to_i}のようなブロックを渡していましたが、ブロックの代わりにProcオブジェクトを渡すことができます。(Procというのは、ブロックをオブジェクト化したものです。)

たとえば、Proc.newでProcオブジェクトを生成し、それをmapに渡す場合は、以下のように記述することができます。

```rb
p = Proc.new{|v| v.to_i}
op1 , op2 , op3 = gets.split.map(&p)
puts op1 * op2 + op3
```

すみません。。。あんまりすっきりしませんでした。
この&pというのが、見慣れないかもしれません。[リファレンス：ブロック付きメソッド呼び出し](http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fcall.html#block)に、「to_proc メソッドを持つオブジェクトならば、`&' 修飾した引数として渡すことができます。デフォルトで Proc、Method オブジェ クトは共に to_proc メソッドを持ちます。to_proc はメソッド呼び出し時に実 行され、Proc オブジェクトを返すことが期待されます。」という記載があります。
Procオブジェクトは、to_procを持っていますので、&をつけてブロック付メソッド(この場合はmap)を呼び出すことで、to_proc(この場合は、to_iになる)が評価されるという、流れになります。

さて、ここで重要なポイントが2つあります。
まず、参照先で言及している通り
１．「to_procメソッドを持つオブジェクトならば、～」とある通り、ProcやMethodでなければならないということはありません。ダックタイピング的に、to_procを持っていればよいという点。
２．実は「Symbol」クラスは、to_procメソッドを持っている点

です。

# Symbol.to_procという魔法をかけて、さらに綺麗に
Symbolクラスは、to_procメソッドを持っているため、ブロック付きメソッド呼び出しとして渡せるということがわかりました。
では、Symbolオブジェクトのto_procは何をやってくれるのでしょうか？
それは、[http://ref.xaio.jp/ruby/classes/symbol/to_proc](http://ref.xaio.jp/ruby/classes/symbol/to_proc)を参照すると、「to_procメソッドは、シンボルと同名のメソッドを使う手続きオブジェクト（Proc）を作成して返します。」とのことです。
つまり、
:to_aだろうが:to_iだろうが、:hogehogeだろうが、渡したら、to_aメソッド、to_iメソッド、hogehogeメソッドを呼び出そうとするというわけです。

なるほど、「ブロック付メソッドを呼び出すときは、to_procを持つオブジェクトを&つきで渡せる」ということと、Symbolオブジェクトは、to_procを持っていて、それが:to_iというシンボルならto_iメソッドを呼び出そうとするというのなら。。。

```rb
op1 , op2 , op3 = gets.split.map(&:to_i)
op1 * op2 + op3
```

と書けるわけですね。
なんとなく使っていてわかっていなかったのですが、これですっきりしました。
特に「:to_i」の魔法が感動的でした。
これを機会に、丸暗記してしまっているRubyのイディオムを、一つ一つ紐解いて、Rubyistとしての地力を向上させたいものです。
日本語環境のCentOS(Docker image)をDockerfileで書いてみた

メモ書き
vimのインストールはおまけ

CentOS6

```
FROM centos:6

# system update
RUN yum -y update && yum clean all

# set locale
RUN yum reinstall -y glibc-common && yum clean all
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

# editor install
RUN yum install -y vim && yum clean all
```

CentOS7

```
FROM centos:7

# system update
RUN yum -y update && yum clean all

# set locale
RUN yum reinstall -y glibc-common && yum clean all
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
RUN unlink /etc/localtime
RUN ln -s /usr/share/zoneinfo/Japan /etc/localtime

# editor install
RUN yum install -y vim && yum clean all
```
Prologでfor-loop

Prologでfor-loopを回す方法を紹介します。
ついでにPythonとの比較も付けてみました。

利用したProlog処理系: [AZ-Prolog 7.54](http://www.az-prolog.com/:AZ-Prolog)

# 基礎編1: リストの要素を順に出力する

```python:python
>>> my_list = [1, 2, 3, 4, 5]
>>> for x in my_list:
>>>     print x
... 
1
2
3
4
5

```

```prolog:prolog
print_list([]).
print_list([Element|List]):-
    write(Element),nl,
    print_list(List).

?- print_list([1,2,3,4,5]).
1
2
3
4
5
yes

```

# 基礎編2: リストの中身を処理して別のリストに格納
例えば、リストの中身を2倍する場合。

```python:python
>>> my_list = [1, 2, 3, 4, 5]
>>> new_list = []
>>> for x in my_list:
>>>     new_list.append(x * 2)
... 
>>> new_list
[2, 4, 6, 8, 10]
```

もしくはリスト内包表記で、

```python:python
>>> new_list = [x * 2 for x in my_list]
```

```prolog:prolog
twice_list(OldList,NewList):-
    twice_list(OldList,[],NewList).
twice_list([],NewListRev,NewList):-
    reverse(NewListRev,NewList).
twice_list([OldNum|OldList],TempList,NewList):-
    NewNum is OldNum * 2,
    twice_list(OldList,[NewNum|TempList],NewList).

?-OldList=[1,2,3,4,5],twice_list(OldList,NewList).
NewList = [2,4,6,8,10]
yes
```

もしくは差分リストを利用して、

```prolog:prolog
twice_list2(OldList,NewList):-
    twice_list2(OldList,TempList-TempList,NewList).
twice_list2([],NewList-[],NewList).
twice_list2([OldNum|OldList],List-[NewNum|Tail],NewList):-
    NewNum is OldNum * 2,
    twice_list2(OldList,List-Tail,NewList).

?-OldList=[1,2,3,4,5],twice_list2(OldList,NewList).
NewList = [2,4,6,8,10]
yes
```

# 応用編: 条件をつけてfor-loopで処理する
例えば、偶数の時のみ2倍する場合。

```python:python
>>> my_list = [1, 2, 3, 4, 5]
>>> new_list = [x * 2 if x % 2 == 0 else x for x in my_list]
>>> new_list
[1, 4, 3, 8, 5]
```

```prolog:prolog
twice_even_number(OldList,NewList):-
    twice_even_number(OldList,TempList-TempList,NewList).
twice_even_number([],NewList-[],NewList).
twice_even_number([OldNum|OldList],List-[NewNum|Tail],NewList):-
    Rest is OldNum mod 2,
    Rest = 0,
    NewNum is OldNum * 2,
    twice_even_number(OldList,List-Tail,NewList).
twice_even_number([OldNum|OldList],List-[OldNum|Tail],NewList):-
    twice_even_number(OldList,List-Tail,NewList).

?-OldList=[1,2,3,4,5],twice_even_number(OldList,NewList).
NewList = [1,4,3,8,5]
yes
```

# 感想
Pythonのシンプルさを再実感しました。
Prologはfor-loopを回す毎に新たな述語が増えてしまうのはちょっと・・・。
このへんのリスト処理については汎用的な述語を作っておくと便利かもしれませんね。
Web API のリクエスト/レスポンスを覗き込むツール hi 作った

Web API を利用するプログラムにおいて、そのデバッグが問題になることがあります。

アプリケーションは Web API に対して正しくリクエストを送れているか、そして想定通りのレスポンスを受け取れているか、をリアルタイムに確認できると便利だろう、ということで、Go で簡単なツールを作ってみました。

[HI: HTTP Inspector](https://github.com/yuya-takeyama/hi)

Web API へのリクエストの前段でプロキシのように振る舞い、HTTP リクエスト/レスポンスをターミナル上にそのまま出力してくれるので、人間がそれを目視で確認できます。

![4daf4c815257cb28e6dc7926c0ce1a83.png](https://qiita-image-store.s3.amazonaws.com/0/208/5cffce03-7193-a4c8-02c7-dd52e14f471f.png)

# インストール

`go get` でインストールできます。

```
$ go get github.com/yuya-takeyama/hi
```

もしくは GitHub Releases に Linux 用のバイナリも置いてますので、そちらもご利用ください。

# 使い方

## サーバを起動する

適当なポートを指定して起動します.

```
$ hi -port 8080
```

## アプリケーション中の Web API の URL を置き換える

実際の記述は様々だと思いますが、例えば Web API への URL が以下のように設定されている場合、

```rb
config.web_api_endpoint = "http://api.example.com"
```

以下のように書き換えることで、`hi` を前段に潜り込ませることができます。
(`hi` はローカルホストの 8080 ポートで動いている前提です)

```rb
# config.web_api_endpoint = "http://api.example.com"
config.web_api_endpoint = "http://localhost:8080/proxy/api.example.com"
```

## リクエスト/レスポンスを確認する

あとは Web API へのリクエストを発生させるようにアプリケーションを動作させれば、その内容がターミナル上に現れます。
(先に載せたスクリーンショットの通り)