OmniAICreator/Qiita-1.07M huggingface dataset:
SlackでLINEみたいにスタンプを大きく表示する

# Slackの問題点

Slackに唯一不満があるとすれば, それは**スタンプ機能**.

Slackにも絵文字機能がありますが, LINEのスタンプとは異なりサイズが小さいです. 

Slack側がカスタム絵文字のサイズを変更してくれれば話は早いのですが, TwitterのSlack公式アカウントが「サイズを大きくする予定はない」とつぶやいています.
<script src="//platform.twitter.com/widgets.js" async="" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><a href="https://twitter.com/Alex3omg">@Alex3omg</a> No plans to go any bigger just yet, but thanks for the feedback!

— Slack (@SlackHQ) <a href="https://twitter.com/SlackHQ/status/722163156622176256">2016年4月18日</a></blockquote>
<script src="//platform.twitter.com/widgets.js" async="" charset="utf-8"></script>

こちらの方のようにブラウザ拡張機能で絵文字サイズを拡大したり, スマホのキーボードアプリで画像URLを貼り付ける方法もあるようです.
<http://qiita.com/kyusyukeigo/items/f4192f6cf210cf6c5e33>

ただ, これだといくつか問題が.

- PC上でしか絵文字が拡大されない
- 各自が準備をする必要がある
- 絵文字を増やすのにスマホのアプリを開発しなおす必要がある

やはり

- **Slackを利用する全ての端末で同じようにスタンプをポスト・表示**
- **一度スタンプを作ったらSlackのメンバー全員が利用可能**

が望ましい.

# 解決策
こんな方法を思いついた.

1. スタンプ画像に対してカスタム絵文字とスタンプ画像のURLを用意する
2. 絵文字をポストした際に, それに対応する画像URLがあれば
  1. 絵文字を消す
  2. 画像URLのポスト (画像が展開されてスタンプっぽく表示)

やり方はいろいろあると思うが, このような構成で実装することにした.
![thumbnail](https://qiita-image-store.s3.amazonaws.com/0/135313/559ba5b3-7f7d-07e6-70e0-d9d52b74bd83.jpeg)

# 実際の動作

![stamp_on_slack_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/135313/da86ae62-010a-9575-c28c-253ddf2a8813.gif)

# やり方
細かい説明やコードに関してはこちら
https://blog.icchi.me/make-large-stamp-posting-system-for-slack
Capistranoで自動的にHTTPプロキシを建ててプロキシを通す

## 経緯

サーバーはセキュリティ確保のため、ネットワークの利用に制限があることが多いと思う。基本的に外部に出れないということも多々あるだろう。そこで、rbenvやらgemやらを使おうとすると、外部からライブラリなどを取ろうとするので、当然失敗する。ファイルをダウンロードして、サーバーに送ってコンパイルして、、というのも面倒。プロキシを通して、外部に接続することが一般的であるが、プロキシを自分で建ててね、なんて環境である場合は、プロキシ立ち上げて、接続設定して、と結構面倒。しかも、今回は、サーバーは自分からOUTPUT不可の状況（サーバー->自PC接続不可）で、SSH接続しかできないので、SSHポートフォワードを利用しないといけなくて、更に面倒。
Capistranoのように自動化ツールを使用していても、そこは手動かよってなるので、勝手に動作して欲しい。というわけで、Capistranoを実行した時に、自動的にプロキシ建てて、環境変数を設定してくれるようにした。ざっくりとこんな感じの構成を作る。

    サーバー <--> |SSHトンネル| <--> |ローカルプロキシ| <--> 外部

## 構築

### 前提条件
1. SSHポートフォワードが有効であること
1. Capistrano実行PCは、外部接続可能であること

### 自動化される構築内容
1. Webrickで、Capistrano実行元にHTTPプロキシサーバー建てる
1. Net::SSHで、リモートSSHポートフォワード機能を使い、サーバーの特定ポートとプロキシサーバーを繋ぐ
1. 環境変数HTTP_PROXY、HTTPS_PROXYを設定する

これで、ほとんどの場合、ネットワークを利用する場合、環境変数を見て自動的にプロキシを使用してくれるようになる。これをタスクファイルにしてを読み込むだけで、起動時に自動的にプロキシ経由になるので、ネットワーク接続を意識しなくて良くなる。

### コード

というわけで、タスクファイルにしたので、下記URL

http://goo.gl/xz50oE

### 懸念事項

webrickやsshを起動すると、そこで処理待ちになってしまうので、Thread を使用しているのだが、この方法が良いか分からない。終了時は全部落ちているので、動作的には問題ないと思うが、お行儀悪そう。Threadの使い方や挙動についてきちんと調べていないし、各サーバー機能ごとに非同期処理があるんだったら、そっちを使った方が正規の方法なんじゃないかと思ってる。
切断分布(Truncated distribution)の乱数をRで生成する方法

この記事は「元となる分布がＲに存在し、かつ1次元の場合」向けの内容です
「3以上5以下の値しか取らない正規分布の乱数がほしい」
「1以上の値しか取らないポアソン分布の乱数がほしい」
といったときに使えます。
#切断分布
確率変数$X$の密度関数を$f(x)$、累積密度関数を$F(x)$、逆関数を$F^{-1}(x)$とします。もし、$X$の範囲が$b<x\leq a$に制限されたなら、その密度関数は
$$
f(x|b<x<a)=\frac{f(x)}{F(a)-F(b)},\quad (b<x \leq a)
$$
で表記されます。$(X|b<X<a)$ の分布から得られる乱数は一様分布と$F(x)$、$F^{-1}(x)$から得ることができます。
$$
X|b<X\leq a\  \sim \ F(U(F^{-1}(b), F^{-1}(a)))
$$
この手法を用いることで効率よく切断分布の乱数を得ることができる。


###3以上5以下の値しか取らない正規分布の乱数
$X \sim N(2,1)$のとき$(X|3<X\leq 5)$の乱数を生成。

```
mu<-0;sigma2<-1
aa<-5;bb<-3
xx<-qnorm(runif(10000,pnorm(bb,mu,sigma2,1),pnorm(aa,mu,sigma2)),mu,sigma2)
hist(xx,xlim=c(-5,6),freq=F)
```

ヒストグラムを書くと

`
hist(xx,xlim=c(-5,6))
`

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/138352/3cd73215-2a23-2902-24e0-317c62604299.png)

が得られます。


###1以上の値しか取らないポアソン分布の乱数
$X \sim Po(0.3)$のとき$(X|1\leq X)$の乱数を生成。

```
lambda<-0.3
bb<-0;aa<-Inf
xx<-qpois(runif(10000,ppois(bb,lambda),ppois(aa,lambda)),lambda)
hist(xx,xlim=c(-0.1,6))
```
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/138352/52aa031f-ab6e-0055-3179-de73d2d06b0e.png)

離散分布なので$bb$は$0.1$や$0.99$を代入しても同じ結果が得られる。

##手法の利点
もし$X$から乱数を発生し$b<X\leq a$ が既定の回数得られるまで繰り返すと、計算時間がかかる場合がある。
本手法はその問題を回避することができる。
Pythonで文字列から定義済みクラスのインスタンスを作る


やってみたメモ。


## 前提
- Python3.5.2 を利用
- ファイルは以下の通り

```
.
├── main.py
└── classes.py
```

```classes.py
class Hoge(object):

    def __init__(self):
        self.name = 'hoge'

    def get_name(self):
        print(self.name)

class Fuga(object):

    def __init__(self):
        self.name = 'fuga'

    def get_name(self):
        print(self.name)
```


## globalsを使うパターン
```main.py
# ここは別に`from classes import *`でも可
from classes import Hoge
from classes import Fuga

cls = globals()['Hoge']
instance = cls()
instance.get_name()  #=> 'hoge'

cls = globals()['Fuga']
instance = cls()
instance.get_name()  #=> 'fuga'
```


## getattrを使うパターン
※ `classes.py`はそのまま使うものとして。

```main.py
import classes

cls = getattr(classes, 'Hoge')
instance = cls()
instance.get_name()  #=> 'hoge'

cls = getattr(classes, 'Fuga')
instance = cls()
instance.get_name()  #=> 'fuga'
```

`getattr`の対象となるモジュール（今回でいうところの`classes`）に、文字列で動的に指定するクラスが含まれていないといけない。
実際、1クラス1ファイルで分割して書くことが多いと思いますので、あまり実用的じゃなさそうですね。あくまで1つの方法として。

他にも方法はあると思いますが、実用的なのは`globals`を使うパターンでしょうか。


※ 備考（2016/09/04）
元々タイトルを「Pythonで動的にインスタンスを生成する」にしていましたが、@mtwtk_man sanにご指摘を受けて変更しました。
boxコマンドでpharファイルをビルドする

box (https://box-project.github.io/box2/) を使ってpharファイルを作ってみます。

# クイックスタート

以下のmain.phpを格納するpharファイルを作ります。

```main.php
<?php
echo "Hello Phar!\n",
    __FILE__,"\n",
    Phar::running(),"\n",
    Phar::running(false),"\n";
```

boxのインストール

```
$ composer global require kherge/box
```

box.jsonファイルの作成

```box.json
{
    "main": "main.php",
    "stub": true
}
```

ビルド

```
$ box build
```

default.pharというファイルが作成されました。実行結果の違いを見てみましょう。

```
$ php main.php
Hello Phar!
C:\Users\ishida\src\box-test\main.php


$ php default.phar
Hello Phar!
phar://C:/Users/ishida/src/box-test/default.phar/main.php
phar://C:/Users/ishida/src/box-test/default.phar
C:/Users/ishida/src/box-test/default.phar
```

`Phar::running()`を使って、現在pharで実行されているかを調べることができます。

また、pharファイル内では、`__FILE__`や`__DIR__`はpharファイル内を指します。pharファイルの外側にアクセスしたい場合は、`__FILE__`や`__DIR__`の代わりに`Phar::running(false)`や`dirname(Phar::running(false))`を使います。

`box.json`の他のさまざまなオプションについては、`box help build`を見ましょう。気が向いたら追記します。
フリーランスミートアップ#1に参加したのでメモ

freeeさんのオフィスで行われたフリーランスミートアップで登壇してきた。所感とか気づきについてのメモ。

[【満員御礼！】フリーランス ミートアップ](http://connpass.com/event/34460/)


## 発表

### 発表資料

[気がついたら正社員兼フリーランスでグローバルリモートワークしていたので、その話](http://www.slideshare.net/chuckhayes4/ss-65638592)

### 発表で漏れたところ

- 資料の中では、仕事をどのように依頼されたか話した。でも、そういえば自分から仕事を取りに行こうとしたことはあった。
 - Indeedで「リモート可 & フロントエンド & オフショア」のジョブアラート（求人検索結果を定期的にメールで送ってくれやつ）を作成した
 - Twitterで「I'm looking for contract remote dev job. Anyone interested in hiring me? :) #freelance #contract #frontend #javascript」みたいに何度かつぶやいている。反応はややあったけど、条件は微妙だった…
      - 有効な結果が出ていないので、スライド中には含めなかった。
- 「自社サービス開発を、無期契約で行っている」という点をもっと強調すればよかった。
    - たぶん一般的なフリーランスの方の仕事って期間や案件がもっとカッチリと決まっていると感じたので、自分の仕事との違いを強調したほうが良かったかも。

### 受けた質問

- 納税関係・銀行の手数料はどうなっているのか
    - 正直、全く答えられなかった。年度末の確定申告までに調べておけばいいかなあという気持ち。そろそろ動かないと。
- スライドの中で「働き方として、例）朝30分、夜30分」と書いた。30分の案件なんてあるのか
    - 上述のとおり自社サービスなので、そこらへんはフレキシブル。例えばABテストの文言出し分け、くらいならサクッとやってしまえる。

## ディスカッション

### 受けた質問と答え

- 自宅での仕事・プライベートの切り替えはどうしているか？
    - 即答できなかった。そういえばどうしてるんだっけ…。案外切り替えできていないのかもしれない。何か考えたい。
- 「フロントエンド」の範疇とは？
    - 求人・会社によってまちまち。HTML/CSSだけでOKという案件もあれば、イラレ・フォトショ的なデザイン方面を希望されることもある。
- 海外の仕事は職務分割はしっかりしているのか？ゆるいのか？
    - 自分が携わっているものに関しては、YES。職務はカッチリ分かれている印象。余談だけど、意思決定と実装がしっかりと分かれている方がリモートしやすい印象。
- メールで仕事を受注するのだが、英語がキツイ。特に契約関連。良いツールは？
    - 残念ながら自分はSlackやGituhbでカジュアルにコミュニケーションしているので、あまり苦痛に感じていない…。やっぱり長い目で見れば、英語力をちょっとずつ上げていくのが良い気がする。
- ポートフォリオサイトで技術力を見せる必要はあるのか？
    - とにかくシンプルなHTML/CSSで作っておくだけでもプラスだと思う。具体的なコードについては、後から書いて、Githubにあげてリンクを貼ればいいと思う。

### 気づき

- 自分が携わっているのは自社サービス。でも世の中には単発・短期の仕事もある。そのたびに契約や面接を行うのは大変だろうなあという気持ち。
- 単価の交渉でXXXすると良いみたいなTipsを知ることができた。自社サービスはシンプルにチームにジョインするという感じなので、単発の業務委託の場合はもっとお金や契約に関してビシっとしていなくてはいけないんだろうなあと思った。
- 財務系のフリーの方と会えた。フリーの職域っていろいろある。
- おしゃれでCoolな個人名刺を持っている人が多かった。作りたい。
- freeeさんのオフィスはおしゃれで世界観があって良かった。立地もちょうどいい感じ。ただスクリーンが床スレスレまで広がっているので、スライドの下の方は、後ろの席の人は見えないかもしれないと思った。（disりとかではなく、単純な知見として）
  - フリーの方の評判がとっても良いので、確定申告の際にはぜひお世話になりたい。

## イベントへの印象

お世辞抜きで、今まで参加したイベントの中で一番良かった。

- 主催者の[みかみさん](https://twitter.com/skyguild)さんが非常に感じが良く、進行も上手いと感じた。
- イベントのお手伝いさんの人数も、参加者40人に対して5,6人とちょうどいい感じ。
- セッション（登壇）の合間にグループトークがあるのが良かった。
- 自分のような「会社員兼フリーランス」もいれば、法人格を持ってるかたや学生の方もいたみたいで、層が広くてよかった。
Vuforiaであそぼう！ その2

<a href="http://qiita.com/ayumegu/items/91c1811acab95da817f4" target="_blank">Vuforiaであそぼう！</a>
Vuforiaであそぼう！ その2
<a href="http://qiita.com/ayumegu/items/5b72a91cdd6ec247883a" target="_blank">Vuforiaであそぼう！ その3</a>
<a href="http://qiita.com/ayumegu/items/a9c8218cbe187bb0c445" target="_blank">Vuforiaであそぼう！ その4</a>

前回はとりあえず基本のところまでだったのでちょっと違うことを。

その前にその前に
みてみてかわいい！
前回のを常にこっち見てるようにしたのと、自動瞬きいれただけですが。
後ろからとるとイナバウアーみたいなことになるけどね・・・w
macについてるカメラでとったgifなので紙の方を動かす関係で撮るのに結構苦労しましたw
あとは声乗せて幾つかモーション入れたらもっと幸せになれるね。
あ〜手にマーカー書いて手乗りとかやりたい。
<img src="http://ayumegu.daa.jp/img/Qiita/VuforiaTest.gif" />

常にこっちを見るはFinal IKでやってます。前に書いたこちらの記事参照のこと
<a href="http://qiita.com/ayumegu/items/fcb2820b7a43d9c24a14" target="_blank">Final IKで遊んでみる ~ペットを手なずけてみた~</a>


##サンプルのvirtual Buttonやってみました
macのカメラで撮ってます。
<img src="http://ayumegu.daa.jp/img/Qiita/VuforiaTest2.gif" /><img src="http://ayumegu.daa.jp/img/Qiita/VuforiaTest3.gif" />

これは楽しく一人で遊べそうです。
と思って十字キーみたいなのやってみたんだけど・・・・
あまり精度が良くない。
macからとっているのでカメラの角度もいけないんだけど。
iosで試したら真上からであれば多少はましだけどあまりやっぱり正確な動きはしなかった・・・。
ピアノとかやりたかったんだけど諦めた。

ここら辺の設定とかも変えたりしてみたけどあんまり変わった感じがしなかったです。
![スクリーンショット 2016-09-03 19.10.38.png](https://qiita-image-store.s3.amazonaws.com/0/46444/5d0a4d3e-48e4-df5c-de69-4da3ff8e737f.png)

<img src="http://ayumegu.daa.jp/img/Qiita/VuforiaTest5.gif" />
というわけで操作はやっぱり端末で行った方が良さそうだな・・・という結論に至った。

###複数マーカーをやってみた。
Vuforia BehaviourのMax Simultaneous Tracked Imagesの数を変えれば複数いけます
![スクリーンショット 2016-09-03 20.02.21.png](https://qiita-image-store.s3.amazonaws.com/0/46444/e587f0ef-0768-47a0-d4b7-f4294cfa2465.png)

複数できたけど、同じマーカーで複数はむりなようだ・・・。
インスペクタにそういった設定項目もないし、フォーラムみたいなスレッドにもそういう機能はないとあった・・・。
カードゲームごっこはダメか・・・。
![スクリーンショット 2016-09-03 20.03.24.png](https://qiita-image-store.s3.amazonaws.com/0/46444/da9d31e9-b0c3-b060-33f0-502c2e636b41.png)

今回はここまで。
Rails: 階層構造のリソースで子リソースのIDを連番にしたい

Railsではルーティングでリソースを階層構造にできますが、子リソースのIDは子リソース全体の連番になってしまい、URLにしたときかっこ良くないことがあります。

```txt:こうではなく
/questions/3 ... 質問のURL
/questions/3/answers/100 ... 質問3への回答の詳細URL
/questions/3/answers/123 ... 同上
/questions/3/answers/145 ... 同上
```

```txt:こうしたい
/questions/3 ... 質問のURL
/questions/3/answers/1 ... 質問3への回答の詳細URL
/questions/3/answers/2 ... 同上
/questions/3/answers/3 ... 同上
```

いろいろ調べましたが、sequencedというgemで手っ取り早く解決できるようです。

# sequencedのインストール


```rb:Gemfile
gem 'sequenced'
```

```console
$ bundle install
```

# モデルを作る

連番をつけたいモデルに`sequential_id`カラムを追加し、DBをマイグレーションします。例えば、Questionに複数のAnswerがつく場合、Answerに`sequential_id`を追加します。

```console
$ rails generate model Question
$ rails generate model Answer question:references sequential_id:integer
```

```rb:db/migrate/20160903082623_create_answers.rb
class CreateAnswers < ActiveRecord::Migration
  def change
    create_table :answers do |t|
      # null: falseを追加
      t.references :question, index: true, foreign_key: true, null: false

      # null: falseを追加
      t.integer :sequential_id, null: false

      t.timestamps null: false
    end
    # 複合ユニーク制約
    add_index :answers, [:question_id, :sequential_id], unique: true
  end
end
```

```console
$ rake db:migrate
```

Answerモデルに`acts_as_sequenced`を追加します。

```rb:app/models/answer.rb
class Answer < ActiveRecord::Base
  belongs_to :question

  # この行を追加
  acts_as_sequenced scope: :question_id
end
```

これで、AnswerはQuestionごとに連番になります。


参考: [Rails: sequencedでネストしたリソースのIDを連番にする](https://suin.io/548)
SQLite Dotinstall メモ

##コメントアウト方法
`-- コメント`
or 
`/* コメント*/`

##スキーマ
`.schema`
データベースの構造

##データ型

・blob（Binary Large OBject）
→小さい画像やファイルなど保存できる

##select関連
`.headers on`
カラム名を表示

`select id, name as user_name from users;`
id| user_name

`select * from users `
*すべて

##where関連
複数の値のどれかに合致するものを抽出したい場合は in 
` select * from users where name in ('taguchi', 'fkoji');`
taguchiとfkojiに当てはまるものすべて抽出

##like関連
文字列に関して前方一致とか部分一致で抽出したい場合には like を用いる

` select * from users where name like 's___';`
文字列にsを含むものすべて

##order by､limit関連
`select * from users where score is not null order by score desc limit 3;`
スコアの降順に並び替えて、3件表示に制限する。

##viewで抽出条件を保存

hiscoreの定義
`create view hiscore as select * from users order by score desc limit 5;`

hiscoreの呼び出し
`select * from hiscore;`
プログラミング Elixir 第一章

# 概要

[プログラミング Elixir](https://www.amazon.co.jp/dp/4274219151)

Elixir の概要と、インストール方法、Elixir の REPL である iex の使い方などが紹介されている。Elixir は並列性が高く、関数同士をつなげるのが容易で柔軟性の高い言語とのこと。

# インストール方法 (Mac)

Bundler で一発

```
% brew install elixir

% elixir -v
Elixir 1.3.2
```

# iex

h でヘルプが見れたり、

```
> h IO.puts

                    def puts(device \\ group_leader(), item)

Writes item to the given device, similar to write/2, but adds a newline at the
end.
```

i で値の情報を確認できる

```
> i 123
Term
  123
Data type
  Integer
Reference modules
  Integer
```

ホームに `.iex.exs` というファイルを作れば、カラーなど自分で色々とカスタマイズもできるとのこと。

# Hello World

初心者の定番 Hello World!!

```ex:hello_world.exs
IO.puts 'Hello, World!'
```

```
% elixir hello_world.exs
Hello, World!
```

できたー
gs_init.psが見つからない時の対応方法メモ

久しぶりにTeXを使ってモノを書かなければならなかった。`dvipdfmx`を使ったらコンパイルが通らなかった（前は同じ端末で動いてたのになぜ？）ので対応方法をメモ。

# 環境

Mac OSX Yosemite 10.10.5

# エラー内容

エラーメッセージとしてはこんな感じ。dviからpdfに変換できない。

```
$ dvipdfmx paper.dvi
...
... GPL Ghostscript 9.16: Can't find initialization file gs_init.ps.
```

# 対応
Ghostscriptが何かアヤシイので確認。

```
$ gs -v
GPL Ghostscript 9.16 (2015-03-30)
Copyright (C) 2015 Artifex Software, Inc.  All rights reserved.
```

インストールし直そうと思い、homebrewで入れてみる。9.19をインストール。

```
$ brew install ghostscript
```

まだなおらないし、`gs`コマンドのバージョンが変わってないぞ。。

```
$ dvipdfmx sample.dvi
...
... GPL Ghostscript 9.16: Can't find initialization file gs_init.ps.

$ gs -v
GPL Ghostscript 9.16 (2015-03-30)
Copyright (C) 2015 Artifex Software, Inc.  All rights reserved.
```

`gs`コマンドはシンボリックリンクで、それがhomebrewで入れたものに向いてないっぽい。

```
$ ls -al $(which gs)
... gs -> /usr/local/bin/gs-X11

```

リンクを張り替える。

```
$ rm /usr/local/bin/gs
$ ln -s /usr/local/Cellar/ghostscript/9.19/bin/gs /usr/local/bin/gs
```

`gs`のバージョンが変わる。

```
$ gs -v
GPL Ghostscript 9.19 (2016-03-23)
Copyright (C) 2016 Artifex Software, Inc.  All rights reserved.
```

動くようになる。

```
$ dvipdfmx paper.dvi
paper.dvi -> paper.pdf
[1][2][3][4][5][6][7][8][9][10] ... 
```
HTML5 Conference 2016 Notes (part2)

# HTML5 Conference 2016 Notes (part2)
## Growth Hack by Kubota-san
Most people use Google Analytics, but couldn't reach to analysis.
1. Impact First
Improve from big area
2. Target Indication
CVR: more than 1%
Direct return rate: less than 40%
Lead to Sales conversion rate: more than 10%
3. Marketing Target
Let's do Persona design

### Growth Hack
Focus on Bright Spot is important
- Charpentier effect
  Equivalent Lemon x 100
- Cocktail party effect
　Everyone can hear own name
- Halo effect
  No. 1
- Caligula effect
  We cannot sell
- Reframing
- Zeigarnik effect
  Peope wants to know if it isn't completed.
  Find more on the web
- Affordance effect
- Comparison
- Number
- Picture
- Magic number
  Twitter found out the active ration increase when the user follow 7 other users initially.
- Puma
  Pele ties shoes when the play starts
- Mailbox
  User can't use at first.
  Waiting some people
- Uber
  Free service on Boston
- Wantedly
  Apply -> Go to talk with
- Yodobashi Camera
  encourages Show rooming
- advertisement pillar
  Pocky. Get LINE stamp
- Embassadar
- Google Analytics Completion Guide
- How to do growth hack [https://kobit.in/growthhack]
- HTML5j web marketing group
### Q&A
- Is it OK to set age as 25~27?
  Persona is only one person. It should be 27.
  Assume the nearest station, distance by foot
- What is the best confirmation cycle?
  We don't use time span. Instead, we use numbers.
  500 test means 0.2% if noone comes.
- Inflow and quantity
  At first, we adjust form input ratio
HTML5 Conference 2016 メモ (パート2)

# HTML5 Conference 2016 メモ (パート2)
## Growth Hack by 窪田さん
殆どの人がGoogle Analyticsを使っているものの分析まで至っていない
1. インパクト・ファースト
なるべく大きなところから改善する
2. ターゲットの目安
CVR: 1%以上
直帰率: 40%以下
リードからの営業転換率: 10%以上
3. マーケティング・ターゲット
具体的なペルソナ設計をしよう

### グロース・ハック
ブライトスポットに集中することが重要
- シャルパンティエ効果
  レモン100個文の
- カクテルパーティー効果
　自分の名前は聞き取れる
- ハロー効果
  1位
- カリギュラ効果
  売れません
- リフレーミング
- ツァイガルニック効果
  未完了だと気になる。続きはWebで
- アフォーダンス効果
- 対比
- 数字
- 写真
- マジックナンバー
  Twitterでは最初に７人フォローするとアクティブ率が高かった
- Puma
  ペレは試合開始時に靴紐を結ぶ
- Mailbox
  すぐに使えない。何人待ちです。
- Uber
  ボストンで無料の配車サービス
- Wantedly
  応募 -> 話を聞きに行く
- ヨドバシカメラ
  ショールーミングを推進した
- 広告塔
  ポッキー。LINEでスタンプをもらえる
- アンバサダー
- Google Analytics 完全ガイド
- グロースハックの完全なやり方[https://kobit.in/growthhack]
- HTML5jウェブマーケティング部
### Q&A
- 年齢の幅は25~27等でもいいか。
  ペルソナはたった１人なので27才なら27才
  住んでる駅。徒歩何人まで仮定している
- 確認サイクルの周期は?
  期間で区切らない。回数でやっている。
  500回テストだと1回も来なければ0.2%
- 流入量と質
  まずはフォームの記入量を調整する
ArgumentError: comparison of BigDecimal with BigDecimal failed の原因

「なんで両方`BigDecimal`やのにエラー返すん？」という問題です。

### 理由

`NaN`を比較すると`nil`を返すのがエラー原因。

```.rb
'NaN'.to_d <=> '2.0'.to_d
#=> nil
```

だから`Array#min`とかのなかに`NaN`があると

```.rb
['NaN'.to_d, '2.0'.to_d].min
ArgumentError: comparison of BigDecimal with BigDecimal failed
from (pry):27:in `each'
```
と怒られる。

### 解決策

`nan?`メソッドを使って事前に弾いておきましょう。

```.rb
['NaN'.to_d, '2.0'.to_d, 3.0].reject(&:nan?).min
#=> 2.0
```

ただし、`Fixnum`には`nan?`メソッドがないので注意しましょう。
SvcTraceViewerでWCFのサービスを追う

# WCFのサービスがトレースできますよ

WCFサービスのやり取りを追うのは大変です。
Wiresharkといったパケットモニタでも見ることが出来ますが、解析するのは・・・無謀かなと。名前付きパイプによるバインドを使っているとパケットモニタでは見ることが出来ませんし。

そこで登場するのが、なんとWindows標準で用意されている SvcTraceViewer ですよ。SvcTraceViewer を使うと WCFの処理順が追えます。リスト表示はもちろんですが、サーバー側とクライント側といった複数のファイルを追加で読み込めるので、プロセス間のやりとりをグラフ表示で確認することも出来ます。

# 前準備

Web.config や app.config にトレースの構成を記述します。
本番環境に入れる場合は処理負荷がどんなものかを確認したほうが良いです。
アプリケーションを実行するとトレースファイルが出力されます。

```xml:app.config
<system.diagnostics>
    <trace autoflush="true" />
    <sources>
            <source name="System.ServiceModel" 
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
            <listeners>
               <add name="sdt" 
                   type="System.Diagnostics.XmlWriterTraceListener" 
                   initializeData= "SdrConfigExample.e2e" />
            </listeners>
         </source>
    </sources>
</system.diagnostics>
```

# SvcTraceViewer でトレースをみる

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools
などにある SvcTraceViewer.exe を起動します。
ファイルメニューの開くと、追加によって複数のファイルを同時に見ることが出来ます。
ファイルを個別で見ると時系列を追うのがすごく大変ですが、これは便利です。


リスト表示ですね。
処理時間が確認できます。

![IC382853.jpeg](https://qiita-image-store.s3.amazonaws.com/0/114529/423b4c03-20a0-8657-afeb-be86df217c54.jpeg)

プロセス間グラフ表示が出来ますし、スレッド間グラフも表示できますよ。

![IC382854.jpeg](https://qiita-image-store.s3.amazonaws.com/0/114529/976337a2-a460-a71d-fdcc-1ba23f1e369a.jpeg)


画面上部にある開始と終了で、表示する時間を絞り込むことが出来ます。

![Screenshot - 2016_09_03 , 17_25_31.png](https://qiita-image-store.s3.amazonaws.com/0/114529/c2eae6b5-56bc-4454-cdcc-a3659c458750.png)


# 参考

https://msdn.microsoft.com/ja-jp/library/ms732023(v=vs.110).aspx
https://msdn.microsoft.com/ja-jp/library/aa751795(v=vs.110).aspx
http://www.codeproject.com/Articles/17258/Debugging-WCF-Apps
7セグパネルがよく見えない


## lambda_driverについて
- lambda_driver gem: Drives your code more functioal! https://rubygems.org/gems/lambda_driver
- 16進数読み取りで、ブロックが二重になるのがいやだったのでhexにしましたが、require 'lambda_driver'としたうえで、`map(&:to_i.to_proc.with_args(16))`とすればブロック回避できます。
- また、`{|e|e.compact.empty?}`は`(&:compact >> :empty?)`と書き換えられます。
- ただ、私がlambda_driverの使い方をよく知らないので、本番中ではやめておきました。
- cf: http://yuroyoro.hatenablog.com/entry/2013/03/27/190640

## 答案

```tyama_henae07.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/orde07_7seg/
#http://qiita.com/Nabetani/items/6e7a6fadbfaa4ae20e89

A=%w(3f	06	5b	4f	66	6d	7d	27	7f	6f).map(&:hex)
B=%w(40	79	24	30	19	12	02	58	00	10).map(&:hex)

def getfirst(a)
	#無効となる条件は、
	#1) 空の要素がある
	#2) 「何らかの数字を表示しなければならない桁」より右に空白しか表示できない桁がある
	#3) (1桁の場合を除き)先頭桁が0しか表示できない
	return nil if a.any?(&:empty?)
	idx=a.size.times.find{|i|!a[i].include?(nil)}||a.size-1
	# a[idx]はnilを含まないか最終桁である。
	# 最終桁でない場合nilを含まないので、0だけを除去する。
	# 最終桁の場合はnilを含みうるので除去する。逆に0を除去してはならない。
	first_digits=a[idx].reject{|e|idx<a.size-1 ? e==0 : e==nil}
	return nil if first_digits==[]||a[idx+1..-1].any?{|e|e.compact.empty?}
	first_digit=first_digits.first.to_s
	first_digit+a[idx+1..-1].map{|e|e.compact.first}*''
end
def getlast(a)
	#「空白にしかならない桁」より右の、最後の要素
	# たとえば[[nil,1],[0]]の場合に、getfirst()のidxとgetlast()のidxは異なる
	# [[nil,0],[1]]等を正しく処理できないが、入力として作れないのでセーフ
	idx=((a.size-1).downto(0).find{|i|a[i].compact.empty?}||-1)+1
	a[idx..-1].map(&:last)*''
end

while gets
	#前半戦：可能性のある数字を列挙する(空はnil)
	a,b=$_.split(',').map{|e|e.split(':').map(&:hex)}
	a0=a.map{|e|(e==0x00?[nil]:[])+(0..9).select{|i|(e&A[i])==e}}
	b0=b.map{|e|[nil]+(0..9).select{|i|(e&B[i])==e}}
	x=a0.zip(b0).map{|x,y|x&y}
	#後半戦：表示しうる数字を検討する
	if false
		# 組み合わせ全列挙でも1秒未満で終わった…
		a=x.shift.product(*x).map{|e|
			e.map{|f|f ? f.to_s : ' '}.join.lstrip
		}.reject{|e|
			e.empty? || e.include?(' ') || (e.size>1&&e[0]=='0')
		}
		puts a.empty? ? :- : a.map(&:to_i).minmax*','
	else
		first=getfirst(x)
		if !first
			puts :-
		else
			puts '%s,%s'%[
				first,
				getlast(x)
			]
		end
	end
	STDOUT.flush
end
```
ホームページを一括ダウンロードする

# 手順
1. wgetをインストールする
[Google検索 wget install](https://www.google.co.jp/webhp?#q=wget+install)

2. ダウンロード対象をチェックする
```wget -mkEpnp --spider -nv ホームページのURL```

3. ダウンロードを実行する
```wget -mkEpnp -nv ホームページのURL```

# 参考情報
[wgetコマンドオプションの指定方法](http://www.guyrutenberg.com/2014/05/02/make-offline-mirror-of-a-site-using-wget/)
tarコマンドの使い方

# アーカイブ（圧縮なし）

```
tar cvf dest.tar src
```

# アーカイブ（圧縮あり）

```
tar czvf dest.tar.gz src
```

# アンアーカイブ（圧縮なし）

```
tar xvf dest.tar
```

# アンアーカイブ（圧縮あり）

```
tar xzvf dest.tar
```
Qiitaの記事をオートインクリメントな番号で参照する？

# はじめに

とある理由で受けとった壊れたQiitaのURLを開いたところ、完全に意図しないページに飛ばされた。これを元に色々と調べた結果、どうやらQiitaの記事は$1$から始まるオートインクリメントな番号でも参照できそうであるということが分った。

# 記事のリダイレクト機能

QiitaはユーザーIDの変更などで記事URLが変更されても、引き続き古いURLが使えるようになっている。これは次のように確かめることができる。まず、完全にアクセスできるURL`http://qiita.com/yyu/items/aab20a0d1de7cf786409`のユーザーIDである`yyu`を適当に置き換えて、例えば`http://qiita.com/this_is_a_pen/items/aab20a0d1de7cf786409`などとしてアクセスしても、次のようにリダイレクトされる。

```console
$ curl --include http://qiita.com/this_is_a_pen/items/aab20a0d1de7cf786409
HTTP/1.1 302 Found
Cache-Control: no-cache
Content-Type: text/html; charset=utf-8
Date: Sat, 03 Sep 2016 07:23:42 GMT
Location: http://qiita.com/yyu/items/aab20a0d1de7cf786409
Server: nginx
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: bf516f1e-348c-4fdf-9317-6addf17df427
X-Runtime: 0.021502
X-XSS-Protection: 1; mode=block
transfer-encoding: chunked
Connection: keep-alive

<html><body>You are being <a href="http://qiita.com/yyu/items/aab20a0d1de7cf786409">redirected</a>.</body></html>
```

# 壊れたURLとオートインクリメントな記事番号

URL`http://qiita.com/yyu/items/1638`を受け取って開いたところ、ユーザーIDが`yyu`であるのに全く関係のないユーザーの記事が表示された。このことから、これはもしかして$1638$番目の記事が表示されたのではないかと考えて、次のようなURLをためした。

```console
$ curl --include http://qiita.com/yyu/items/1
HTTP/1.1 301 Moved Permanently
Cache-Control: no-cache
Content-Type: text/html; charset=utf-8
Date: Sat, 03 Sep 2016 07:28:08 GMT
Location: http://qiita.com/yaotti/items/68f6ee99a35a15ed8074
Server: nginx
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: 438466b9-ccd7-486c-ac0e-f55034ffac0a
X-Runtime: 0.012392
X-XSS-Protection: 1; mode=block
Content-Length: 116
Connection: keep-alive

<html><body>You are being <a href="http://qiita.com/yaotti/items/68f6ee99a35a15ed8074">redirected</a>.</body></html>
```

さっそく、リダイレクト先の記事`http://qiita.com/yaotti/items/68f6ee99a35a15ed8074`を開くと、この記事は2011年09月16日に投稿されていたことが分った。そして、次のURLに次のように書かれている。

http://increments.co.jp/releases/2012/12/qiita-10k-release-jp/

>「Qiita」は、2011年9月16日のサービス開始以来、堅調に利用者数を伸ばし、2012年10月31日時点で、月間ユニークユーザー数8万人を達成しました。

このように、あとは$1$から順番に数を大きくしていったところ、古い順に記事を取得することができたので、おそらく間違いはないだろうという結論に至った。

# まとめ

今回の調査は手作業によるもので、プログラムを使って完全にそうであることを確かめるのはまだやっていないから、もしかしたらこの規則は成り立たないかもしれない。ただこういう仕様があるとしたら、何かの役に立つかもしれない。
オフラインリアルタイムどう書くE07 の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/50652 )を行っています。

問題は「7セグパネルがよく見えない」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde07_7seg/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
はじめての人工知能。自然言語処理をやってみたくなったので、python3 で MeCab を使って形態素解析をやってみる。


# 経緯
python3 でMeCab をインストールする色々な記事を参考にしてきました。
短気な性格なので、ページの頭から順番にコピペしてうまく動作するページが大好きです。「めんどくさい」が口癖で、「無いなら作る」がモットーでございます。（後半どうでもいい戯言だな。）

# 環境設定
CentOS7

# MeCab をインストール
MeCabをクローンするのが速かった。

```
# git clone https://github.com/taku910/mecab.git
# cd mecab/mecab
# ./configure  --enable-utf8-only
# make
# make check
# make install
```

下記のページからMeCabをダウンロードしてきてもいいのですが、結構面倒くさいですよ。色々なMeCabがありましたけど。

参考：MeCab
https://drive.google.com/drive/folders/0B4y35FiV1wh7fjQ5SkJETEJEYzlqcUY4WUlpZmR4dDlJMWI5ZUlXN2xZN2s2b0pqT3hMbTQ

# 辞書のインストール
辞書がないと使い物になりませんので、こちらもサクッとインストールします。

```
# cd mecab-ipadic
# ./configure --with-charset=utf8
# make
# make install
```

# MeCabをコンソールで試してみる
インストールが終わったら、コンソールで動かせますのでやってみます。

```
# mecab
 MeCab はフリーソフトウェアです

MeCab   名詞,固有名詞,組織,*,*,*,*
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
フリー   名詞,一般,*,*,*,*,フリー,フリー,フリー
ソフトウェア  名詞,一般,*,*,*,*,ソフトウェア,ソフトウェア,ソフトウェア
です  助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS
```

動きました。日本語も問題なく表示されていてホッとする瞬間です。

# python3.5系でMeCabを動かしてみる
ようやくここで、pip の出番です。

```
# pip install mecab-python3
```

他のサイトだと、いきなりこのコマンドを載せているページもあります。
でも、MeCabもインストールせずにこのコマンドが動くはずがありません。
pip万能説を信じていて、このコードを見て「こっちの方が楽じゃん！」とpipホイホイに捕まった私が、その後悩んだのは言うまでもありません。

問題なくインストールできます。

それでは、python ファイル test.py を書いてみます。

```
#test.py

# coding: UTF-8
import sys
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("めんどくさいから自分で作る"))
```

実行してみます。

```
# python test.py
めんどくさい    メンドクサイ    めんどくさい    形容詞-自立     形容詞・アウオ段        基本形
から    カラ    から    助詞-接続助詞
自分    ジブン  自分    名詞-一般
で      デ      で      助詞-格助詞-一般
作る    ツクル  作る    動詞-自立       五段・ラ行      基本形
EOS
```

MeCab.Taggerの引数を変えるとデータの出力形式を変えることができます。

 -Ochasen
 -Owakati
 -Oyomi
 mecabrc

といったものが他にもあります。

```
#test2.py

# coding: UTF-8
import sys
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("めんどくさいから自分で作る"))

m = MeCab.Tagger ("-Owakati")
print(m.parse ("めんどくさいから自分で作る"))

m = MeCab.Tagger ("-Oyomi")
print(m.parse ("めんどくさいから自分で作る"))

m = MeCab.Tagger ("mecabrc")
print(m.parse ("めんどくさいから自分で作る"))
```

興味があるので、ためしに表示させてみます。

```
# python test2.py
めんどくさい    メンドクサイ    めんどくさい    形容詞-自立     形容詞・アウオ段        基本形
から    カラ    から    助詞-接続助詞
自分    ジブン  自分    名詞-一般
で      デ      で      助詞-格助詞-一般
作る    ツクル  作る    動詞-自立       五段・ラ行      基本形
EOS

めんどくさい から 自分 で 作る

メンドクサイカラジブンデツクル

めんどくさい    形容詞,自立,*,*,形容詞・アウオ段,基本形,めんどくさい,メンドクサイ,メンドクサイ
から    助詞,接続助詞,*,*,*,*,から,カラ,カラ
自分    名詞,一般,*,*,*,*,自分,ジブン,ジブン
で      助詞,格助詞,一般,*,*,*,で,デ,デ
作る    動詞,自立,*,*,五段・ラ行,基本形,作る,ツクル,ツクル
EOS
```

# 備忘録　自力でインストールしてた時に出てきたエラー
libmecab.so.2がないよ、と言われた場合の対処法。

```
ImportError: libmecab.so.2: cannot open shared object file: No such file or directory
```

対処法

```
$ vi /etc/ld.so.conf.d/lib.conf
/usr/local/lib  #<-- 新規記入、もしくは追記する。

$ ldconfig #<-- 再度読み込ませる
```

参考：Mecab Pythonを使ったTF・IDFによるWikipediaの重要単語抽出
http://yut.hatenablog.com/entry/20130215/1360884220

参考：Python3で形態素解析エンジンMeCabを使えるようにする(2016年3月版)
http://qiita.com/grachro/items/4fbc9bf8174c5abb7bdd#_reference-f17313e8bc66cbbff3ef
Oracleのalert.logを、少し見やすく整形するワンライナー



## 内容

Oracleのalert.logが、以下のようなフォーマットになっており、日時が分かりにくい。

```
<日時1>
<  …情報1…  >
<  …情報2…  >
<  …情報3…  >
<日時2>
<  …情報4…  >
<日時3>
<  …情報5…  >
<  …情報6…  >
```

分かりやすくするため、以下のフォーマットに整形するコマンドを作成する。

```
<日時1> <  …情報1…  >
<日時1> <  …情報2…  >
<日時1> <  …情報3…  >
<日時2> <  …情報4…  >
<日時3> <  …情報5…  >
<日時3> <  …情報6…  >
```


## コマンド

```bash:
awk 'begin{t="--fail--"}; {if (match($0, /^... ... .. ..:..:.. ....$/)){t=$0} else {printf("%s | %s\n",t,$0)}}' [アラートログファイル名]
```

## 動作確認

環境
- OS:Red Hat Enterprise Linux Server release 7.2 (Maipo)
- Oracle:Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

動作確認
インスタンス名をTESTとし、アラートログファイル名をalert_TEST.logとする。

▼ 変換前のalert_TEST.logの内容

```
Sat Sep 03 15:31:58 2016
alter pluggable database all open
Sat Sep 03 15:32:27 2016
Database Characterset for PDB1 is AL32UTF8
Sat Sep 03 15:32:27 2016
Database Characterset for PDB2 is AL32UTF8
Opening pdb PDB2 (4) with no Resource Manager plan active
Pluggable database PDB2 opened read write
Sat Sep 03 15:32:36 2016
Opening pdb PDB1 (3) with no Resource Manager plan active
Pluggable database PDB1 opened read write
Completed: alter pluggable database all open
```

▼ 実行

```bash:
awk 'begin{t=""}; {if (match($0, /^... ... .. ..:..:.. ....$/)){t=$0} else {printf("%s | %s\n",t,$0)}}' alert_TEST.log
```

▼ 結果

```
Sat Sep 03 15:31:58 2016 | alter pluggable database all open
Sat Sep 03 15:32:27 2016 | Database Characterset for PDB1 is AL32UTF8
Sat Sep 03 15:32:27 2016 | Database Characterset for PDB2 is AL32UTF8
Sat Sep 03 15:32:27 2016 | Opening pdb PDB2 (4) with no Resource Manager plan active
Sat Sep 03 15:32:27 2016 | Pluggable database PDB2 opened read write
Sat Sep 03 15:32:36 2016 | Opening pdb PDB1 (3) with no Resource Manager plan active
Sat Sep 03 15:32:36 2016 | Pluggable database PDB1 opened read write
Sat Sep 03 15:32:36 2016 | Completed: alter pluggable database all open
```

## その他

▼ tailで使用することも可能

```bash:
tail -f alert_TEST.log | awk 'begin{t="--"}; {if (match($0, /^... ... .. ..:..:.. ....$/)){t=$0} else {printf("%s | %s\n",t,$0)}}'
```

▼ grepなどでの情報取得時、日時が出るのでわかりやすい。

```bash:
awk 'begin{t="--"}; {if (match($0, /^... ... .. ..:..:.. ....$/)){t=$0} else {printf("%s | %s\n",t,$0)}}' alert_TEST.log | grep  -e 'Starting ORACLE instance' -e 'Instance shutdown complete'
```


以上
Javaのベンチマークツール、JMHをコマンドラインから実行するときのメモ

#これは何
JMHの測定クラスををeclipseやNetbeansなどのIDEからではなく、コマンドラインで実行するときの覚書。

# 前提
測定クラスにmain()メソッドが書かれていること

```java
package jmhTest;

import java.util.concurrent.TimeUnit;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.AverageTime)
public class MyBenchmark {
	
	private static int count = 300000;
	private final static String reg = "\\d+";

	private static String testWord = "1234567";
	
    @Benchmark
    public void test1CharacterisDigit() {
    	for(int i = 0; i < count; i++) {
    		test1(testWord);
    	}
    }
    
    @Benchmark
    public void test2IntegerParseInt() {
    	for(int i = 0; i < count; i++) {
    		test2(testWord);
    	}
    }
    
    @Benchmark
    public void test3Reg() {
    	for(int i = 0; i < count; i++) {
    		test3(testWord);
    	}
    }

    private static boolean test1(String s) {

        boolean isDigit = true;

        for (int i = 0; i < s.length(); i++) {
            isDigit = Character.isDigit(s.charAt(i));
            if (!isDigit) {
                break;
            }
        }

        return isDigit;
    }
    
    private static boolean test2(String s) {

        boolean isDigit = true;

        try {
            Integer.parseInt(s);
        } catch (Exception e) {
            isDigit = false;
        }

        return isDigit;

    }

    private static boolean test3(String s) {

        return s.matches(reg);

    }
    
    public static void main(String... args) throws RunnerException {

        Options opt = new OptionsBuilder().include(MyBenchmark.class.getSimpleName()).warmupIterations(5)
                .measurementIterations(5).forks(2).build();

        if(args.length > 0) {
        	count = Integer.parseInt(args[0]);
        }
        
        if(args.length > 1) {
        	testWord = args[1];
        }
        
        System.out.println("テスト設定 繰り返し数：" + count);
        System.out.println("テスト設定 判定ワード：" + testWord);
        
        new Runner(opt).run();
    }
    
}

```

# 手順
## プロジェクトのフォルダに移動して以下のコマンドを実行する。

- jarファイルを作る。

```
maven clean install
```

- テストしたいクラスを指定して実行

```
java -classpath target/benchmarks.jar jmhTest.MyBenchmark
```

繰り返し回数や、テストキーワードを引数で指定したい、というような場合もこれなら指定可能。
java -jar コマンドだと、メインクラス（org.openjdk.jmh.Main）がデフォルトで指定されているのでウォーミングアップ回数などもデフォルト値が指定されてしまう。

# 参考
[Javaのベンチマークツール、JMHの導入](http://qiita.com/deaf_tadashi/items/8bb4a76f3116ef195296)
[Javaのベンチマークツール、JMHにテストコードを書いて計測してみる](http://qiita.com/deaf_tadashi/items/19ed0529b5c8e1937f4f)
MySQLで5分毎、10分毎の集計


### 5分ごと

```mysql
select from_unixtime(round(unix_timestamp(created_at) div (5 * 60)) * (5 * 60)) as timekey from waitings group by timekey;
```

### 10分ごと
```mysql
select from_unixtime(round(unix_timestamp(created_at) div (10 * 60)) * (10 * 60)) as timekey from table group by timekey;
```
Railsの勉強本でWEBsiteを作成中です（create:01）

　
どうも生意気ペーペーエンジニア
fuzin_raizinです。


#プログラミングは何と言っても実戦形式！！

初心者にとってプログラミングの論理本程、読むのが
大変なものはありません。
codeの勉強などを色々2年くらいやってきましたが
私の性格上のこともありますが、とにかく

何かしらの目標を立てて
###**「　実践あるのみ！ 」**
　
でございます。

　
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/136585/5c9bcc46-6a0f-d5a6-2728-37acefd8751e.jpeg)

『改訂3版 基礎Ruby on Rails』
(インプレスジャパン)
https://www.oiax.jp/

今回勉強に利用させてもらったのはコチラのbookです。


#code本でよくある躓いた時の対処方法が記載されていない
これは単なるわがままなのですが、
割とどの本にも共通して言えることが

###**「エラー発生時の対処法が書いてない」**

初心者は特にスペルミスなど玄人エンジニアさんから見ると
「脳みそがあるのか？」
というような思いをいだくミスをしがちです。
対処の方法が一つではなく原因も一つではないので何とも言えないですが
何か記載があると嬉しいです。

なればこそのQiitaであったりもするのですが…

　
　

![heroiku.png](https://qiita-image-store.s3.amazonaws.com/0/136585/eec4a302-3cd7-188d-0508-a71663909671.png)
https://www.heroku.com/

現在自身のサイトをRailsにて製作中で
完成しましたらこちらの
Rails利用者おなじみのこちらのサイトにUPの予定です。

それではまた~
BUFFALO 無線ルータで自宅・外出先間に PPTP で VPN を張ろうとした話

# まえがき
この記事は某フリマアプリで VPN が出来ると謳っている BUFFALO 無線ルータ(WZR-HP-G302H) を安く手に入れたので自宅と外出先にVPNを張ろうと奮闘した話です。
また、フレッツ光プレミアムというもうかなり古くなった回線形態を使っているため、特殊な作業が含まれています。
その他の回線形態の場合、おそらくこのような作業は必要ないので、別のページをご覧ください。

奮闘し、記事に書いていますが、結果的にはまだ満足の行く状態で VPN 接続はできていません。（2016/09/03 現在）
また、メモ書き程度のため、詳しいことは 参考サイト様 のリンク先をご確認ください

# 環境
- ルータ : BUFFALO WZR-HP-G302H（※以下 ルータ）
- 通信回線 : フレッツ光プレミアム (CTU NTT加入者網終端装置)
- MyDNS
- DiCE (グローバルIPの変更を検知し、MyDNSに自動で登録し直してくれる Windows ソフト)
- VPNプロトコル : PPTP
- テスト環境 
    - ノートPC (Ubuntu 14.04 LTS)
    - iPhone6 (docomo)

# 準備するもの
- プロバイダから送られてきた接続IDや接続パスワードなどと書かれている書類（PPPoEの時に必要）
- CTU とルータをつなぐために新しく LAN ケーブル 1本

# 苦労点
+ フレッツ光プレミアムを利用しているため、CTU というルータ機能を持ったものの下に新たに BUFFALOルータをぶら下げる必要があったため、CTUの設定・ルータの設定ともに設定が必要だった点
+ テスト環境の問題により、ノートPCからVPNの接続テストができなかった点

# 手順
1. CTUとPCを直接LANケーブルで接続
2. CTUの設定でプロバイダへの接続を切る
2. CTUのPPPoE 機能を有効にし、接続可能数を 5つぐらいに設定しておく
3. CTUの設定を反映させたあとぶっこ抜いて、ルータとPCを直接LANケーブルで接続
4. ルータの振り出しIPアドレス（LAN側IP）の第3オクテッドを CTUと違う値にしておく
5. ルータのDHCPを有効にする
6. CTUのLAN側ポートとルータのWAN側ポートをLANケーブルでつなぐ（PCとルータの接続はそのまま）
7. ルータでPPPoEの設定（プロバイダからの書類に書いている接続ID・PWを使う）をする
8. 「PPTP機能を利用する」にチェックし、設定ボタンを押す
9. 「PPTPユーザの編集」から、PPTPで接続するときに利用するアカウントを登録する

**ここまでやることで VPN の設定に グローバルアドレス（ルータの設定 > システム(Internet欄内のIPアドレス)）を直打ちすれば、VPN接続することができます。**

しかし、グローバルIPを固定しているならまだしも、固定せずに運用している場合、プロバイダから与えられるIPアドレスが定期的に変わってしまいます。
そのたびにIPを調べて、設定に書き込み直すのは現実的ではないので、**MyDNS(DDNSと呼ばれるもの)**を利用します。

## MyDNS と DiCE の利用
1. MyDNS に自分のアカウントを作成する
2. ログイン後、DOMAIN INFO から自分だけのドメインを作成する
3. IP ADDR DIRECT で現在のグローバルIPアドレスを登録する
4. よく使用するWindows機に DiCEをダウンロード・インストール
5. DiCEを開き、メニューバーの「イベント > 追加」で更新するイベントを登録
6. 登録されたイベントを実行することで自機のグローバルIPを自動でMyDNSに登録してくれるようになり、更新の手間が省けます。

ここまでで 作ったドメインから VPN 接続ができ、そのドメインに登録したIPの更新も簡単に出来るようになりました。

作ったドメインをVPNの設定に登録し、実行してみるとVPN接続ができ、ルータの設定画面に接続することもできるかと思います。
お疲れ様でした。

# 注意（自分がハマったところ）
- 自宅LAN内（自宅のネットワーク内）からだとVPN接続はできない。
- iPhoneをLTEでネットにつなげ、そこからのVPNはできる。しかし、ノートPCをiPhoneにつないで、テザリングを使ってVPN接続しようとしても、docomoの仕様で、PPTPサーバとのVPNはテザリングでは使えないことになっている。

↑の仕様のため、まだ外部のWiFi等からPCでのVPN接続を試せていません。
試せたらまた書きます…

# 参考サイト様
手順1~8 (CTUとルータの設定部分)　
http://shikakumaniatoistds.blog57.fc2.com/blog-entry-240.html
http://shikakumaniatoistds.blog57.fc2.com/blog-entry-266.html
手順9, 10 (PPTPサーバの設定)
http://blog.livedoor.jp/raccoon_whiteform/archives/51664134.html
MyDNS 登録手順 1~3
http://viral-community.com/other-it/ddns-mydns-2060/
DiCE 設定手順
http://viral-community.com/other-it/ddns-dice-2101/
【JSF】標準バリデータについて


前回に引き続き今回はバリデータの備忘録

## 標準バリデータ

|バリデータタグ| 制約| 属性
|:---|:---|:--:|
| f:validateDoubleRange| double,floatの値について範囲を指定する| minimum,maximum
| f:validateLongRange| longなど整数値について範囲を指定する| minimum,maximum
| f:validateLength| Stringについて長さを指定する| minimum,maximum
| f:validateRegex| Stringについて正規表現で形式を指定する| pattern
| f:validateRequired| 値が入力されていることを強制する| 
| f:validator| カスタムバリデータの使用時に指定する| 
| f:validateBean| beanバリデーションについての指定を行う|validationGroups

##バリデータの使い方

 
### 長さを設定する例

```
<h:inputText id="num" value="#{bean.num}">
 	<f:validateLength maximum="5" minimum="1" />
</h:inputText>
<h:message for="num" />
``` 

### 最大値、最小値を設定する例
 
```
<h:inputText id="num" value="#{bean.num}">
	<f:validateLongRange maximum="100" minimum="10"/>
</h:inputText>
<h:message for="num" />
``` 

###  入力を必須とする例
 
```
<h:inputText id="num" value="#{bean.num}">
	<f:validateRequired/>
</h:inputText>
<h:message for="num" />
```

### 123-45のようなパターンの例
 
```
<h:inputText id="code" value="#{bean.code}">
	<f:validateRegex pattern="[1-9]¥d{2}-¥d{2}"/>
</h:inputText>
<h:message for="code" />
```
直線位置調整 + 距離計 > code v0.6


## 構成

- S-12駆動基板 (ESP8266実装)
  - http://qiita.com/7of9/items/93257105e64bb4724fa7 の基板に以下を追加
  - 3.3Vから5V昇圧回路実装
  - Daughter board用コネクタ実装
- GP2Y0A710K > Daughter board
  - http://qiita.com/7of9/items/f556cfc9b2a917c2abdb
- udpLogger
  - http://qiita.com/7of9/items/fe7dcdc846cd3b178632
  - UDP経由で上記基板の測定(電圧)を受信し、microSDに保存

## code v0.6

ESP8266のコード。

[v0.6 @ github](https://github.com/yasokada/esp8266_160811_s12position/releases/tag/v0.6)

主な機能

- インターバルでS-12をドライブ
- GP2Y0A710Kの電圧を測定
- 電圧をudpLoggerへ送信

## 測定

microSDに保存されるデータは以下の項目となる。

- インデックス
  - 測定の度にカウントアップされる
  - 移動距離に変換を検討 (誤差が問題)
- GP2Y0A710K の電圧
  - 抵抗分圧で1V以下にしている


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/208ea3f2-a641-437c-f427-ea726697f9b2.png)

移動が途中までなので、短距離で見られるはずの電圧上昇まで見えていない。

レール(R-01)が足りなそうなので追加購入が必要。

測定は、何回か測定してからの平均を取る方がいいかもしれない。

## 測定2

壁からレール4本分の距離測定をしてみた。

1本が20cm程度なので、[データシート](http://akizukidenshi.com/download/ds/sharp/GP2Y0A710K0F.pdf)page5の図の左側(80cm未満)の図を表す。

横軸はインデックスで、インデックスが大きいほど距離が短い。データシートの図と左右反転を考える。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e14f4643-ba46-a192-3268-88c036ce8075.png)

購入してきたレールを足して、もう少し遠距離からの測定にしてみる。

なお、この測定は20分程度かかったが、その間は別のことをしていたのを付記しておく。自分が目指していたことが少し実現した。


## 暴走 x 2

測定を繰り返していたが、ある時点でDCモーターの電源が入っりっぱなしになることがあった (そして壁に激突した)。

MOSFETのソースとドレイン間の導通が解消しない状況が何かの理由で発生したようだ。

- ESP8266のリセット
- MOSFET自体の何か

MOSFET使用回路にプルダウン抵抗を入れていないのは問題かもしれない。

### 連続試験 160903

(追記 2016/09/04)

暴走が気になる。

以下の条件で試験しなおした。

- S-12のタイヤを空に浮かせた
- GP2Y0A710K > Daughter board 未接続
- udpLogger電源断
  - WiFi通信がなくなる

100分間暴走なく動作した。
2回の暴走時はそれぞれ25分、12分程度で暴走していた。100分動作の試験1回で問題がないとはまだ判断できない。

試験終了時の電池電圧

- CR123A: 2.88V
- LR6: 1.58V

暴走時の状態に徐々に戻しつつ、再現条件を見つけることになる。
3回ずる試験をして暴走がないことを確認して、次の試験に移ることになりそう。

### 連続試験 160905
(追記 2016/09/06) 160903と同じ試験をした。100分の動作で暴走はなかった。

### 連続試験 160908
(追記 2016/09/09)

160903と比べてudpLoggerとの通信を追加した。100分の動作で暴走はなかった。

### 連続試験 160909
(追記 2016/09/10)

- レール上にて動作
- GP2Y0A710K > Daughter board 未接続
- udpLogger電源断

上記の状態にて動作させた。100分の動作で暴走はなかった。

### 連続試験 160910
(追記 2016/09/10)

- レール上にて動作
- GP2Y0A710K > Daughter board 接続
- udpLogger電源断

上記の状態にて動作させた。試験を開始しようとした途端、暴走が起きた。
udpLoggerとの通信に無関係で起きているようだ。
python3の四捨五入でハマったのでメモ

## python2の四捨五入

四捨五入にはround()を使います。

```
>>> round(1.5)
2.0
>>> round(2.5)
3.0
>>> round(10.0/3, 0)
3.0
```

一般的な四捨五入ですね。

## python3の四捨五入

```
>>> round(1.5)
2
>>> round(2.5)
2
>>> round(10.0/3, 0)
3.0
```
結果が異なる。


## なにこれ

以下、Wikipedia先生より

[端数処理](https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86#.EF.BC.88.E5.BA.83.E7.BE.A9.E3.81.AE.EF.BC.89.E6.9C.80.E8.BF.91.E6.8E.A5.E4.B8.B8.E3.82.81)

>
最近接偶数への丸め[編集]
最近接偶数への丸め (round to the nearest even; RN) は、端数が0.5より小さいなら切り捨て、端数が0.5より大きいならは切り上げ、端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める。JIS Z 8401で規則Aとして定められていて、規則B（四捨五入）より「望ましい」とされている。
四捨五入ではバイアスが発生する、端数0.5のデータが有限割合で存在する場合でも、バイアスがないのが特徴であり、多数足し合わせても丸め誤差が特定の側に偏って累積することがない（偶数+0.5は現れるが奇数+0.5は現れない、といったような特徴があるデータであれば、やはりバイアスはあらわれる）。

とのこと。

## 解決策

python3のroundをpython2と同様にするための、my_round関数を作ります。
```
import math
def my_round(x, d=0):
    p = 10 ** d
    return float(math.floor((x * p) + math.copysign(0.5, x)))/p
```

こんな感じになるらしい。

(09/03/2016 追記　shiracamusさんありがとうございます)
lambdaを使えばもっと簡単になる。

>>> round=lambda x:(x*2+1)//2
>>> round(1.5)
2.0
>>> round(2.5)
3.0
>>> round(10.0/3.0)
3.0
cocos newでエラった時の対処法


cocosをgitでcloneしてsetup.pyを実行した後に、
以下のようなエラーが出た

```
$ cocos new -l lua
> Copy template into /Users/tanishi/projects/MyLuaGame
> Replace the project name from 'HelloLua' to 'MyLuaGame'
> Copying directory from cocos root directory...
[Errno 2] No such file or directory: '/Users/tanishi/projects/cocos2d-x/external/win32-specific/gles/prebuilt'
```

んで、git logでexternalの中身を確認してみたけど、
どうもconfig.jsonしか変更されていない

とりあえずsubmodule化してるかもしれないから

```
git submodule init
git submodule update
```

で更新

...
変わんない...

んでREADME.mdを確認してみるとやり方が
そのまま書いていた

Git user attention
-----------------------

1. Clone the repo from GitHub.

         $ git clone https://github.com/cocos2d/cocos2d-x.git

2. After cloning the repo, please execute `download-deps.py` to download and install dependencies.

         $ cd cocos2d-x
         cocos2d-x $ python download-deps.py

3. After running `download-deps.py`.

         cocos2d-x $ git submodule update --init

-----------------------  

ということで解決

説明書はちゃんと読もう
CSSで要素の幅や高さを指定する際の単位についてメモ


##使われる単位の種別

###絶対単位
|単位|意味|詳細|
|:--:|:--|:--|
|cm|センチメートル|1cm == 10mm|
|mm|ミリメートル|10mm == 1cm|
|in|インチ|1in == 2.54cm|
|pt|ポイント|1pt == 1/72in == 0.3528mm|
|pc|パイカ|1pc == 12pt|

####説明：
絶対単位に分類されるものは実寸値に基づいているため、表示する要素が同じサイズでも環境によって
「大きくて見づらい」「小さくて見えない」などの事象が発生しやすいため、可変的なレイアウト実現の観点からもあまり使われない。
###相対単位
|単位|意味|詳細|
|:--:|:--|:--|
|em|ems|親要素の文字のサイズに対して相対|
|ex|x-height|デフォルトサイズの文字"x"の高さに対して相対|
|px|ピクセル|画面解像度に対して相対|
|rem|「room」+「ems」|ルート要素　(html)　の文字のサイズに対して相対|
|vw|viewport width|ビューポート(ブラウザの表示領域)の幅に対して相対|
|vh|viewport height|ビューポート(ブラウザの表示領域)の高さに対して相対|
|vmin|viewport min|ビューポート(ブラウザの表示領域)の最小値の1/100|
|vmax|viewport max|ビューポート(ブラウザの表示領域)の最大値の1/100|
####説明：
相対単位は絶対単位と異なり、ディスプレイの解像度、表示域のサイズに依存することのない可変的なレイアウトを実現することができる。
よってユーザ視点では相対単位を使った実装の方が良い。

###パーセンテージ
|単位|読み方|詳細|
|:--:|:--|:--|
|%|パーセンテージ|パーセンテージによる割合(基準になる値は各プロパティによって異なる)|

###最後に
相対単位の「rem」「vw」「vh」などのワードをよく耳にしたが、
「何を基準にして相対なのか？」など理解していなかった部分が多かったので今回記事を書くにあたって理解できてよかった。 
厳密に言うと単位ではないが、要素に対して指定できる`keyword`やその詳細なども今後記事としてまとめていこうと思う。
GEOの発現データを使いこなす


    この記事は、http://d.hatena.ne.jp/fukuit/20151031/1446295539 からの転載です。

<a href="http://www.ncbi.nlm.nih.gov/geo/">GEO</a>のデータを使って、特定の条件での特定遺伝子の発現量を求める方法を何人かに聞かれたので、需要があるのかな？と思って、書いておく。

# DataSetsを使いこなす
DataSetsとは、NCBIによってcurationされたGEOデータのことだそうだ。
http://www.ncbi.nlm.nih.gov/geo/ を開いたら、まずはDataSetsのところをクリックする。
![20151031213030.png](https://qiita-image-store.s3.amazonaws.com/0/15553/b4208e12-4a02-d54c-7a29-97b0d802e89f.png)

すると、登録されているDataSetsの一覧画面になる。ここで、自分の欲しい条件で検索する。

とりあえず、Triple Negative Breast Cancerで検索してみたら、2件ヒットした。

このうちの<a href="http://www.ncbi.nlm.nih.gov/sites/GDSbrowser?acc=GDS4069">GDS4069</a>の方を見ることにして、Data Analysis Toolsというところをクリックする。
![20151031213459.png](https://qiita-image-store.s3.amazonaws.com/0/15553/53da668f-5ce5-77ab-fda2-6e2d287b9803.png)

ここで遺伝子の発現量を検索できるので、試しにESR1を検索してみる。

![20151031213827.png](https://qiita-image-store.s3.amazonaws.com/0/15553/f893a5b3-5c36-d683-e5c6-671c104143fc.png)

2件ヒットしたようだ。

1件目の方の、チャートの絵のところをクリックする。
![20151031214058.png](https://qiita-image-store.s3.amazonaws.com/0/15553/f4fc676b-b50b-2bad-4a68-f1570ba3f8e9.png)

すると、triple negativeではほとんど発現していないが、non-triple negativeの一部では高発現でした、ということが分かった。

![20151031214059.png](https://qiita-image-store.s3.amazonaws.com/0/15553/82ddcb4a-3c5b-7adb-55e7-4b6b1d51b3bb.png)

実に簡単だ。簡単すぎる。もし、自分が考えている実験条件に近いものがDataSetsとして登録されていたら、実験をする必要はないかもしれない。事前検討を減らせるかもしれない。

という具合に、研究室で「ちょっとPCに詳しい人」程度のBioInformaticianは失業の危機である。
vimでjsファイルのimport先のファイルを簡単に開く

#概要
vimに`gf`というカーソル配下に書かれているファイルを開くコマンドがあります。
include先を開いたりする際に便利なのですが、ES6の場合、import文で書くファイルパスは.jsが省略されているため、実際のパスと一致しないため開けません。
また、index.jsの場合はindex.js自体が省略されるため、ディレクトリが開かれてしまいます。
そこでfiletypeがjavascriptの場合は、カーソル配下にパスの記述がある場合、Ctrl+Gでimport先のファイルをsplitで開くスクリプトを書きました。下記コードを.vimrc等に貼り付けると使えるようになります。

#コード

```vim
function! ReadJSFile() abort
  let s:currentPos = col('.')
  let s:colNum = s:currentPos - 1
  let s:lastPos = len(getline('.'))
  let s:fileName = ''

  while s:colNum > -1
    if getline('.')[s:colNum] =~ "\['\"\]"
      break
    end
    let s:fileName =  getline('.')[s:colNum] . s:fileName
    let s:colNum = s:colNum - 1
  endwhile
  while s:currentPos < s:lastPos
    if getline('.')[s:currentPos] =~ "\['\"\]"
      break
    end
    let s:fileName =  s:fileName . getline('.')[s:currentPos]
    let s:currentPos = s:currentPos + 1
  endwhile
  let s:fullName = simplify(expand("%:h") . '/' . s:fileName)
  if !filereadable(s:fullName)
    if isdirectory(s:fullName)
      let s:fullName = s:fullName . '/index.js'
    else
      let s:fullName = s:fullName . '.js'
    endif
  endif
  execute ':sp ' . s:fullName
endfunction
autocmd FileType javascript nmap <C-g>  :call ReadJSFile()<CR>
```

splitではなくてvsplitを使っている方やいま開いているファイルの代わりに開いてほしい方は`execute ':sp '`の箇所を`execute ':vs '`や`execute ':e '`にすることで望んでいる動作に変更できます。
Ctrl+Gが嫌な人は`<C-g>`の箇所を別のキーに書き換えてください。
master にマージ済みのローカルブランチを一括削除する

# TL; DR

```bash
git fetch upstream
git branch --merged upstream/master | egrep -v '^\*' | perl -pe's//git branch -D/' | bash
```

upstream にマージされたブランチ一覧がこれで消えます。

# 前提とか

1. GitHub に PR 出した
2. 誰かがマージしてくれた。 (happy)
3. リモートブランチを消した(Pattern A)、あるいは消し忘れた (Pattern B)

# Pattern-A リモートブランチを消した場合 （よくあるパターン)

以下で一括削除できます

```bash
git fetch --prune

# リモートをフェッチして、リモートブランチがセットされているのに、そのブランチが削除されたブランチを消す
```

# Pattern-B リモートブランチを消し忘れた場合

以下のコマンドで、upstream/master にマージ済みのブランチ一覧が取得できます

```bash
$ git branch --merged upstream/master
* master
  hotfix_A
  feature-X
  BTS-1234
```

厳密には、upstream/master の祖先になっているブランチの一覧です。
あとはなんでもお好みのツールで。

```bash
git branch --merged upstream/master | # upstream/master マージ済みブランチ取得
    egrep -v '^\*'                  | # 先頭が * で始まるのは、checkout 中のブランチなので省く
    perl -pe's//git branch -D/'     | # 各行の先頭に "git branch -D" 挿入
    bash                              # bash の標準入力に入れてシェル実行する（-c でも、`` で括っても OK）
```

1行で再掲

```bash
$ git branch --merged upstream/master | egrep -v '^\*' | perl -pe's//git branch -D/' | bash
```
距離計 > GP2Y0A710K > Daughter board > 0-1V変換

シャープ測距モジュール　ＧＰ２Ｙ０Ａ７１０Ｋ 
[GP2Y0A710K]
http://akizukidenshi.com/catalog/g/gI-03157/

5V駆動で赤外線にて距離を測るモジュール。

ESP8266 + 5V電源のシステムに接続するためのDaughter boardを作成した。

## 回路図

https://upverter.com/7of9/09d25c82999599f7/160903_Daughter_GP2Y0A710K/

## 写真

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/f2bb367f-6132-a5a1-258b-51f248713d06.jpeg)

### 上面から

一番下のピン
  
- 左から1つ目がPIN1 (GND)
- 2つ目はPIN2 (TOUT)
- 9つ目はPIN9 (VCC5V)

右上のコネクタはGP2Y0A710Kのコネクタ。
http://akizukidenshi.com/img/goods/3/I-03157.JPG
の赤が左に来るように接続する。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/3e1f4030-0621-1a70-742a-9fe8019a952f.jpeg)

### 背面から

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/ada096a8-af36-8d77-d7b1-4b8fcdaef835.jpeg)


## 動作試験

Analog Discovery 2(以下AD2)で動作試験した。

AD2は以下の機能を使用。

- 5V出力
  - VCC5Vとして使用
- スコープ1
  - TOUT電圧を測定

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/1d53a1f5-6c16-3d1c-1070-1bb6d632a8ae.jpeg)

色々な距離に対して電圧は1V以下になっていることを確認した。
ノイズが乗っているのは気にはなる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e6251ba9-1382-acb4-631f-ce4b1d9488c5.png)


これでESP8266基板と接続準備ができた。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/9a57ea9c-a31e-ac73-5483-c73ff2eada19.jpeg)