OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu や Alpine Linux をワンコマンドで瞬時に立ち上げる

## `alpine` コマンド、`centos` コマンド、`ubuntu` コマンド
Docker 環境を用意して以下のエイリアスを `.bashrc` なり `.zshrc` に書いておくと、ワンコマンドで Linux の対話環境が立ち上がって便利

```bash
alias alpine='docker run -it --rm alpine:3.3 /bin/sh'
alias centos='docker run -it --rm centos:7 /bin/bash'
alias ubuntu='docker run -it --rm ubuntu:14.04 /bin/bash'
```

```
$ alpine
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
v3.3.3-20-gb700737 [http://dl-cdn.alpinelinux.org/alpine/v3.3/main]
v3.3.3-9-gfc38db2 [http://dl-cdn.alpinelinux.org/alpine/v3.3/community]
OK: 5858 distinct packages available
```

```
$ centos
[root@dfaaba07c44b /]# yum update
Loaded plugins: fastestmirror, ovl
base                               | 3.6 kB  00:00:00
extras                             | 3.4 kB  00:00:00
update                             | 3.4 kB  00:00:00
(1/4): base/7/x86_64/group_gz      | 155 kB  00:00:00
(2/4): extras/7/x86_64/primary_db  | 117 kB  00:00:00
(3/4): base/7/x86_64/primary_db    | 5.3 MB  00:00:00
(4/4): updates/7/x86_64/primary_db | 4.1 MB  00:00:01
...
```

```
$ ubuntu
root@359432babe0d:/# apt-get update
Ign http://archive.ubuntu.com trusty InRelease
Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
Get:2 http://archive.ubuntu.com trusty-security InRelease [65.9 kB]
Hit http://archive.ubuntu.com trusty Release.gpg
Hit http://archive.ubuntu.com trusty Release
...
```

素の Ubuntu だと何も入ってないので、立ち上げてすぐ各種ツール (`curl`, `wget`, `git`, `make`...) も使えるようにしたいのであれば buildpack-deps イメージを使うようにすればよいです。

```bash
alias ubuntu='docker run -it --rm buildpack-deps:trusty /bin/bash'
```

## どういうときに便利か
Alpine とか Ubuntu ベースの Dockerfile を書くとき、`apk add` や `apt-get install` に何を書けばいいか迷う時があります。そういう時は `apk search` や `apt-cache search` でパッケージを探すことになります。
ここで Vagrant で Ubuntu VM 立てて…とやると時間かかるしリソースも食いますが、Docker コンテナであれば瞬時に Ubuntu の対話環境が起動しすぐに確認できます。

また、ホスト OS とは隔離されたシェルを用意できるので、環境変数を汚して実験したいようなときに重宝します。
Redmine導入してみて。

一つでも、導入事例があればと思って。

# 導入のきっかけ。
Excelが嫌いだから。
検索もできないし、フィルタリングも面倒。全員で閲覧もできないし、いつまでこの会社は課題管理をExcelでやるんでしょうか。本当にめんどい。

あと、お客さんに現状の課題数を把握してほしいのもあった。
思いついた要望をガンガン言われて、こっちでExcelに書いて、言った言わないの論争。
現状の課題リストですって件のExcelを提出しても、次々追記されてどれが最新かわかりづらい。

それより一番のモチベーションは、使ってみたかったから、使ってみる。ですね。
以前もほかのITSを社内で提案してみたけど、うまくいかなかったんですよねー。

# 導入方法。
bitnami様さま。
https://bitnami.com/stack/redmine

うちは基本的にWindowsでの開発なので、すぱーんとインストーラ起動で導入できるのは非常に楽ちんです。

## 稼働環境
最初は開発環境に入れていたのですが、それでは自分が客先にいるときしか、お客さんが見れません。今回の目標は課題の共有。お客さんに上司にも「これだけやるべきことがあるってことを知って欲しい」ということなので、公開環境に置きたい。
都合よく、お客さん側で今回のプロジェクトのために用意した公開用のWebサーバがあったので、そこへインストール。IISのリライト機能とか使って、bitnamiの用意したWebサーバを外から参照できるようにしました。SVNも同様に動いてます。
このおかげで、上記の誰もが見れる環境を作れました。

# 運用方法
自分も相手もITSをまともに運用したことないため、手さぐりでスタート。
**まずはチケット機能だけを使えるようにすること**から開始。
いろいろな導入記事を見たけど、やっぱり最小構成からの開始が一番いいのかもしれません。
直接やりとりする担当者と、自分の二人からスタート。
チケットを起こして、終了する。最初はこの動きだけでした。

## step 1 みんなに使ってもらうために。
お客さん側のレクチャーは全部担当者にお願いしました。
だんだん、お客さんの他のメンバーが直接書き込むことが増えてきました。
とはいえ、これはこれでチケットが乱立することになるので考えどころですが…

## step 2 ステータスを変更する。
初期のステータスでは、新規、進行中、解決、フィードバック、終了です。
ここで、修正・開発完了したときに「解決」を選択していたのですが、どうも終了と同意義としてとらえられてしまいました。
そこで、「解決」を「確認待ち」とすることで、まだ完了ではないことが示せるようになりました。単純な単語の変更ですが、意外と効果がありました。

## step 3 担当者の意味がやっと分かる。
もっと早くほかの導入記事を読んでいたらよかったんですが、導入時は「担当者」を「この課題を管理すべき人」ととらえていました。プログラムの修正は自分、仕様のとりまとめはお客さんの担当者といった感じでした。
でも**このチケットを今、対応をすべき人**を示さないといけないのですね。
先ほどの「確認待ち」とすると同時に、チケット作成者または問題提示者へ担当をかえて、検収をしてもらうようにしています。それでOKだったら終了にしてもらう。
基本の基本なのに、半年くらい意味を取り違えてました。
そりゃきれいに回らないね。

## step 4 バージョンを使ってみる。
step 1　で書いたように、そりゃチケットが乱立しますよ。どこから手を付けるべきかわからない。それを解消するためにバージョン機能を導入し、お客さんの担当者にも話をしました。
現状は正しい使い方ではないかもしれませんが、優先すべきチケットの絞り込み機能として使っています。もう、僕はこのバージョンのチケットしか見ないし対応しません！追加してほしければ担当者を説得してくださいねっと。
※とはいえ、軽微な修正をサクサクやって、対応速度のアピールをしたりしてます。

# まとめ　
お客さん側と、同じ課題リストが見えるようになったので、とてもやり取りがスムーズになっています。今ではお客さんの担当者よりその周囲の人のほうがちゃんとみて、確認待ちを解消していってくれます。（担当者の業務の負担が大きいのもありそうですが）。

あと、確認待ちが増えてくると「自分は対処したが、受け入れをしてもらえない、お客さんの対応に問題があるのでは」と責任転換ができます。いや、これはちゃんと自分から「確認してくださいね」「どうでした？正しく実装できていますか？」と確認すべきことかもしれませんがね。

他の記事で読んだんですが、チケット駆動は、「自分に割り当てられたチケットを消していくゲーム」って一言はとても的を得ているとおもいます。

問題はうちの上司はまったく使う気が無いことです。何回チケットの内容をExcelに転記させられたことか！！
どんな状況だっていわれたら、「ロードマップ見てください」って言ってるのに一度もみてないんじゃね？？ってところです。
うちの上司には期待してないからどうでもいいっスわ。

あとは、社内の別のプロジェクトでも使うようにプッシュしていますが、まったく浸透しないのが悩みです。概要を説明すると、いいねぇと言ってくれますが、なかなか使いこなしてもらえませんね…
Facebook F8で発表されたbots on Messengerの事例を見てみる（米EC『SPRING』）

先日のFacebook F8カンファレンスで発表された幾つかの機能のうち、最も目玉の機能は**bots on Messenger（正式名称）**であることに疑いようがない。

http://jp.techcrunch.com/2016/04/13/20160412facebook-releases-bot-engine-to-create-much-smarter-bots

F8の発表と同時にCNNや米EC『SPRING』が手掛けるbots on Messengerが公開された。特にECでの先行事例という点で『SPRING』の事例について詳しく見ていきたい。


### bots on Messengerの特徴

まず前提として、このFBが公開したbotsが注目されているポイントを整理すると以下の3つに集約される。

1. チャット（リアルタイム、双方向、カジュアルテキスト）UIでのカスタマーサポートが可能になる
2. AI（人工知能）の搭載が競合対比で最も容易、パーソナル・サポートに最も可能性がある
3. 世界最大のMessengerプラットフォーム（MAU9億人!!）で駆動する

1のチャットUIによるカスタマーサポートは全てのbotサービスに共通する項目かも知れないが、2と3は**bots on Messengerならではの強み**といえる。

### 『SPRING』のbots on Messenger

とりあえずSPRINGがbotsにどのようなアルゴリズムを搭載しているのか、実際に触って確認してみる。

#### overview

- チャットアプリに代表されるようなテキストメッセージングではなく、ユーザーへ幾つかの選択肢を提供し、商品へ誘導する**カテゴリ機能に近い**
- またbotとのコミュニケーションが途絶えた後、botがremindしてくる。これはMessengerのpush通知機能に乗っかって届くため、高いリテンションレートが期待できるのでは、と思う

#### 基本的なコミュニケーションフロー

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/9e5b6155-ba62-ef7e-eec1-1f568fdfef27.png)


- ユーザーが"go shopping"とbotに話しかけると、AIとのコミュニケーションが開始する
- botが以下の順で問を投げてくるので、選択肢をボタンでユーザーが選択する
    - 性別（女性/男性）
    - 大カテゴリ（服/靴/アクセサリ）
    - 小カテゴリ（かばん/サングラス/時計）
    - 価格帯（~$75/~$200/$200~）
-  問いに答え終わると、botが5つの商品を返してくれる。商品ごとに以下の選択肢が更に選べる
    - 購入する -> SPRINGのWebサイト/商品ページへ遷移する
    - 似ている商品を見る -> フィルタリング（協調?コンテンツ?）された別商品が新たに5つ提示される

#### その他

- ユーザーから「go shopping」以外のキーワードをユーザーに投げかけても、フローの誘導する一律メッセージしか表示しない。これではあまりに機械然としているので、間違いなく改良してくるだろう
![image](https://qiita-image-store.s3.amazonaws.com/0/83135/54066de1-93c9-4789-5e44-6f8f38b359be.png)
- コミュニケーションが途絶えていると、機械的にremindしてくれる
![image](https://qiita-image-store.s3.amazonaws.com/0/83135/320878cb-7082-d801-2ffb-edac12c0f85e.png)



### 発展性とまとめ

- 実際に使ってみての現時点のメリットは「サイトやアプリを切り替えることなく商品を探すことができる」という点に尽きる。これは手軽さや出会いを重視するセレンディピティ・コマースとの相性は非常に良さそうだ
- しかし毎回5つずつしか商品が探せないため、レコメンドの品質が大きなKPIになるだろうし、その点に発展性が多分にある
- またユーザーから一切テキストがbotへ対して発信できない、というのはbotである必要性を失ってしまうためインタラクションがテキストで行えるように増強されるだろう
- ECとしては新たにbotとのコミュニケーションログがパーソナライズの武器として手に入る。botとのコミュニケーションで意外な衝動買いを生み出せると、その背景にどんなメッセージングがあったのか解析することで『衝動買い』を科学することができる

ということで、自社でも弄ってみようと思います。
Dockerのdns round robinでバックエンドのコンテナを切り替える

# はじめに
先週の時点では、ngx_mrubyでバックエンドのコンテナを切り替えるという方法を取っていたのですが、
(参考: [ngx_mrubyとdockerでblue-green deployment](http://qiita.com/muk-ai/items/c9e540a89f916f4c8377))
なんと、docker networkのDNSにround robin機能が備わり~~その必要もなくなりました~~。←そうでもなかったです。
前佛さんの記事 ([Docker 1.11 リリース情報の要約](http://qiita.com/zembutsu/items/8ccef1dc409c44791e27)) で知りました。翻訳感謝m(__)m

# サンプルを動かす
DNS round robin機能を使うので docker >= 1.11, docker-compose >= 1.6 でお試し頂けます。

```
git clone https://github.com/muk-ai/rest-api.git
cd rest-api/
git checkout eb04f8e8e3e6dffe46842bddc656ba5dc6265fc8

docker-compose build
docker-compose up -d
```

この時点では、nginxのバックエンドにいる`falcon`というコンテナは`hello, world`というメッセージを返します。

```
$ for i in $(seq 20); do curl http://localhost/;echo; done
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
```

別のコンテナを起動させます。
このコンテナは`goodbye, world`というメッセージを返すものです。

```
cid=$(docker run -d mukai/rest-api:goodbye2)
```
こいつに`falcon`という、既に動いているコンテナと同じ名前を割り当てます。

```
docker network connect --alias falcon restapi_flat-network $cid
```
すると

```
for i in $(seq 20); do curl http://localhost/;echo; done
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}
```
ラウンドロビンされました！
元もと動いていた`hello, world`を返す方のコンテナを外します。

```
docker network disconnect restapi_flat-network restapi_falcon_1
(network aliasだけ削除したかったが方法がわからん)
```
おおー！

```
$ for i in $(seq 20); do curl http://localhost/;echo; done
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
```

# 追記
この方法だとダウンタイムが発生しますね。
Embedded DNSからレコードを削除できるようになれば。。
【ChatWork】googleformの回答内容をchatworkに自動通知する

**※画像多め**

設定する機会があったので、メモとして残すことにしました。

# １．必要なもの
- APIトークン (これがないと出来ません)

以下から利用申請が出来ます。(20分くらいで許可おります)
http://developer.chatwork.com/ja/index.html


# ２．フォーム & スプレッドシート作成作成

はじめに、googleフォームを作成していきます
![googleフォーム作成](https://qiita-image-store.s3.amazonaws.com/0/88756/bb0372dc-67a0-efa5-a948-6be46de0e999.png)

質問内容、回答形式は適当につくってください。
![googleフォーム作成](https://qiita-image-store.s3.amazonaws.com/0/88756/32ce63b0-2cf5-af8d-a958-e162035d2370.png)

「回答」というタブにスプレッドシートを作成するボタンがあるので、そこでスプレッドシートを作成してください。
![スプレッドシート作成](https://qiita-image-store.s3.amazonaws.com/0/88756/cc6fb7ca-b4e2-738b-605b-651917495ac7.png)

今回つくったスプレッドシートは以下のとおりです。
![スプレッドシート内容](https://qiita-image-store.s3.amazonaws.com/0/88756/4025e491-c943-e1a8-bde0-3863d24c1ebd.png)


# ３．Google Apps Script　作成

メニューボタンの「ツール > スクリプトエディタ」 でエディタを開きます。
![Google Apps Script　作成](https://qiita-image-store.s3.amazonaws.com/0/88756/687ffbed-7d9f-a7a4-6346-7a020564c659.png)

開いたエディタのメニューの「リソース > ライブラリ」を開きます。
 ![Google Apps Script　作成](https://qiita-image-store.s3.amazonaws.com/0/88756/7f7b21f1-d833-ac9c-6785-a2d3c461becc.png)

「ライブラリを検索」にプロジェクトキーを入力します。
>[参考]
ライブラリ名: ChatWorkClient for Google Apps Script
GitHub: https://github.com/cw-shibuya/chatwork-client-gas
プロジェクトキー: M6TcEyniCs1xb3sdXFF_FhI-MNonZQ_sT

![Google Apps Script　作成](https://qiita-image-store.s3.amazonaws.com/0/88756/78f043d2-afde-38e1-9034-89e71598d9a8.png)

さて実際にコードをかいていきます。
　　![Google Apps Script　作成](https://qiita-image-store.s3.amazonaws.com/0/88756/85a10172-b7ea-1967-b18d-fbd25413b45d.png)

ちなみにチャットワークのルームIDは #rid以下のの数字（図のモザイクの部分）
![chatoworkルームID](https://qiita-image-store.s3.amazonaws.com/0/88756/45b9e0e8-0588-5bfe-c2d4-9076e8b34f0b.png)


参考にコードのせます。

```js
function sendReport(e) {//functionてきとー
  var client = ChatWorkClient.factory({token: 'your_token'});

  // 変数名は自由に設定してください。今回はname,email,dateで設定しています  
  var name = e.namedValues['名前']; 
  var email = e.namedValues['メールアドレス'];
  var date = e.namedValues['日付'];
  
  var message = '';
  message =  "名前: "+name+"\n"; //見やすくするために改行いれます
  message += "メールアドレス: "+email+"\n";
  message += "日付: "+date;
  
  client.sendMessage({room_id: your_room_id ,body: message});
}
```

トリガーを設定します。「リソース > 現在のプロジェクトのトリガー」
時計マークのアイコンをクリックでも開けます。
![Google Apps Script　作成](https://qiita-image-store.s3.amazonaws.com/0/88756/ed58b5f8-2fab-8cfa-cf9a-f0fd804b0219.png)

以下のように設定し、保存します。
![Google Apps Script　作成](https://qiita-image-store.s3.amazonaws.com/0/88756/8f5ff4ef-34ea-9d97-edc1-f87c1d5e3439.png)

「続行」をおします。
![Google Apps Script　作成](https://qiita-image-store.s3.amazonaws.com/0/88756/26738326-af2f-3f4e-abce-6a0e185f2844.png)

「許可」をおします。
![Google Apps Script　作成](https://qiita-image-store.s3.amazonaws.com/0/88756/e498dc92-bc2e-2f48-18b8-00ba2600ef62.png)

これで設定は終了です。

# ４．動作確認
実際に動作確認してみます。質問に答えて、送信をおします。
![動作確認](https://qiita-image-store.s3.amazonaws.com/0/88756/a6ac55d6-604e-445b-44e9-9998573ff742.png)

スプレッドシートにデータが出力されました。
![動作確認](https://qiita-image-store.s3.amazonaws.com/0/88756/251d9dfc-291a-4887-68aa-b4d4221be57c.png)

同時にチャットワークにも通知がきました！
![動作確認](https://qiita-image-store.s3.amazonaws.com/0/88756/f9567255-04d5-4a3f-3973-2a80e7bad808.png)
Facebookみたいに改行に合わせて伸びるフォーム

ググったらなんか無駄に複雑にサンプル多かったんだけど、これでいいじゃんって感じで落ち着いた。

```js
var el = document.querySelector("textarea.your-text-area")
el.addEventListener("input", function(ev) {
  if (parseInt(el.rows, 10) < 8) {
    const currentRow = el.value.split("\n").length;
    el.rows = currentRow + 1;
  }
});
```

3行目で8行以上多くならないようにしてある。Githubのフォームがこんな仕様だったので真似した。無限に伸ばしたかったら外せば良い。

jQueryは必要ないです。

## 追記

よく考えたら折り返し考慮してなかったので、もっかい考える。

## 追記

こうなった

```js
function fitToContent(el, maxHeight) {
  let adjustedHeight = el.clientHeight;
  if ( !maxHeight || maxHeight > adjustedHeight ) {
    adjustedHeight = Math.max(el.scrollHeight, adjustedHeight);
    if ( maxHeight ) {
      adjustedHeight = Math.min(maxHeight, adjustedHeight);
    }
    if ( adjustedHeight > el.clientHeight ) {
      el.style.height = adjustedHeight + "px";
    }
  }
}
el.addEventListener("input", _ev => {
  fitToContent(el, 180);
});
```
ユニティちゃん歩く走る減衰する

#ユニティちゃん歩く走る減衰する

前回「[ユニティちゃん歩く走るくつろぐ](http://qiita.com/tatmos/items/bbd28dfa4e0df7e48910)」からの更新点は

・今回はカメラを固定して、距離減衰を試みてみた。
・ADX2LEのプロジェクトも更新してみた。
・[ADX2LE](http://www.adx2le.com/index.html)のプラグインも更新(v202)してみた。
・自作メータカスタムプラグイン[MyCriAtomMixer](https://github.com/tatmos/MyCriAtomMixer/blob/master/MyCriAtomMixer.cs)を追加してみた。

#動画

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/ltAbaDxr8qU/0.jpg)](http://www.youtube.com/watch?v=ltAbaDxr8qU)


#ダウンロード (Unityパッケージ)はこちら
[Unity_FootstepsADX2LE_tatmos20160414_2.unitypackage](https://drive.google.com/open?id=0B_omSCuMqg3ebnVwbmN5eXhqNms)　
[UnityChanFootsteps_ADX2LE_20140414.zip](https://drive.google.com/open?id=0B_omSCuMqg3eZ2ctbnlSZnMxd00)　 ADX2LEのAtomCraftTool用データ

```
上記パッケージをインポートして自由に使っていただいて構いません。
ってか遊んでみてね。
```

#距離減衰の設定

##「footstep」キューの「3Dポジショニング」で、「減衰距離」を設定
最大80.00 
最小4.00
単位はメートルなのでかなり遠くまで聞こえるようにしている。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/4dfe379a-b350-46df-e65e-308a7e09a19f.png)

##「ウェーブフォームリージョン」の「パンのタイプ」をオート（パン3D/3Dポジショニング）

リストで「フィルタ」を使って一括で設定している。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/8491feb2-61e6-481e-1b32-2900af80a56e.png)

#リスナーをカメラに設定

CriAtomListenerをカメラにつけた。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/545380a8-c5ca-c1fe-3695-8f08e2bc8bd8.png)

#SoundManagerをユニティちゃんの下に置いた

音の位置を動かすためCriAtomSourceを配置。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/2533b8b7-525e-9acf-989e-6b5e4c11081b.png)

#ボールにもCriAtomSourceを置いた

ボールが床に接触したときも音がなるようにした。
Pitchを低くした。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/5aa4a8b2-73bf-9566-6aff-10e46c11631e.png)

#スクリプト変更

##CriAtomSourceをインスペクタから指定できるようにした。

ユニティちゃんとボールでそれぞれで音の鳴る位置ごとに
CriAtomSourceが必要なので。。。

``` play_footstep.cs
using UnityEngine;
using System.Collections;

public class play_footstep : MonoBehaviour {

	public CriAtomSource sound_manager = null;

	// Use this for initialization
	void Start () {
        if(sound_manager == null){
		    // SoundManagerにアクセスできるようにする。
		    sound_manager = GameObject.FindGameObjectWithTag ("SoundManager").GetComponent<CriAtomSource>();
        }

		// 初期状態をrunに。
        sound_manager.player.SetSelectorLabel ("state","run");
	}
	
	// 接地したら
	void OnTriggerEnter (Collider col){
        if(col.tag == "ground")
        {
    		// 触れたオブジェのマテリアルを取得(tagで検出も実装しても良いと思う)
            Renderer renderer = col.gameObject.GetComponent<Renderer> ();
            if(renderer != null){
                string change_material = renderer.sharedMaterial.name;
        		Debug.Log (change_material);
        		// 地面のタイプを変更し、再生
                sound_manager.player.SetSelectorLabel ("ground_type",change_material);
        		sound_manager.Play();
            }
        }
	}
}
```

#メーター

自作メータカスタムプラグイン[MyCriAtomMixer](https://github.com/tatmos/MyCriAtomMixer)を追加してみた。
小さい音がでているかとか視覚的にわかるので便利。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/802bb919-9755-9496-4f7a-590a7ab94e46.png)


#その他細かい変更点
カメラ位置とか少し修正したり。
マップも少し複雑にしています。
【HP-UX】一般ユーザがcrontabコマンドを使えない時


`HP-UX`環境で、root以外の一般ユーザでcrontabコマンドを実行したときに、

`crontab: you are not authorized to use cron. Sorry. `

と表示された場合、下記の対応することで回避することができる。

-

## ◆手順
### ①環境を確認する

````
$ uname -a
````

[確認]
・HP-UX OSであること

-
### ②crontabコマンドを使用できないことを確認する

````
$ crontab -l
````

[確認]
・下記のメッセージが表示されること
  `crontab: you are not authorized to use cron. Sorry. `

-
### ③cron.allowファイルに設定を追加する
````
$ ls -l /var/adm/cron/cron.allow
$ vi /var/adm/cron/cron.allow
$ vi /var/adm/cron/cron.allow
````

[確認]
・エラーなく設定が追加されること

-
### ④動作確認
````
$ crontab -l
````

・はじめに表示されていたメッセージが表示されないこと
[C++] explicit & converting constructor

Recently I saw some code use the `explicit` keyword in the constructor. To explain the `explicit`, see the sample code here. 


```cpp
class Enemy {
public:
    Enemy(int hp) : hp(hp) {} // implicit constructor
    Enemy(int hp, int damage) : hp(hp), damage(damage) {}
    int hp;
    int damage;
};

class Player {
public:
    explicit Player(int hp) : hp(hp) {} // explicit constructor
    explicit Player(int hp, int damage) : hp(hp), damage(damage) {}
    int hp;
    int damage;
};

int main() {
    Enemy a1 = 1000;               // OK　copy-initialization selects Player(int hp)
    Enemy a2 = { 1000, 200 };      // OK
    Enemy a3 = Enemy(1000);        // OK
    Enemy a4 = Enemy(1000, 200);   // OK
    Enemy a5 = (Enemy)1;           // OK

    Player b1 = 1000;              // error: no viable conversion from 'int' to 'Player'
    Player b2 = { 1000, 200 };     // error: chosen constructor is explicit in copy-initialization
    Player b3 = Player(1000);      // OK
    Player b4 = Player(1000, 200); // OK
    Player b5 = (Player)1000;      // OK
    return 0;
}
```

~~### Explanation~~

~~When use the implicit constructor, it equals to create a temporary instance and copy the temporary instance to the final instance.~~

For the explicit constructor, you must do something like this:

```cpp
Player b1(1000);
```


You could find more information from the [c++ reference page](http://en.cppreference.com/w/cpp/language/converting_constructor).
[cmd.exe]rubyで再帰的にディレクトリ探索したパスをpecoに渡してディレクトリ移動

# モチベーション

pecoで再帰ディレクトリ探索したパスに移動したい！

![aaa.gif](https://qiita-image-store.s3.amazonaws.com/0/12550/8d9ae2ee-8467-e05b-76a2-189a3bc11d01.gif)

# ruby script

以下はpecoにディレクトリ一覧を渡して、pecoがディレクトリを吐くまでのスクリプトです。これを`cd`とかに食わしてやるとディレクトリ移動ができるかと。

```rb:directory-search.rb
def search_dir(cur_dir)
	dirs = Dir.glob(File.join(cur_dir, "*")).map { |e|
		e.force_encoding("UTF-8") if File.directory?(e)
	}.compact

	unless dirs.empty?
		$io.puts dirs
		dirs.each do |sub_dir|
			search_dir(File.join(sub_dir))
		end
	end
end

begin
	$io = IO.popen("peco.exe", "w")
	search_dir(".")
rescue
ensure
	$io.close
end
```

## glob("\*\*/\*")で再帰探索できるよ？

起動時一発目がなんかおそかったので。。できるだけpecoを早く起動して、フィルタリングしてる最中に探索してくれればいいかなという思想です。

## バッチファイルでやれよ

```
@echo off
dir /b /s | findstr /v /r \\\. | iconv -f CP932 -t UTF-8 | peco
```

というバッチファイルを組んで始めはやってたんですが、変に文字化けしたファイルが大量にあったりしてiconvが変換できずに途中で止まってしまう問題がありまして。。

あと、ディレクトリだけ取る方法がパッと思いつかず。rubyなら思いついたっていうのがrubyで書いた一番の理由です。

# ディレクトリ移動する為のバッチスクリプト

directory-search.rbのパスはお好きな場所に変更して頂ければ良いかと。

```
@echo off

for /f "delims=" %%i in ('ruby %USERPROFILE%/directory-search.rb ^| iconv -f UTF-8 -t CP932') do (
		cd ^"%%i^"
		break
)
```

# 参考資料

* https://github.com/peco/peco

* https://github.com/mattn/pcd

* https://github.com/mattn/cool-peco-windows
ReactJSチュートリアルの最初の画面を表示しました。

ReactJSのチュートリアルを表示しました。やり方はFacebookのチュートリアルページ（ https://facebook.github.io/react/docs/tutorial.html ）をそのままです。 

環境はMacです。

# react-tutorial を clone
git cloneしたけど何でやってもいいみたい。

```
git clone git@github.com:reactjs/react-tutorial.git
```

クローンしたディレクトリに移動します。

```
cd react-tutorial/
```

npm installします。ちなみにnodeでやったけど他に色々あってなんでも良いみたいです。

```
npm install
```

# サーバーを起動する

```
node server.js 

Server started: http://localhost:3000/
```

# ブラウザから表示
http://localhost:3000/ へアクセスします。

らしきものが表示できました。
<img width="409" alt="ReactJS tutorial" src="https://qiita-image-store.s3.amazonaws.com/0/1624/b59cc930-e0a4-c80a-0f19-8e65d3f10594.png">



# 参考
https://facebook.github.io/react/docs/tutorial.html
nokogiriとopen-uriを使って松屋の店舗数を数えてみる

なんか他の用途にも使えそうなのでメモ。

[松屋店舗一覧](http://pkg.navitime.co.jp/matsuyafoods/area/list)

![screencapture-pkg-navitime-co-jp-matsuyafoods-area-list-1460613035945.png](https://qiita-image-store.s3.amazonaws.com/0/34733/e6fe93c5-3595-9c7c-8d53-6e3527cc579b.png)

とりあえず各地域の店舗数を全部足し合わせたい。ページのソースを確認してnokogiriで抜き出せそうな要素を探してみると```<span>```で抜くのが簡単そう。

```rb
require 'open-uri'
require 'nokogiri'

URL = "http://pkg.navitime.co.jp/matsuyafoods/area/list"

doc = Nokogiri::HTML(open(URL), nil, 'utf-8')

puts doc.css("span")
```

これでこんな感じ。
```<span><a href="//pkg.navitime.co.jp/matsuyafoods/" onclick="gaTrackEvent(document.title, 'パン屑での遷移/パン屑リスト', '検索トップ');">検索トップ</a></span>
<span>検索結果</span>
<span>(42 件)</span>
<span>(4 件)</span>
<span>(12 件)</span>
<span>(3 件)</span>
<span>(4 件)</span>
<span>(99 件)</span>
<span>(5 件)</span>
<span>(2 件)</span>
<span>(112 件)</span>
<span>(17 件)</span>
<span>(6 件)</span>
<span>(11 件)</span>
<span>(100 件)</span>
<span>(4 件)</span>
<span>(14 件)</span>
<span>(62 件)</span>
<span>(382 件)</span>
<span>(1 件)</span>
<span>(6 件)</span>
<span>(4 件)</span>
<span>(12 件)</span>
<span>(7 件)</span>
<span>(9 件)</span>
<span>(40 件)</span>
<span>(9 件)</span>
<span>(2 件)</span>
<span>(16 件)</span>
<span>(7 件)</span>
<span>(14 件)</span>
<span>(7 件)</span>
<span>(12 件)</span>
<span>(3 件)</span>
<span>(5 件)</span>
<span>(8 件)</span>
<span>(5 件)</span>
```

これで数字以外を取り除いて足し合わせれば完了。

```rb
require 'open-uri'
require 'nokogiri'

URL = "http://pkg.navitime.co.jp/matsuyafoods/area/list"

doc = Nokogiri::HTML(open(URL), nil, 'utf-8')

sum = 0
doc.css("span").each do |row|
  sum += row.text.gsub(/[^0-9]/,"").to_i
end
p sum
```
出力結果
```1046```
自動でHTMLを表示するカスタムTextView

素のTextViewで `android:html="true"` ができればいいんだけど。簡単すぎるからライブラリを使うまでもないけど、とりあえずこんな感じでできそう。`android:text="..."` に設定したタグが自動的にHTMLとして解釈されます。

Android Studioのlayout previewでもちゃんと反映されるのでデバッグも簡単。

```java
import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.Html;
import android.text.Spanned;
import android.util.AttributeSet;

public class HtmlView extends AppCompatTextView {

    public HtmlView(Context context) {
        this(context, null, 0);
    }

    public HtmlView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public HtmlView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        if (text instanceof Spanned) {
            super.setText(text, type);
        } else {
            super.setText(Html.fromHtml(text.toString()), type);
        }
    }
}
```
Flash DevelopのFlash IDEにAnimate CCを設定する

FlashDevelopではFlash IDEを設定することでFlashでパブリッシュプレビューできたりします。

今回FlashがAnimateに変更になったので、いつも通り「ツール」-> 「環境設定から」下記のようにパスを変更しました。

![flashdevelop.PNG](https://qiita-image-store.s3.amazonaws.com/0/100937/6124483d-b98d-25bf-cb89-fef35d1241ad.png)

しかし、ディレクトリを設定すると、

**Flash.exeを指定してください**

のようなエラーが出てしまいます。ので、最後に「\Animate.exe」を加えてフルパスで指定してあげましょう。

上記の画像で言えば

**D:\Program Files\Adobe\Adobe Animate CC 2015\Animate.exe**

です。これでF6でパブリッシュプレビューができるようになりました！
Realmインストール時にsharedApplicationでエラーが発生した際の対応


# 事象
Realm 0.98.7をCocoaPodsでインストールしたところ、コード内の

``` Objective-C
[Application sharedApplication]
```
にて 

```
'sharedApplication' is unavailable: Use view controller based solutions where appropriate instead.
```

といったエラーが発生し、ビルドが通らなくなった。

# 原因
CocoaPodsのバージョンが古かった。(RealmはCocoaPods 3.9.0以上が必要)

# 解決方法
1. CocoaPodsのアップデートを行う。 

```bash
$ sudo gem update cocoapods
```

2.RealmをPodfileから削除

3.下記を実行してRealmをプロジェクトから削除

```bash
$ pod install
```

4.RealmをPodfileに再度追加

5.下記を実行

```bash
$ pod install
```
Facebook Messenger Platform + Bluemix on Node.jsでオウム返しBot

[Messenger　Platform/Getting　Started](https://developers.facebook.com/docs/messenger-platform/quickstart)
FacebookドキュメントとQiitaの記事を参考にオウム返しBotを作成しました。
つぎはぎですが、一応動くはず。。

#流れ
1. Bluemixのセットアップ
2. Facebook Messenger Platformの設定

#Bluemixのセットアップ
1. IBM SDK for Node.js　アプリケーションを作成
2. スターターコードをダウンロード
3. 以下のファイルを変更
4. BluemixへPush


```js:app.js
var express = require('express');
var request = require('request');

var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var token = "<YOUR TOKEN>";

function sendTextMessage(sender, text) {
  messageData = {
    text:text
  }
 
 var options = {
    url: 'https://graph.facebook.com/v2.6/me/messages',
    qs: {access_token:token},
    method: 'POST',
    json: {
      recipient: {id:sender},
      message: messageData,
    }
  }

  request.post(options, function(error, response, body){
    if (!error && response.statusCode == 200) {
      console.log(body.name);
    } else {
      console.log('error: '+ response.statusCode);
    }
  });
}

app.get('/webhook/', function (req, res) {
  if (req.query['hub.verify_token'] === '<VALIDATION TOKEN>') {
    res.send(req.query['hub.challenge']);
  }
  res.send('Error, wrong validation token');
})

app.post('/webhook/', function (req, res) {
  messaging_events = req.body.entry[0].messaging;
  for (i = 0; i < messaging_events.length; i++) {
    event = req.body.entry[0].messaging[i];
    sender = event.sender.id;
    if (event.message && event.message.text) {
      text = event.message.text;
      sendTextMessage(sender, "Text received, echo: "+ text.substring(0, 200));
    }
  }
  res.sendStatus(200);
});

var server = app.listen(process.env.PORT || 3000, function() {
  console.log('Listening on port %d', server.address().port);
});
```


```yaml:manifest.yml
applications:
- disk_quota: 1024M
  host: <YOUR HOST>
  name: HelloWorld
  command: node app.js
  path: .
  domain: <YOUR DOMAIN>
  instances: 1
  memory: 256M

```

```json:package.json
{
  "name": "cloudant_boilerplate_nodejs",
  "version": "0.0.2",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "4.13.x",
    "ejs": "2.4.x",
    "cloudant": "1.4.x",
    "body-parser": "1.14.x",
    "method-override": "2.3.x",
    "morgan": "1.6.x",
    "errorhandler": "1.4.x",
    "connect-multiparty": "2.0.x",
    "request": "2.71.x" //<-追加行
  },
  "repository": {},
  "engines": {
  	"node": "4.2.x"
  }
}

```


#Facebook Messenger　Platformの設定
1. Facebookページの作成
2. Messenger -> Webhookを設定
3. アクセストークン発行 -> app.jsにアクセストークンを設定して再度BluemixにPush
4. アプリ申請 -> `curl -ik -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=<token>"`
5. Facebook上でBotの動作確認

こちらの記事を参考にさせていただきました。
[Messengerで簡単なBotつくる(Facebook Messenger Platform from F8)](http://qiita.com/pochi-sato/items/f3f5598e36c1fa92d840)
JMeterでCSVを読み込んでJSONリクエストを投げる


エンドポイント http://192.168.33.10:8080/api/users に以下のようなJSONリクエストを投げる試験を行いたいとする。

```json
{
    "name": "Alice",
    "age": 20
}
```

# CSV準備
ヘッダ行付きのデータを準備

```csv:data.csv
name,age
Alice,20
Bob,35
Carol,50
```

# JMeter設定
1. JMeterを起動し、[テスト計画]を右クリックし、[追加]>[Thread(Users)]>[スレッドグループ]を選択
![jmeter1.png](https://qiita-image-store.s3.amazonaws.com/0/41477/04c6a0c3-d327-5a21-55ea-d96a62fe9727.png)
2. スレッド数、Ramp-Up期間、ループ回数を指定
3. [スレッドグループ]を右クリックし、[追加]>[サンプラー]>[HTTPリクエスト]を選択
![jmeter3.png](https://qiita-image-store.s3.amazonaws.com/0/41477/de1f963e-ab2b-b1ba-6663-44b61d10a0b3.png)
4. リクエスト内容設定。
[Body Data]でJSONを指定。${name}のような形式でCSVのヘッダと対応させた変数とする。
![jmeter4.png](https://qiita-image-store.s3.amazonaws.com/0/41477/27541f68-c266-18be-8e58-02e05bf6dd09.png)
5. [HTTPリクエスト]を右クリックし、[追加]>[設定エレメント]>[HTTPヘッダマネージャ]を選択
![jmeter5.png](https://qiita-image-store.s3.amazonaws.com/0/41477/bd5bf9c5-8456-5fd6-1fe6-1112d012abba.png)
6. [HTTPヘッダマネージャ]で 名前: Content-Type、値: application/json を追加
![jmeter6.png](https://qiita-image-store.s3.amazonaws.com/0/41477/39cd7dca-61b0-3588-4a92-6ef63dd62163.png)
7.  [HTTPリクエスト]を右クリックし、[追加]>[設定エレメント]>[CSV Data Set Config]を選択
![jmeter7.png](https://qiita-image-store.s3.amazonaws.com/0/41477/88665107-54a1-b11d-1776-5f048e1cc256.png)
8.  [CSV Data Set Config]で[Filename]にCSVのパスを設定
CSVにヘッダ行がある場合は[Variable Names(comma-delimited)]は何も指定しなくてよい。
CSVにヘッダ行がない場合は[Variable Names(comma-delimited)]に "name,age" のようにヘッダ相当のものを指定する。
![jmeter8.png](https://qiita-image-store.s3.amazonaws.com/0/41477/259644aa-dab2-1a6d-b4a8-0df6a2ef6572.png)
9.  実行するとCSVの内容に応じてリクエストが投げられる
![jmeter9-1.png](https://qiita-image-store.s3.amazonaws.com/0/41477/b76491b0-7078-4df3-f62f-4f92c6d8a765.png)
![jmeter9-2.png](https://qiita-image-store.s3.amazonaws.com/0/41477/b10f0ce6-9dcf-9712-e2c4-8b3a73cb0ac7.png)
![jmeter9-3.png](https://qiita-image-store.s3.amazonaws.com/0/41477/73bff1a0-8f02-36d8-2075-66901acaa62f.png)
The AirBoard

検索ワードとしては theairboard のほうが出やすい。LiPo 付き Arduino FIO 互換。本体には無線機能は無く、お好みの無線モジュールを選んで追加する想定。[kickstarter](https://www.kickstarter.com/projects/223628811/the-airboard-sketch-internet-of-things-fast)で始まって、Seed Studio で[市販](http://www.seeedstudio.com/depot/The-AirBoard-prototyping-platform-For-IoT-p-2602.html)される運びに[なった](https://www.facebook.com/theairboard/posts/1994368317456007)（執筆時で日本円3250円）。

ドキュメントは OTA programming（無線越しにファームを書き込む方式）を推していて、[Quick Start](http://www.theairboard.cc/quick-start/) でもDFRobot の BLE-LINK を使う方法が書かれているけれど、日本では技適の問題もあるし、買うのも難しいし、買えても追加で結線しないといけなかったり（※1）と、なかなかハードルが高い。

OTA でなく、普通にシリアル接続してプログラムするのが簡単(※2)。配線は次の通り。

* TX = JP2, pin2 (`<-RX`)
* RX = JP2, pin3 (`->TX`)
* GND = JP2, pin10 (`GND`)
* RST = JP3, pin4 (`XR`)

[Quick Start](http://www.theairboard.cc/quick-start/) の"Developing off-line with the Arduino IDE"の手順に従う。

+ [Arduino IDE](http://www.arduino.cc/en/Main/Software) をインストールする。
+ [TheAirBoard-master.zip](https://github.com/theairboard/TheAirBoard/archive/master.zip)
を手元で展開する。
+ `TheAirBoard-master/arduino/` の下にあるファイルを
`Preferences>Sketchbook` の場所の `/libraries` 配下に置く。
+ `/libraries` ディレクトリがない場合は手作業で作ること。
+ Arduino IDE を再起動させる。
+ `Tools>Serial Port>シリアルつないだポート` を選択。
+ `Tools>Board>Arduino Fio` を選択。
+ 以上

※1 : [FAQ](http://www.theairboard.cc/faq/) の "I bought BLE-LINK from DFRobot and I can't upload my sketch" より
※2 : [FAQ](http://www.theairboard.cc/faq/) の "Can I connect an FTDI cable for wired programming?" より
初対面のviと友達になりたい話(キーバインド編)

今までRaspiをいじっていた時はemacsと仲よかったんですが、インターネットのいろんなところを見てるとsudo vi~~が多すぎたのでそろそろviをやろうと思ってやり始めました。

（とりあえず1時間ほどいじった結果、emacsよりもvi(m)のほうが個人的に使いやすかったのとvimがviの上位互換(語弊があるかもしれない)だと聞いたので、まだあまり理解してないうちはvimを使っていきたいなと思いました。
そのためのメモです。自分の理解なので、系の分類とかおかしいかもしれないけど許して。

-----
vim自体を使いやすくするための準備コマンド
-----
`:set number` 
行数を表示(いちいちやるのめんどくさいのでこれは~/.vimrcに書いたほうがいい)
`:vsp ファイル名`　
左右に分割してファイルを表示(spなら上下に分割)。viだとvspができない。vimでやろう。

ファイル操作系コマンド
-----
`:q` 終了する。=quit（保存してない場合は警告が出る+終了できない）
`:q!` 保存せずに終了。
`:w` 保存する=Write ↓のように組み合わせると強い。
`:wq` 保存して終了
`ZZ` 保存して終了(:ZZと同等)

`:e ファイル名` ファイルを開く。:e!でやると前の未保存の変更は消える。

カーソル操作系
-----
`h` Hidariに一個移動
`j` 下に一個移動
`k` 上に一個移動
`l` 右に一個移動

`:数字` [数字]行目の先頭にカーソルを移動(コロンなしの数字のみだとその数字の行分カーソルをすすめる)
`gg` ファイルの先頭にカーソルを置く
`GG` ファイルの最後尾にカーソルを置く
`^` カーソルを現在の行の先頭移動

入力系
----------
`a` カーソルの次の文字から挿入を開始
`i` カーソルのある位置に対して挿入を開始
`o` 現在家0ソルがある次の行に空行を開けてそこに挿入
`A I O`はまだ慣れていないので、とりあえずこれだけ…個人的には:aが使いやすい。

`u` Undoをする。なれないうちはEsc押さずにコマンド打っちゃうことが多いので、個人的にこのコマンドは強いです。
`Ctrl + r`: Redoをする。強い。

コピー・ペースト・削除
-------
'v' VISUALモードに移行して選択することができる。
↓選択したら
`y` コピーする(vimではコピーのことをyankって言うらしい)。選択中であればその選択範囲をコピーする。
`yy` カーソルのある行
↓コピーしたら
`p` ペーストする。（5pとかにすると、バッファを5回貼り付けるということができる。）

`d` 削除する。選択中であればその選択範囲を削除する。
`dd` カーソルのある行を削除
`dG` 現在のカーソルの場所から最後まで削除

その他(シェルコマンド・検索)
------
`:! シェルコマンド` :vimを一時停止してシェル上でのコマンドを使える。
正直意味あるのか？と思ってたけど。

```(ex).bash 
:! ls- lh
(これでVimで並列して開きたいファイルの名前を確認)
:vsp test2.txt
```
など普通に使いみちがある。というか結構使うんだろうな。


その他(検索)
-------
`/(String)` 
(String)という文字列を探す。
この時vimであればヒットした文字列にハイライトがつく。
更にnを連打で下方向に探せるし、Nを連打で上方向に探せる

その他
--------
`%s/(previous)/(next)/コマンド`
(previous)という文字列にひっかかったものを(next)に変換する。
コマンドはいくつかあるけど、なれないうちは事故があるのでcでも置いとけば良い。
(cは1つずつチェックするやつ。めんどかったら一括変換のgで。先頭だけならコマンドはいらない。)

 



`:↑↓` 前にやった命令を再度実行できる。シェルと一緒だね。
c++ builder > Link > OnClose処理 > ボタンを配置してCloseを実行して終了 / Alt+F4で終了 / システム・メニューから終了 /  右上の×ボタンで終了 ...

OnClose()処理に関して詳しい
http://d.hatena.ne.jp/magnitude6/20060120/1137735659

上記からリンクされているページ
http://leed.issp.u-tokyo.ac.jp/~takeuchi/delphi/article/048/048161.html

以下の判別はできるのだろうか?

- ソフトのバグによる終了
- 他のソフトからの WM_CLOSE による終了
- 右上のxボタンによる終了、またはCloseボタンによる意図的な終了
Raspberry Pi3でCPUとメモリのベンチマーク

Raspberry Pi3を買ったのでとりあえずベンチマーク。
比較対象は
CPU：Core　i7 965@ 3.20GHz（物理４コア＊２スレッド）
メモリ：PC3-10600
の物理マシン。

#●姫野ベンチ
##・Core i7＠シングルスレッド
<pre>
MFLOPS measured : 2758.416428  cpu : 56.314963
</pre>

##・Core i7＠８スレッド
<pre>
MFLOPS measured : 797.878382   cpu : 46.739701
MFLOPS measured : 692.159262   cpu : 49.322722
MFLOPS measured : 818.483985   cpu : 50.420835
MFLOPS measured : 861.923325   cpu : 51.856439
MFLOPS measured : 953.426888   cpu : 52.344097
MFLOPS measured : 952.077258   cpu : 52.850317
MFLOPS measured : 927.921274   cpu : 53.487360
MFLOPS measured : 748.187361   cpu : 54.058672
</pre>
合計：6752MFLOPS

##・Raspberry Pi3＠シングルスレッド
<pre>
MFLOPS measured : 135.012405   cpu : 59.914517
</pre>
##・Raspberry Pi3＠４スレッド

<pre>
MFLOPS measured : 108.612956   cpu : 13.885604
MFLOPS measured : 108.474324   cpu : 13.903350
MFLOPS measured : 128.544521   cpu : 4.266386
MFLOPS measured : 127.892317   cpu : 4.288143
</pre>
合計：474MFLOPS

#●Stream
##・Core i7＠シングルスレッド
<pre>
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           11190.4     0.015001     0.014298     0.016153
Scale:          11694.1     0.014428     0.013682     0.016332
Add:            12434.5     0.019860     0.019301     0.021265
Triad:          12030.1     0.020726     0.019950     0.022729
</pre>

##・Core i7＠マルチスレッド
<pre>
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           12315.1     0.013894     0.012992     0.015358
Scale:          12193.2     0.013832     0.013122     0.014674
Add:            13221.0     0.018987     0.018153     0.019916
Triad:          13438.6     0.018709     0.017859     0.019850
</pre>

##・Raspberry Pi3＠シングルスレッド
<pre>
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:            2174.5     0.073893     0.073581     0.074216
Scale:           2089.0     0.079205     0.076592     0.089129
Add:             2042.3     0.117886     0.117513     0.118394
Triad:           1726.5     0.139460     0.139011     0.139886
</pre>

##・Raspberry Pi3＠マルチスレッド
<pre>
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:            2210.1     0.072878     0.072396     0.073229
Scale:           2210.0     0.072942     0.072398     0.073328
Add:             2141.8     0.112981     0.112057     0.114330
Triad:           2153.0     0.112733     0.111471     0.113705
</pre>
【C#】代入式の評価値について知らなかったこと

C#の代入式の評価値についてメモ

## 環境
* .Net Framework 4.5.1
* VisualStudio 2015 Professional

## そもそも
C#では代入式(a=10みたいな式)は代入される値を返す。

```csharp
int a;
bool b = (a = 10) == 10; //bはtrue
```
個人的にはパッと見何をやっているのかわかりにくいので基本的に使用しない。

## イコール(=) 以外の代入式
代入式は単純な`=`以外に`+=`, `-=`, `*=`, `/=`があるが、それぞれ評価値はそれぞれ計算後の値となる。

```csharp
int a = 3;
int b = a *= 5;// aもbも15が入る
```
評価した値と代入される値が一致するので、`a+=1`は`a++`より`++a`に近い。

## 本題

```csharp
int a = 3;
a *= a += 5;
```
としたときの`a`の値は何になるでしょうか？

やってみる前の予想では、

```csharp
//a *= a += 5;の分解(予想)
int tmp = a += 5; //a=8, tmp=8
a *= tmp;
```
と実行されて、最終的には`a`に64(8 * 8)が入ると思っていた。

しかし実際にやってみると`a`には24 ((5 + 3) * 3)が入っている。
つまりは

```csharp
//a *= a += 5;の分解
int tmp = a + 5;// a=3, tmp=8
a *= tmp;
```
となっているようで、右側の式は計算はされているが代入は無視されている？

また、

```csharp
int a = b= 3;
a *= b += 5;
```
とすると、a=24, b=8となる。右側(先に評価される側)の代入が無視されるのは同じ変数に対する代入だけの模様。

さらに次のようにコードを変更してみる

```csharp
int a = 3;
a *= ++a;
```
この場合は`a`には12 (3 * (3 + 1))が入っている。

先ほど+=の挙動が前置インクリメントに近いと書いたが、ここでも挙動は一致する。
ちなみに

```csharp
int a = 3;
a *= a++;
```
とすると、aには9が入る。

## まとめ、感想

* 代入式は代入する値を返す
* +=等は計算後の値を返す
* 同じ変数について1行で2回代入すると、先に評価される箇所の代入は無視される？
    * ただし計算付の代入の場合、計算結果を返す部分はのこる
* ILレベルで見ればもっと詳しい意味が分かると思うが、これ以上は深入りしないでおく
* 基本的には、代入式の評価値は使わない方がいいと思う(使った方がいい場面ってあるの？)
* C# Interactiveのおかげでこういう検証がやりやすくなった
MySQLでDBとテーブルのサイズを確認するSQL

メモ。たまにコピペして使います。

## DBのサイズ
```sql
SELECT 
    table_schema, sum(data_length) /1024/1024 AS mb 
FROM 
    information_schema.tables  
GROUP BY 
    table_schema 
ORDER BY       
    sum(data_length+index_length) DESC;
``` 

## Tableのサイズ
```sql
SELECT  
    table_name, engine, table_rows AS tbl_rows,
    avg_row_length AS rlen,  
    floor((data_length+index_length)/1024/1024) AS allmb,  #総容量
    floor((data_length)/1024/1024) AS dmb,  #データ容量
    floor((index_length)/1024/1024) AS imb   #インデックス容量
FROM 
    information_schema.tables  
WHERE
    table_schema=database()  
ORDER BY
    (data_length+index_length) DESC;  

```
submodule を含む Git リポジトリを make でかんたんに更新する

こんな Makefile を置いておくことにしました。

```mf
.PHONY: update update-all all

update:
	git pull origin master
	git submodule update --init

update-all: update
	git submodule foreach git pull origin master

all: update-all
```

submodule が submodule を含む場合には、 `git submodule update --recursive` を付けるとよさそうですね。

### 使い方

```bash
% make     # update タスクを実行
% make all # update-all タスク(update に依存)を実行
```

ラッパースクリプトを作ってもいいのですけど、 `make` でもいいかなというところ。
色んなリポジトリに `Makefile` を置くよりは、スクリプト1枚で済ませた方が汎用的かもしれません。
`git` のサブコマンドにしてしまう手もありそうですね。

みなさんはどうしてるでしょうか。

まだ試み程度ですが、ご参考になれば幸い。
GoogleSpreadSheet（グーグルスプレッドシート）で一番左のシートをデフォルトで表示する方法

毎日シートをコピーして一番左のシートを最新にするというような作業をしている際、ブックマークをクリックして表示するシートが最新でないといちいち移動するのがめんどくさい。

![Screen Shot 2016-04-14 at 12.51.55.png](https://qiita-image-store.s3.amazonaws.com/0/34733/345669d7-34b6-fccb-baeb-f426efcf8068.png)

こんな感じ。
こんな時はブックマークに登録する際に、URLの末尾のedit以降を削除して登録する。

これを…

![Screen Shot 2016-04-14 at 12.53.09.png](https://qiita-image-store.s3.amazonaws.com/0/34733/0ebf5d6f-cbc4-a681-e58f-4c802c312381.png)

こう。

![Screen Shot 2016-04-14 at 12.53.35.png](https://qiita-image-store.s3.amazonaws.com/0/34733/429e6d19-0138-932f-9a20-f5be494ca07c.png)

gid以降でシートのURLをしているらしい。
参考記事：[google スプレッドシートでデフォルトで表示するタブを変更する方法 ](http://tech.kimihiko.jp/article/104137714.html)

これでブックマークからアクセスすると一番左にシートにアクセスするようになりました〜。
Gitで特定パスの変更時のみJenkinsのジョブを実行する

# 背景
あるディレクトリ以下にあるファイルが変更されたときにjenkinsのジョブを実行して環境を反映したいということがありました。
リポジトリはgitを使っているのですが、ツール群が色々入っているリポジトリで、今回対象にしたいファイル郡も
それ専用にリポジトリを切るにはかなり小さい量だったので、リポジトリは変えずに特定パスのみをトリガにする方法を考えました。

# やったこと
通常のSCMポーリングなんかを使うと、リポジトリの変更全てを拾ってしまいます。
でもいい感じにしてくれそうなpluginが見当たらない。
そこで今回はshellでトリガーをチェックする方法をとりました。

## プラグイン導入
- shell をトリガーにするためにまず以下のプラグインを導入しました。
https://wiki.jenkins-ci.org/display/JENKINS/ScriptTrigger+Plugin

- あと、gitを使っているので、以下のプラグインも導入し該当のjobにgitリポジトリの設定をしておきます。
https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

## スクリプト設定
jenkinsのジョブが `test-job`、トリガーにしたいパスが `src/hoge/fuga/`として以下のように設定しました。

``` sh:path_update_check.sh
#--------------------------
# 設定
#--------------------------
# workspaceパス
workspace=/var/lib/jenkins/jobs/test-job/workspace

# 更新チェック対象パス
check_path=src/hoge/fuga/

#--------------------------
# 実行
#--------------------------

# workspaceに移動
cd $workspace

# branch取得
branch=`git rev-parse --abbrev-ref HEAD`

# 現在のハッシュ値取得
old=`git log -n 1 --format=format:'%H'`

# pull
git pull origin $branch

# 更新後のハッシュ値取得
new=`git log -n 1 --format=format:'%H'`

# 該当パスに変更があるかチェック
# ハッシュ値間のコミットのファイルに対象パスでgrepをかける
git log $old..$new --format=format:'' --name-status | grep -e "^[ADM]\s\+$check_path"
```

## ちょっと解説
やってることは単純で、pull前後のハッシュ値を取得して、ハッシュ間でコミットされたファイル一覧を取得。
ファイル一覧にチェックしたいパスをgrepしてるだけです。
grepの正規表現を工夫すれば複数パス指定なんかもできると思います。

grepの結果、終了コードが`0`になると変更があったファイルがヒットしたことになるので、
トリガーの設定の Exit Codeには `0` を設定します。

![代替テキスト](https://i.gyazo.com/f882bfcf643b2c70f2ee408a73156a64.png)

# 最後に
上記でとりあえず、特定パスの変更ときにjenkinsを実行できるようになりました。
pluginとしてこの機能が導入されればもっと捗りそうです。
あまり需要ないかもしれませんが。
Rspecでmodelのスコープをテストするとき

Rspecでcontroller,model,viewのテストをするとき、`type: model`や`type: request`すると使えるメソッドが違ってくる。
今回はmodelに定義したscopeをテストする方法。
定義したスコープは以下の通り。

```rb

  scope :open, -> {
    now = Time.current
    where("released_at <= ? AND (? < expired_at OR " +
      "expired_at IS NULL)", now, now) }
```

RSpecでテストすることを記述する

```rb

RSpec.describe Info, type: :model do
end
```


describeで枠を作る

```rb

RSpec.describe Info, type: :model do
 describe "scope" do
 end
end
```

describeでさらに枠を作る

```rb

RSpec.describe Info, type: :model do
 describe "scope" do
   describe "open" do
   end
 end
end
```

let!でRspec内のインスタンス変数を定義する

```rb

let!(Rspec内のインスタンス変数名) { create(:member, 属性名: 値, 属性名: 値)}
#create(:member)でFactoryGirlでテストデータを作成
```


```rb

  describe "scope" do
    describe "open" do
        let!(:applicable_article) { create(:article, released_at: Date.today, expired_at: Date.today+1) }
    end
  end
end
```

`subject { Airticle.open }`でAirticleモデルからopenスコープでインスタンスを取り出す。

```rb

  describe "scope" do
    describe "open" do
        let!(:applicable_article) { create(:article, released_at: Date.today, expired_at: Date.today+1) }
        subject { Article.open }
    end
  end
end
```

`it{ is_expected.to include インスタンス変数名}`
でテストする。`is_expected.to include`で`Article.open`にインスタンス変数が含まれているかテストできる

```rb

describe "scope" do
    describe "open" do
        let!(:applicable_article) { create(:article, released_at: Date.today, expired_at: Date.today+1) }
        subject { Article.open }
        it { is_expected.to include applecable_article }
    end
  end
end
```
LINE BOTをさくらのスタンダードプランでつくる

LINE BOTをさくらのスタンダードプランで作成しました。
さくらだと出来ないという記載をいくつかみたものの結果的には成功しました。
ただ、ちょっとしたコツがあります。
それは…

**待つ**

ことです。
LINE側なのかさくら側なのか分かりませんが、一通りの設定をおこなっても暫くのあいだStatusCode:427がLINEからひたすら返ってきて心が折れそうになりますが、辛抱強くBOT APIを叩きつづけるとそのうち動くようになります。

## 参照サイト
[LINE BOT API Trialでできる全ての事を試してみた - Qiita](http://qiita.com/betchi/items/8e5417dbf20a62f2239d)
PHPの実装はほぼここのものを使わせてもらいました。

[さくらインターネットでPHPエラーのログを出力する │ Design Spice](http://design-spice.com/2011/02/11/sakura-php-error-lo/)
エラーがwebブラウザ等で確認できないのでエラーログ出力の設定をしました。

[共有SSLの設定｜さくらインターネット公式サポートサイト](https://help.sakura.ad.jp/app/answers/detail/a_id/2331/~/共有sslの設定)
LINE BOT APIのcallback URLはHTTPS必須なので共有SSLの設定をしてhttpsで接続できるようにします。
サイトの運営は独自ドメインで行っていると思いますが共有SSLを使用する場合は独自ドメインは使えません。
callback URLは表からみえることもないので、まあいいかな？と。

[LINE BOT API で bot を作ったときにハマったことメモ - koogawa log](http://blog.koogawa.com/entry/2016/04/09/174709)
callback URLはポート番号443に設定することと、Callback先をホワイトリストに登録しておく必要があることをここで知りました。

##成果物
(アイドルの)名前とかを適当につぶやくと画像を返すbot(ふぁぼ嫁）をつくりました。
画像データは普段twitterでふぁぼした画像で、該当の画像1枚を抽出して返しています。
[こちら](http://www.planet-ape.net/favyome/)でひたすら貯め込んだ画像一覧がみれます。
![IMG_9125.PNG](https://qiita-image-store.s3.amazonaws.com/0/2545/fd3036d7-8930-3a2f-b2f9-5f206fe5b14d.png)

こちらから友達登録できます。（予告なく停止する可能性があります）
![nfd6449w (1).png](https://qiita-image-store.s3.amazonaws.com/0/2545/90f6b29d-5d6e-44b8-14f4-2275e8b40ff5.png)
GoogleSpreadSheet（グーグルスプレッドシート）で重複をチェックして、重複する値に色を付ける方法

いつもExcelの "重複する値に色付け" する機能をグーグルスプレッドシートで探してしまうのでメモ。
"グーグルスプレッドシート 重複チェック" で検索するといろいろとやり方が出てくるが、なんでそうなるのか調べたので解説。

【参考記事】
[Google スプレッドシート 入力時に同じ値がないかチェックしたい。](http://chaika.hatenablog.com/entry/2015/07/16/153840)
[Googleスプレッドシートについて](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13140445438)
#やりたいこと
![Screen Shot 2016-04-14 at 12.14.37.png](https://qiita-image-store.s3.amazonaws.com/0/34733/23071a9a-00b2-9355-8cf2-504a16ec0ca1.png)

こんな感じで重複する値に色をつけてわかるようにしたい。

# やり方
- 条件付き書式設定
- countif関数

これを使ってやります。

## 条件付き書式設定
まず "条件付き書式設定" ですが、ツールバーから 表示形式 > 条件付き書式… で開くことができます。

![Screen Shot 2016-04-14 at 12.17.48.png](https://qiita-image-store.s3.amazonaws.com/0/34733/f999913f-7396-b34a-b907-16d8b1802a7a.png)
画面の意味としては、"範囲に適用" 項目で書式の設定を適用させたい範囲を決めて、"セルの書式設定の条件" で条件を決めて、 "書式設定のスタイル" で色をつけるみたいなイメージです。

今回色付けしたいところは、チョコレートなどの文字列が入力されている範囲なのでB2:B8ですね。

![Screen Shot 2016-04-14 at 12.20.01.png](https://qiita-image-store.s3.amazonaws.com/0/34733/6ad7b292-e609-e46c-d715-d6fd0eefe4e6.png)

## COUNTIF関数

次に重複している値を見つけてくる機能として COUNTIF 関数を使います。これは、適応範囲と条件を決めると、それにマッチする値の数を数えてくれる関数です。

![Screen Shot 2016-04-14 at 12.22.02.png](https://qiita-image-store.s3.amazonaws.com/0/34733/0910ca5f-bf70-fa4f-6d09-edf31d7bc254.png)
[COUNTIF:ドキュメント エディタ ヘルプ](https://support.google.com/docs/answer/3093480?hl=ja)

### COUNTIF関数の簡単な使い方

![Screen Shot 2016-04-14 at 12.24.00.png](https://qiita-image-store.s3.amazonaws.com/0/34733/9937b54b-6da3-a250-97cd-177b6ba09740.png)

C2からC5の範囲で280より少ないものは…

![Screen Shot 2016-04-14 at 12.24.09.png](https://qiita-image-store.s3.amazonaws.com/0/34733/1da6db4b-c005-6977-737b-66e163827eee.png)

3個です！みたいな。

## 条件付き書式設定とCOUNTIF関数を組み合わせて使う
流れとしては、最初の画像に戻って、

![Screen Shot 2016-04-14 at 12.14.37.png](https://qiita-image-store.s3.amazonaws.com/0/34733/23071a9a-00b2-9355-8cf2-504a16ec0ca1.png)

「B2からB8の範囲で同じ値を持つものを数えて、2個以上のものの書式を変更」という感じになります。

先に結論を書くとこうなります。

```=countif(B$2:B$8, B2) > 1```

![Screen Shot 2016-04-14 at 12.30.37.png](https://qiita-image-store.s3.amazonaws.com/0/34733/87818af2-b7bb-1e12-1922-a2d91c20fb04.png)

何をやっているか説明すると、

```B$2:B$8 ```

で範囲を固定しています。ドルマークは値を固定する機能です。
これの意味は

```B2:B8 ```

の範囲内にB2の値が1個より多くあったら条件を適用させるという意味です。これをB2:B8に適用させるので、

```=countif(B$2:B$8, B2)>1
=countif(B$2:B$8, B3)>1
=countif(B$2:B$8, B4)>1
...```

と続いていきます。ドルマークが付いている値は固定されています。チョコレートの場合は、"チョコレート" という値が ">1" なので、B2とB8で書式が変更されます。
GitKrakenでgitデビューしようじゃなイカ [git gui クライアント]

gitのGUIツールいくつかありますよね
SourceTree、TortoiseGit...

# GitKraken（ギットクラーケン）とは
gitとイカが合わさり最強に見える（タコも倒せそう）
<img width="305" alt="スクリーンショット 2016-04-14 11.04.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/42777/34a2a780-5960-4192-a2c4-e860f1d88575.png">

# GitKraken様のインストール
[公式](https://www.gitkraken.com)またはbrewなら`brew cask install gitkraken`
Windows、Mac、Linuxに対応しているよ（てかElectronと[nodegit](http://www.nodegit.org)ですって）
初回起動後メール登録するけどSourceTreeほど面倒ではないです

# UI
<img width="386" alt="スクリーンショット 2016-04-14 11.26.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/42777/e7c67c0c-94fc-74a0-9987-2c2d298ef2d7.png">

- 闇（Dark）と光（Light）の2種類から選べる
- 毎回ネットワークの色が変わるのがスプラトゥーンのイカっぽい

# commit
<img width="159" alt="スクリーンショット 2016-04-14 11.40.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/42777/055af5b0-2430-d0b7-b59c-ffcb403ace63.png">

- 上側（Unstaged Files）からファイルを選んで表示される[Stage this file]ボタンでstageする（ドラッグできない！）
- コミットメッセージを入力してcommit
- あとamendとかできる

# アクション
<img width="771" alt="スクリーンショット 2016-04-14 11.38.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/42777/43d42da8-fcf3-8518-dbb1-2e1f4062ea16.png">

左から`undo` `redo` `pull` `push` `branch` `stash` `stash pop`あと検索と設定

# その他機能
`cmd + P` `ctrl + P`

- open + {repo name}: open a repo
- checkout + {branch name}: checkout a branch
- history + {filename}: view a file’s history

`cmd + ↑` `ctrl + home` ：最後のコミットに移動
`cmd + ↓` `ctrl + end` ：最初のコミットに移動