OmniAICreator/Qiita-1.07M huggingface dataset:
maplotlibのヒストグラムに累積比率を追加する2 〜FacetGridを使う〜

`pyplot.hist()`に対して、累積比率の線を重ねる方法は[ここ](http://qiita.com/messefor/items/3ba9eb0b58dd6283cc28)で書きました。今回は`seaborn.FacetGrid()`を使って描いた複数のヒストグラムに累積比率を重ねてみます。以下、完成プロット。

![fig_facetgrid.png](https://qiita-image-store.s3.amazonaws.com/0/47296/2fcd25f5-444f-b27b-e497-5ec7874f0387.png)

やる事は、[ここ](http://qiita.com/messefor/items/3ba9eb0b58dd6283cc28)と変わりませんが、`seaborn.FacetGrid()`や`seaborn.distplot()`を使ってヒストグラムを描く場合、`pyplot.hist()`の様にビンや度数の情報を戻り値として明示的に受け取れません。そこで`ax`オブジェクトからゴニョゴニョしてビンや度数の情報を抽出します。具体的には、`ax`に含まれる`patches`オブジェクトから必要な情報を取り出します。基本のコードは以下

```python
"""FacetGridのヒストグラムに累積比率の線を重ねる"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# % matplotlib inline
sns.set(style="darkgrid", palette="muted", color_codes=True)

# トイデータ生成
np.random.seed(0)

size = 200
x1 = np.random.normal(size=size)
group = np.random.choice((0, 1), size=size)
df = pd.DataFrame({'x1': x1, 'group': group})

# seaborn.FacetGrid()で複数のヒストグラムを生成
g = sns.FacetGrid(data=df, col='group', hue='group', size=5)
g = g.map(plt.hist, 'x1', alpha=0.7, label='Frequency')


# FacetGridに含まれるすべてのaxに対して、累積線を描く
for ax in g.axes.ravel():

    # patchesを抽出
    patches = ax.patches

    # 第2軸の値を計算（x)
    bins_part = [patch.get_xy()[0] + patch.get_width() for patch in patches]
    bins = [patches[0].get_xy()[0]] + bins_part
    x2 = np.convolve(bins, np.ones(2) / 2, mode="same")[1:]

    # 第2軸の値を計算（y:累積)
    n = [patch.get_height() for patch in patches]
    y2 = np.add.accumulate(n) / sum(n)

    # 第2軸のプロット
    ax2 = ax.twinx()
    ax2.plot(x2, y2, ls='--', marker='o', color='r',
                     label='Cumulative ratio')
    ax2.grid(visible=False)


plt.tight_layout()
plt.show()

```

凡例なども含めた完全版のコードはGistにおいてます。[ここ](https://gist.github.com/messefor/0e52086b8a961fb9ca4496c1f7c5efe4)からどうぞ。
cask コマンドがエラーを出し始めたら

# はじめに

ある日突然（というか最近）Caskがうまく動かなくなったので，解決策を模索しました．

以下の要件に合致する人向けの記事です．

- MacOSX ユーザ
- Emacs のパッケージを Cask で管理している
- depends-on のオプションで URI を指定している（特に Github の）
- Dependency で始まる謎のエラーが発生して処理が止まる

# 現象

`cask install` あるいは `cask update` を発行すると，次のようなエラーが表示されて処理が止まってしまう．

```shell-session:error
Dependency moom failed to install: Command ’(env LC_ALL=C
git remote show -n origin)’ exited with non-zero status 128:
fatal: Not a git repository (or any of the parent directories): .git
```

Dependency の後ろがインストールが失敗するパッケージ名で， Cask ファイルに次のように記載されている（一例）．

```text:Cask
(depends-on "moom" :git "https://github.com/takaxp/moom.git")
```

これは MELPA等のリポジトリに登録されていないパッケージを URIを直接指定してインストールするための設定です．

（余談）最近 MELPA から除外された yatex を管理するには，次の設定を使います．
（後日談）パッケージオーナー様にご協力いただき，yatex はめでたく MELPA に戻りました．

```text:Cask
(depends-on "yatex" :hg "http://www.yatex.org/hgrepos/yatex")
```

# 対策

`temporary-file-directory` の値を確認して，**Cask用の一時フォルダを削除する**．

## 手順

（留意点）以下は自己責任で実施してください．著者は一切の責任を負いません．

1. Emacs を起動して `temporary-file-directory` の値を確認する
  - 例：/var/folders/dj/hk----------g28--v5f----------/T/
2. 当該ディレクトリに移動して `cask` ディレクトリを特定する
  - 例：./T/cask のはずです．
3. 特定したcaskディレクトリを削除する（それ以外のディレクトリには触れないこと）


# おわりに

この問題は，「`~/.emacs.d/.cask` 以下に置かれるファイル群を削除しても意味がない」のが落とし穴です．上に示した場所にあるファイル群を削除することで読者の問題が解決することをお祈り申し上げます．

繰り返しますが（他のプログラムが使用しているであろう）Caskに関係ない一時フォルダには触らないようにしてください．
PythonでgRPCためしてみた

Macに以下をインストール

```
$ brew install protobuf
$ pip install grpcio-tools
```

protoファイルを用意する

``` hoge.proto
syntax = "proto3";

package gateway;

message ReplyRequest {
    string message = 1;
}

message ReplyResponse {
    string message = 1;
}

service AVRGateway {
    rpc Reply (ReplyRequest) returns (ReplyResponse) {}
}
```

generateするためにprotocの設定をファイルとして書く

``` codegen.py
from grpc.tools import protoc


protoc.main(
    (
        '',
        '-I.',
        '--python_out=.',
        '--grpc_python_out=.',
        './hoge.proto',
    )
)

```

上で作った`codegen.py`を実行します。

```
$ python ./codegen.py
```

server用のpyファイルを作成します

``` grpc_server.py
from concurrent import futures
import time

import grpc

from hoge_pb2 import ReplyResponse
from hoge_pb2_grpc import AVRGatewayServicer
from hoge_pb2_grpc import add_AVRGatewayServicer_to_server

_ONE_DAY_IN_SECONDS = 60 * 60 * 24


class RouteGuideServicer(AVRGatewayServicer):
    def Reply(self, request, context):
        print('reply!')
        return ReplyResponse(message='ほげ')


def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    add_AVRGatewayServicer_to_server(
            RouteGuideServicer(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)


if __name__ == '__main__':
    serve()
```

client側のpyファイルを作成します

``` stub.py
from __future__ import print_function
import grpc
import hoge_pb2
import hoge_pb2_grpc


def run():
    channel = grpc.insecure_channel('localhost:50051')
    stub = hoge_pb2_grpc.AVRGatewayStub(channel)
    response = stub.Reply(hoge_pb2.ReplyRequest(message='hoge'))
    print("Greeter client received: " + response.message)


if __name__ == '__main__':
    run()
```

serverを実行後clientも実行しましょ

https://blog.fenrir-inc.com/jp/2016/10/grpc-go.html
Windowsのnpm installでfsevents系のパーミッションエラー

`npm install`時にパーミッション系のエラーが出たら`npm cache clear`しろというエントリーが多いのでしばらくはまってしまいました。このパターンは`npm cache clear`では治りません。同じエラーではまってる人の助けになればと思い書きます。

fsevents系で`npm cache clear`で治らなかった場合はこれでうまくいくと思います。

結論からいうとnpmのバージョンを`5.0.3`にしてください。

```
npm install -g npm@5.0.3
```

この辺で見つけました。
https://github.com/npm/npm/issues/17671#issuecomment-317879697


色々してるうちに自分の出したエラーがなくなったので上記のページのエラーを貼っておきます。

```
npm ERR! path C:\Users\ltheisen\git\caasd-event-analyzer-parent\event-analyzer-web2\node_modules\fsevents\node_modules\dashdash\node_modules
npm ERR! code EPERM
npm ERR! errno -4048
npm ERR! syscall scandir
npm ERR! Error: EPERM: operation not permitted, scandir 'C:\Users\ltheisen\git\caasd-event-analyzer-parent\event-analyzer-web2\node_modules\fsevents\node_modules\dashdash\node
'
npm ERR!  { Error: EPERM: operation not permitted, scandir 'C:\Users\ltheisen\git\caasd-event-analyzer-parent\event-analyzer-web2\node_modules\fsevents\node_modules\dashdash\n
les'
npm ERR!   stack: 'Error: EPERM: operation not permitted, scandir \'C:\\Users\\ltheisen\\git\\caasd-event-analyzer-parent\\event-analyzer-web2\\node_modules\\fsevents\\node_mo
ashdash\\node_modules\'',
npm ERR!   errno: -4048,
npm ERR!   code: 'EPERM',
npm ERR!   syscall: 'scandir',
npm ERR!   path: 'C:\\Users\\ltheisen\\git\\caasd-event-analyzer-parent\\event-analyzer-web2\\node_modules\\fsevents\\node_modules\\dashdash\\node_modules' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\ltheisen\AppData\Roaming\npm-cache\_logs\2017-07-25T21_09_00_506Z-debug.log
```

[fsevents](https://www.npmjs.com/package/fsevents)はMACのネイティブなAPIにアクセスするためのnpmモジュールのようですね。詳しくは調べてませんがその辺が原因で失敗するようです。

fseventsを自分で使ってなくてもインストールしたモジュールが使ってると出るようです。
Rails + Ajax で Vue.js のバインディングを利用する

# やりたかったこと
- JavaScriptやjqueryのDOM操作を利用せずに画面上のテキストを更新させる
- Vue.jsのバインディングがRailsのAjaxから利用できるか確認する

# 参考サイト
[宣言的レンダリング \- Vue\.js](https://jp.vuejs.org/v2/guide/index.html#宣言的レンダリング)

# 準備

`sample/index`ページを用意する。

```shell-session
$ rails g controller sample index
```

# 実装

## Config

`sample/index`ページでPOSTも受けられるようにルーティングを追加する。

```ruby:config/routes.rb
  get  'sample/index'
  post 'sample/index' # 追記
```

## Controller

リクエストがPOSTならインスタンス変数`@now`に現在時刻を格納させる。

```ruby:app/controllers/sample_controller.rb
class SampleController < ApplicationController
  def index

    if request.request_method == 'POST'
      require "date"
      @now = Time.now.strftime("%H時 %M分 %S秒")
    end

  end
end
```

## View

Vue.jsのバインディングを利用して、JavaScript内で変数`app.message`に値が代入されると画面上のテキスト(`id=app`内の`{{message}}`)が更新されるようにする。

```html+erb:app/views/sample/index.js.erb
<!-- HTML -->

<div id="app">
  <p>{{ message }}</p>
</div>

<%= button_to "時刻を更新" , sample_index_path ,remote: true %>

<!-- JavaScript -->

<script src="https://unpkg.com/vue"></script>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            message: '初期値'
        }
    })
</script>
```

```js:app/views/sample/index.js.erb
app.message = "いまは <%= @now %>です。";
```

# 動作

ボタンをクリックすると変数`app.message`にテキストが代入されて画面上のテキストが更新される。

![vuejs.gif](https://qiita-image-store.s3.amazonaws.com/0/141934/13c1c5ce-fde7-ba6e-7115-c4156f8f9488.gif)
全文検索システムを立ち上げたくなったのでFess環境を構築(1)

WebサイトやECサイトが複数動いていると、1つの画面からまとめて横断検索したいと要望がでてきます。かつては、Google Site Searchがありましたが、2018年4月1日で終了です。Google Site Searchは有料でしたが広告なしでした。無料のGoogle カスタム検索エンジンは無料ですが広告が表示されます。

そこで、検索界隈でちらほら聞く「Fess」を使ってみます。5分で作れる全文検索システムと謳っており、検証目的に1～2週間程度に期間を区切って運用してみることにしました。

# 運用環境：IBM Bluemix IaaS
旧SoftLayer、現在のBluemix IaaS 上に、下記構成の仮想サーバーを用意します。普段、AWSやAzure、IDCFクラウド環境などを使いますが、Bluemixにはアウトバウンド通信の無料枠があるので長期運用になるとコスト面で有利かもしれません。
また、本番運用ではElasticsearchを別途用意する必要があり、BluemixにCompose for Elasticsearchがあるので、請求書が１つにまとめられて会社の経理を通しやすいという目論見もあります。

- ロケーション(データセンター)：San Jose 3 --> 安くて日本からの接続がしやすい。
- コンピューティング・インスタンス：2 × 2.0GHz --> 2コアという意味です。
- RAM：4GB --> ElasticSearchを別途インストールするかもしれないので、4GB以上必要。
- オペレーティング・システム：Ubuntu Linux 16.04 LTS Xenial Xerus Minimal Install (64 bit)
- 1番目のディスク：25GB


オーダーし、仮想サーバーが起動するとパブリックIPが1つ割り当てられていますので、PuttyやTera Termなどを使って、SSH接続します。

# Fessのインストール
## 仮想サーバーの初期設定
まず、UFWを用いてファイアウォールを設定します。UFWは、Ubuntuに付属するソフトウェアファイアウォールで非常に簡単に使用できます。

```
SSH接続用のポートを開放します。
# ufw allow 22/tcp

8080は、Fessで使うポートです。
# ufw allow 8080

ログを取得する設定も実行しましょう。
# ufw logging low

Bluemix IaaSのモニタリングツール用のポート開放
# ufw allow from 10.0.0.0/8 to any port 48000:48020 proto tcp

ファイアウォールを有効化します。
# ufw enable
```
次に、既存のソフトウェアを更新するとともに、サーバーの時刻表示を日本時間に変更します。ついでにJavaも入れましょう。

```
# apt-get update -y && apt-get upgrade -y
# apt-get install wget unzip sysv-rc-conf apache2 -y
# timedatectl set-timezone Asia/Tokyo
# add-apt-repository ppa:webupd8team/java -y
# apt-get update -y
# apt-get install oracle-java8-installer -y
# update-alternatives --config java
# nano /etc/environment

	JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre/bin/java" を追記
	Ctrl+xキーを押し、yキーで保存

# source /etc/environment
# reboot
```

サーバーを再起動し、SSH接続し直します。次は、Fess本体をインストールし、自動起動するシェルスクリプトをセットします。

## Fessのインストールとシェルスクリプトの作成
仮想サーバーの初期設定が終わりましたので、本題に入ります。
先ず、Fessの最新版のソースコードのダウンロードURLを確認します。Zip版を使用します。ここでは、11.3.1を使用しています。
https://github.com/codelibs/fess/releases

```
# cd /usr/local/src/
# wget https://github.com/codelibs/fess/releases/download/fess-11.3.1/fess-11.3.1.zip
# unzip fess-11.3.1.zip
# cd /
# nano fess_start.sh

	#!/bin/sh
	cd /usr/local/src/fess-11.3.1/bin/
	nohup ./fess &
	ps $!
	Ctrl+xキーを押し、yキーで保存

# chmod a+x fess_start.sh
# nano /etc/rc.local

	exit0の前に、./fess_start.sh を追記
	Ctrl+xキーを押し、yキーで保存
	
# reboot
```

Fessを終了する場合、Fessのプロセスを終了する必要があります。Fessのプロセス番号を知るには、SSH接続し、下記を実行します。

```
# ps aux | grep fess
```


サーバーが再起動され、しばらく待った後、Bluemix IaaSの管理画面に表示されている仮想サーバーのパブリックIPをもとに、http://パブリックIP:8080 にアクセスします。Fessの画面が表示されるはずです。Elasticsearchを用意、連携していないため、開発モードとして起動しています。パブリックIPではなくFQDNを使用する場合は、DNSの方を設定します。

![fess_start.PNG](https://qiita-image-store.s3.amazonaws.com/0/41414/6c891721-c6dc-3340-9e2a-c7b13846c941.png)


管理画面は、画面右上の「ログイン」をクリックし、ユーザー名とパスワードを入力します。初期設定でともにadminです。

# まとめ
仮想サーバーの用意含めて実質30分くらいで用意できました。余裕があれば、不正アクセスを防ぐ「Fail2ban」を追加すれば総当たり攻撃対策になります。Fessの初期設定方法は、[公式ドキュメント](http://fess.codelibs.org/ja/)を見て作業します。
【WordPress】静的ページを生成するプラグイン3つの長所・短所

# チーム『WordPressの静的ページ化』

チームメンバーたちを紹介しつつ、特徴を書きます。

- [ ] StaticPress
- [ ] WP Static HTML Output
- [ ] Simply Static

## StaticPress（検証済みバージョン: 4.5.9）
 - WordPressのどれをHTMLとして生成するかを選択できない。  
　**└** 「投稿部分だけをHTMLとして吐き出したい」という要望は叶いません。




プラグインの詳細は以下を。
▼公式サイト(プラグインをDLできるページではありません)
**[StaticPress](http://ja.staticpress.net/)**



## WP Static HTML Output（検証済みバージョン: 4.7.5）
 - スラッグに日本語が使用できない。
 - 生成後のファイルをFTPで自動転送可能

プラグインの詳細は以下を。
▼プラグインページ
**[WP Static HTML Output](https://ja.wordpress.org/plugins/static-html-output-plugin/)**

## Simply Static（検証済みバージョン: 4.7.5）
 - zipでダウンロードするか特定のディレクトリに出力するか選択可能
 - 生成したファイルを自動的にFTPで転送することは不可能
 - パーマリンク設定をこのプラグイン用に行なわないといけない

プラグインの詳細は以下を。
▼プラグインページ
**[Simply Static](https://ja.wordpress.org/plugins/simply-static/)**


# どいつもこいつもドキュメントが少なすぎ問題
英語のドキュメントはさすがに充実してるだろと思ったら、ほとんどない。
※FTPでのテストをおこなったら追記します。

# 動作環境
WordPress 4.8.1
PHP 5.3
CentOS 6.9
[Rails, devise, RSpec] テストでログインする

[ここ](http://www.rubydoc.info/github/plataformatec/devise/Devise/Test)に書いてある。
feature spec でも使用できた。

```rb
require 'rails_helper'

RSpec.feature '...', type: :feature do
  include Devise::Test::IntegrationHelpers

  given(:current_user) { create :user }

  before do
    sign_in current_user
  end

  ...
end
```

## 便利かもしれない使い方

`spec/rails_helper.rb` の

```rb
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
```

のコメントアウトを外して、

```rb:spec/support/sign_in.rb
shared_examples :sign_in do
  include Devise::Test::IntegrationHelpers

  let(:current_user) { create :user }

  before do
    sign_in current_user
  end
end
```

ってファイルを追加すると、

```rb
require 'rails_helper'

RSpec.feature '...', type: :feature do
  context 'ログイン後' do
    include_examples :sign_in

    scenario '...' do
      current_user # ログイン済みのユーザー
    end
  end
end
```

こんな感じに使える
LD_LIBRARY_PATHに追加できない場合の回避策

共有ライブラリ検索パスとして追加したいんだけど，権限がない場合の回避策です．

### やりたいこと

```bash
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
```

として，そこに入れているファイルを読み込みたい．

### 回避策

"/home/username/usr/lib/XXXX.so"があるとして，pythonファイルで

```python
import ctypes
ctypes.cdll.LoadLibrary('/home/username/usr/lib/XXXX.so')
```

として無理やり一回読んどけば，ライブラリでの読み込み時でも使いまわされるようになるので，動くようになります．

### 例(CaboChaを読みたい場合)

```python
import CaboCha
```

をやろうとすると，"libcabocha.so.5"がないよとかで怒られる場合は，

```
import ctypes
ctypes.cdll.LoadLibrary('/home/username/usr/lib/libcabocha.so.5')
import CaboCha
```

で無事動きます．
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第ニ章 コミニュケーションと言語の使い方7

# 図
議論する際に図を用いるのは効果的です。
その際に用いいられるのは大方クラス図（相互作用図はあまりつかったことがないかも・・・)。

問題となるのは、

> モデルや設計の全体を伝えるのに、UMLを使うことを強いられていると人々が感じたときである。(第一部 第二章より)

・・・つまり、詳しく図を書きすぎる。全体を詳細に表現しようとする。実装の詳細を表現しようとする。

誰しも(!?)エクセルの重大重厚な設計図を見たこと、作ったこと、経験したことがあるとがあると思います。それと似たり寄ったりのものを一生懸命作っても作業量に見合った効果は得られないし、それを元に議論をすることはもう、設計書の読み合わせすることでしかなく、深いモデルにたどり着けるとは到底思えません。

> 図はコミュニケーションと説明のための手段(第一部 第二章より)

コミュニケーションが成り立つ程度の図で充分なので、重要な部分が表現された簡略化されたものでよいということですね。

個人的には議論に関連したクラス名とその関連のみのクラス図。それのみで大方議論になります。
ときに、ステートマシン図を使ったりもしますが、それも詳細ではなく、簡略的に書いたものでホワイトボードとかに書きながら議論します。

また、簡略された図なら、議論の中でモデルの変更や実験がしたくなった場合でも簡単に図を修正することができます。

モデルの概念的な意味やオブジェクトが何をするかなど図が示していない箇所については、会話がその役割を果たしてくれます。

記録が必要になった場合は、ホワイトボードに書かれた図を写真にとってWikiなどに上げて完了です。

設計の詳細はコードで表現します。
> 設計に関する本質的な詳細は、コードにおいてとらえられる(第一部 第二章より)

あとは以下の重要すぎる言葉。。。
> モデルは図ではない
> 図の目的は、モデルについてコミュニケーションし、説明するのを助けることにある。(第一部 第二章より)

UMLはモデルではないということですね。

図と会話とコードの特性をきちんと理解して有効に活用する！
アクセスログの直近数分の平均レスポンス秒数を取るためのワンライナー

#概要
nginxやapacheでアクセスログから直近数分間の平均レスポンス秒数を取るためのワンライナーです。ちゃんとした分析基盤があれば不要なのですが、サクッと出したり定点観測したいときに活用ください。

#注意事項
簡単な解析スクリプトのため、ログを全部走査します。ログファイルが巨大な場合は適宜分割するか、catしている部分をtail -nXXXで行指定して出す等してください。ログのサイズによっては重くなる可能性があるので、負荷をかけても大丈夫な環境で試してください。

#ワンライナー本体と集計ログ

- nginxのアクセスログから現在から5分以内の平均アクセス秒数を取得

```
checkdate=`date -d '5 minutes ago' '+%d %b %Y %H:%M:%S +0900'`; cat /var/log/nginx/access.log | sed -r "s/^.*\[(.*)\](.*)$/\1\2/" | sed -e 's#/# #g' -e 's/:/ /' |awk -F - '"'"$checkdate"'" < $1 ' | awk '{sum += $NF; count++}; END{print (sum/count)}'
```

- ログフォーマット

```
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" $request_time';
```

- 実際のログのサンプル

```
111.222.333.444 - - [06/Sep/2017:18:19:08 +0900] "GET /test/testApi HTTP/1.1" 200 3942 "Something referrer" "Something user agent" "-" 0.025
111.222.333.444 - - [06/Sep/2017:18:19:08 +0900] "GET /test/testApi HTTP/1.1" 200 3942 "Something referrer" "Something user agent" "-" 0.035
111.222.333.444 - - [06/Sep/2017:18:19:08 +0900] "GET /test/testApi HTTP/1.1" 200 3942 "Something referrer" "Something user agent" "-" 0.045
```

#解説

```
checkdate=`date -d '5 minutes ago' '+%d %b %Y %H:%M:%S +0900'`;
```
- あとで利用するため、フォーマット済みの日時を変数に入れておきます。

```
cat /var/log/nginx/access.log
```
- ログを出力します。全内容読み取るので保険をかけるなら tail /var/log/nginx/access.log -n10000（nのあとは適度に大きい数）でも可

```
| sed -r "s/^.*\[(.*)\](.*)$/\1\2/"
```
- []をなくして、[]以降の文字列に変換

```
| sed -e 's#/# #g' -e 's/:/ /'
```
- 日付をawkで扱えるようにフォーマット変換 "06/Sep/2017:18:19:08 +0900"が"6 Sep 2017 18:19:08 +0900"になる。

```
| awk -F - '"'"$checkdate"'" < $1 ' 
```
- 指定日時以降のものを取得。今回はやってませんが、期間指定もできます。

```
| awk '{sum += $NF; count++}; END{print (sum/count)}'
```
- 合計値と件数を取得集計、計算して出力。apacheの場合はマイクロ秒なので、1000000で割ってあげるとわかりやすくなります。

#【応用】シェルにして、zabbixで観測する。

間に合わせですが、以下のようにファイルと取得する分数を指定して取得するシェルを組めば、定点観測できます。1分、5分、15分の値をとってロードアベレージのように遷移をみるとかできます。

##シェル作成
```
mkdir -p /etc/zabbix/script/
touch /etc/zabbix/script/get_nginx_average_response.sh 
chmod 755 /etc/zabbix/script/get_nginx_average_response.sh 
vim /etc/zabbix/script/get_nginx_average_response.sh 
```

```/etc/zabbix/script/get_nginx_average_response.sh 
#!/bin/sh

checkdate=`date -d $1' minutes ago' '+%d %b %Y %H:%M:%S +0900'`;
cat $2 | sed -r "s/^.*\[(.*)\](.*)$/\1\2/" | sed -e 's#/# #g' -e 's/:/ /' |awk -F - '"'"$checkdate"'" < $1 ' | awk '{sum += $NF; count++}; END{print (sum/count)}'
```

##agent設定追加、再起動
```
vim /etc/zabbix/zabbix_agentd.conf
```

以下を最後尾に追記

```/etc/zabbix/zabbix_agentd.conf
UserParameter=nginxresponseavg[*],bash /etc/zabbix/script/get_nginx_average_response.sh \$1 \$2
```

エージェント再起動

```
service zabbix-agent restart
```

##zabbixの設定
上記が正しく設定されていれば、以下のキーでデータが取れるはずです。

```
nginxresponseavg[5, /var/log/nginx/access.log]
```
Nginx(HTTPS)でSubversion(HTTP/Apache)をリバースプロキシする場合に日本語ファイル名のmoveが失敗するとしたら 【Nginxの2重URLエンコーディング】

NginxでHTTPSを終端させて、裏のSubversionにリバースプロキシしていた時、一見うまくいったように見えたけど、日本語ファイル名を`svn move`したら失敗していたのをFixしたのでメモ。

## TL;DR

タイトルのケースの場合、 Apacheに渡される `Destination` ヘッダが `https://` で始まってしまうのを `http://` で始まるように修正すれば直ると言われていますが、[それをするはずの巷の `$fixed_destination` 対処](http://mailman.nginx.org/pipermail/nginx/2007-January/000504.html) は `$1` 部分がURLエンコードされていようが、Nginxが更にURLエンコードしてしまう問題(`%XX` => `%25XX`)が出る可能性があります。([`nginx:1.13.3`](https://hub.docker.com/_/nginx/) で確認済)

エンコードされていない `$1` は、 `<?var>` 形式の名前付きキャプチャ機能を使えば取得することができます。

```nginx
set $fixed_destination $http_destination;

if ( $fixed_destination ~ ^https(?<myurl>.*)$ ) {
	set $fixed_destination "http$myurl";
}
proxy_set_header Destination $fixed_destination;
```

上記を使えば日本語ファイル名の移動でも問題になりません。

英語のファイル名の場合はURLエンコードされずにURL上で表現可能なので、もともと問題が顕在化しません。
【Access VBA覚書】SQLステートメント実行の際にパラメータを入力できるようにする #若葉マーク

####VBAでSQLステートメントを実行する際、パラメータを入力できるようにする


```
Dim SQL_REPORT As string

 SQL_REPORT = "UDATE テーブル名 SET テーブル名.フィールド名 = [入力してください] WHERE 条件 ;"
   DoCmd.RunSQL SQL_REPORT

```

クエリーと同じですが、VBAのSQLステートメントでも可能でした。
Rails Stripe サブスクリプション決済実装 初期設定をしてAPIを使える状態にする

# 概要
Stripeでのサブスクリプション決済実装をRailsで行う場合、
公式で提供されているgemを使用することになると思います。

実装に当たって
```Stripe::Plan.create()```
```Stripe::Customer.create()```
のようなAPIメソッドを使用していくことになるのですが、
今回はAPIを使える状態にするまでの初期設定についてまとめました。

# 事前準備

## いつもの

Gemfileに
```gem 'stripe'```
を追加して
```bundle install```
しておきましょう。

## 確認
```rails c```でStripeメソッドが使えるか試しておきましょう。
```Stripe::Customer.list```は登録されている顧客の情報リストを取得するメソッドです。

```
irb(main):001:0> Stripe::Customer.list
Stripe::AuthenticationError: No API key provided. Set your API key using "Stripe.api_key = <API-KEY>". You can generate API keys from the Stripe web interface. See https://stripe.com/api for details, or email support@stripe.com if you have any questions.
```
当たり前ですが、エラーとなります。


# APIを使用するのに必要なアカウント情報
必要な情報は

- Publishable key
- Secret key

といった2つのkeyです。

Stripe管理画面の以下の箇所より取得できます。（色々白抜きしてます）
<img width="1390" alt="スクリーンショット 2017-09-06 17.30.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/e1922707-ab25-ab10-23d4-8bdbced99d84.png">


開発フェーズの場合、Test用のkeyを使用するようにしましょう。

# 設定記述
stripe-rubyのREADMEにはこう書かれています。
https://github.com/stripe/stripe-ruby#usage

```rb
require "stripe"
Stripe.api_key = "sk_test_..."

# list charges
Stripe::Charge.list()

# retrieve single charge
Stripe::Charge.retrieve(
  "ch_18atAXCdGbJFKhCuBAa4532Z",
)
```

もちろんこれでもAPIは使用できます。
しかし、必要な箇所で毎回

```rb
require "stripe"
Stripe.api_key = "sk_test_..."
```

と書くのは効率がいいとは言えませんし、セキュリティ的にもアウトです。

なので、今回は以下の2つのファイルにkey情報を記述します。

- config/secrets.yml
- config/initializers/stripe.rb

secrets.ymlについては以下の記事を参照してください。
[Rails 5.1のencrypted secretsの運用について考える](http://qiita.com/kikunantoka/items/dd22cf51071b93ba5b62)

## config/secrets.yml

stripe_publishable_keyとstripe_secret_keyを定義します。
環境に合わせてdevelopment、test、productionは切り替えてください。

```yaml:config/secrets.yml
development:
  # stripe
  stripe_publishable_key: pk_test_********************
  stripe_secret_key: sk_test_********************

```

## config/initializers/stripe.rb

デプロイ時にStripeの定義を読み込みます。

```rb:config/initializers/stripe.rb
Rails.configuration.stripe = {
  publishable_key: Rails.application.secrets.stripe_publishable_key,
  secret_key: Rails.application.secrets.stripe_secret_key
}

Stripe.api_key = Rails.application.secrets.stripe_secret_key

```

# 準備完了
以上でAPIを使用する準備は完了となります。
簡単ですね！！

## 確認
[先ほど](http://qiita.com/ss_watanabe/items/8c5ec353a842d5d30e77#%E7%A2%BA%E8%AA%8D)と同じメソッドを使って確認します。
（サーバー再起動してくださいね）

```
irb(main):001:0> Stripe::Customer.list
=> #<Stripe::ListObject:*****> JSON: {
  "object": "list",
  "data": [....],
  "has_more": true,
  "url": "/v1/customers"
}

```

正常なレスポンスが返ってきました。
（Customerがemptyの場合は見え方が違うかも...）


# 参考

- Stripe API Reference<br>
https://stripe.com/docs/api
- 日本正式リリースしたStripeを使ってサブスクリプション型決済システムを実装する
http://qiita.com/tady/items/7617e62b2a5402ebd0fb
- StripeがRailsで動く仕組み<br>
http://qiita.com/100010/items/c09fb08dd555b32a2652
- Rails 5.1のencrypted secretsの運用について考える<br>http://qiita.com/kikunantoka/items/dd22cf51071b93ba5b62
AWSで「No space left on device」が出たときの対応

# 現象

CapistranoでRailsアプリケーションをAWSのEC2インスタンスにデプロイする際に、以下のようなエラーが出てデプロイに失敗しました。

```
Tasks: TOP => deploy:check => git:check => git:wrapper
(See full trace by running task with --trace)
The deploy has failed with an error: scp: /tmp/production.sh: No space left on device
```

インスタンスにログインすると、以下のように同様のエラーメッセージが表示されました。

```
/home/user/.rbenv/libexec/rbenv-init: 行 131: ヒアドキュメント用一時ファイルを作成できません: デバイスに空き領域がありません
```

# 問題と対応

ディスク容量を確認します。

```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         488M   56K  488M    1% /dev
tmpfs            498M     0  498M    0% /dev/shm
/dev/xvda1       7.8G  7.7G     0  100% /
```

ディスク容量がいっぱいだったのが原因だったみたいです。
そこで不要なlogファイル等を消してみたのですが、改善されず。。

結局、インスタンスを再起動することで解決出来ました。
以下のようになりました。

```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         488M   56K  488M    1% /dev
tmpfs            498M     0  498M    0% /dev/shm
/dev/xvda1       7.8G  3.0G  4.8G   38% /
```

# 得られた知見メモ

## 解決の一般論

[No space left on device – running out of Inodes](https://www.ivankuznetsov.com/2010/02/no-space-left-on-device-running-out-of-inodes.html)

対応手順としてまとめてあって、調べた中で特に有用な記事だと思いました。
2010年の古めの記事ですが、thanksコメントは最近されたものも多くよさげ。

今回は、容量がいっぱいだったことが原因でしたが、そうでなくても同じエラーメッセージが出ることがあるみたいです。

## 今回の解決法について

[EC2 instance on Amazon and I am greeted with “No space left on the disk”](https://stackoverflow.com/questions/6151695/ec2-instance-on-amazon-and-i-am-greeted-with-no-space-left-on-the-disk)

容量いっぱいなら余計なファイル消せばいいと思って消しても改善されなくて、調べるとインスタンスを再起動したら良くなるという記事をちらほら見つけて、やってみたら解決しました。

# 分からないこと

なぜ、今回のような現象が起きたのか。単純にディスク容量がいっぱいになってエラーが出たのなら、大きなログファイルを消した段階でエラーが解決するはずだが、、

もし分かる方がいればご教示下さい。
Excelから業務アプリを作成できる【Forguncy】


Excelを編集しながら、Webベースの業務アプリが作成できるというForguncyというサービスを見つけたので、紹介したいと思います。

# Forguncyとは
日本におけるExcelユーザーは、ものすごく多いです。
Excelさえ扱えれば事務作業は大体こなせるかと思います。
そんなExcelを扱えるけど、システム構築のスキルはないという業務担当者が簡単にシステムを構築できるようにしたのが、このForguncyです。

Forguncyの名前の由来は、「方眼紙」からきているそうです。
「Excel方眼紙」のマス目から、Excelでフォームを作るのと同じ感覚で、プログラミングの知識がなくてもWebアプリケーションを作成できるようにと開発されたそうです。

実際に業務に携わっている担当者(Excelを扱える人)が、
自分の好きなように業務アプリを作成できるというのが大きな強みだと思います。

![excel_to_forguncy.png](https://qiita-image-store.s3.amazonaws.com/0/150066/62538187-394b-8a7c-ee04-1ee6fe655696.png)

# Excelライクなインタフェース

Forguncy Builderというツールを使って、Excelで帳簿を作成するように、画面設計が可能です。
![feature_1_0.png](https://qiita-image-store.s3.amazonaws.com/0/150066/7e58b5e8-470e-a160-0060-921e8aab9a61.png)

セルの書式設定、数式、Excel関数、データの入力規則、グラフといったExcelの機能がそのまま使え、
画面の設計もExcelを編集する感覚で簡単にできるようです。
Forguncyであらかじめ用意されているテンプレートを用いることも可能です。

![template_0.png](https://qiita-image-store.s3.amazonaws.com/0/150066/1556d9e5-8f59-7776-6b6a-baf050f4d057.png)

# ノンプログラミングで業務アプリを作成
Excelさえ扱えれば、プログラミング経験のない方でも、簡単に業務アプリを作成することができるそうです。
ボタンをクリックした時に動作などをGUIで指定できるようです。
Excelでおなじみの関数(SUM, VLOOKUPなど)も使用可能であり、Webアプリ化した後も、条件による抽出、集計作業も簡単に行えます。

# そのほかにできること
- 承認ワークフロー
- Excelファイル、PDF出力
- Excelファイル取り込み
- メール送信
- 外部データベースとの連携（これによって、既存システムとの連携も可能）

これだけ見ると、業務アプリに必要な機能はほぼ備わっていると思います。
一般的な業務アプリであれば、Forguncyで賄えるようです。

# 参考サイト
https://www.forguncy.com/
http://www.grapecity.com/tools/aboutus/newsreleasedetail/186
スマートフォンのワイヤレス充電が普及する日は来る？

#そもそもワイヤレス充電って？
　このテーマのきっかけが、「電気を供給するのにケーブルを使わないということが不思議で実感も湧かなかった」からなのですが……
　現在、Android端末のみですが、「置くだけで（ケーブル無しに）充電ができる」充電器が販売されております。

#どうやって充電してるのですか？
　ワイヤレス充電と一口に言っても、「電磁誘導方式」、「電波受信方式」、「共鳴方式」と種類があります。
　現在実用化している充電器は「電磁誘導方式」と「共鳴方式」で、レシーバーと充電器にコイルがあり、コイル同士で電磁誘導あるいは共振をさせることでレシーバー側のコイルで電流を発生させ、それを送電するという仕組みです。

#ワイヤレス充電のメリットとは？
　ケーブル要らずで充電ができるというのは、パッと想像すると画期的なイメージですが、少し考えると
　ワイヤレスである必要性ってあるのかという疑問が浮かびます。
　そこで、改めてワイヤレス充電のメリット/デメリットを考えてみました。

　◇ケーブルが必要ない
　　充電器があればケーブルを持ち合わせる必要が無い。なので会社や施設等に充電器があればそのまま充電ができるというメリットがあります。

　今度はデメリットです。

　◆（電池に優しいか否かはありますが）充電しながらの使用には不向き
　　充電しつつ手に持って使用……というのはできない。
　◆ワイヤレス充電非対応の機種がある
　　iPhoneは言わずもがな。（iPhone8ではワイヤレス充電ができるようになるとのことですが、独自の規格で出すとの噂もあり、もしかするとiPhone8は専用の充電器でしか充電不可能かもしれません）
　　Androidでは、別途レシーバーを装着することでワイヤレス充電に対応が可能です。
　　レシーバーはスマホケース型や厚さ1mmほどのシートのようなものがあります。
　　ただ、レシーバーにケーブルが付いており、それをコネクタに差すという構造であり、レシーバーで生み出した電流をそのケーブルで送電する仕組みなので、ワイヤレス充電と呼んでいいのかどうか、首をかしげる部分があります。（それであれば最初から有線充電器を差した方が……）

　機種を選ばず、コネクタ部分を塞がないのであれば利便性があると思いますが、現状はそうではないようです。
　
#部屋に入るだけで、どこでも充電してくれる？
　まだ実用化に至っておりませんが、電流を電磁波に変換して送信、受信側で再度電流に変換して充電する方法が「電波受信方式」です。
　電波なので送信側から数メートル離れていても、あるいは直線状に障害物があっても物体に反射することで送電を行うことが可能です。
　
　KDDIとOssiaによる電波受信方式の充電システム「Cota」

　その「電波受信方式」を形にしたものが、KDDIの支援会社Ossiaが開発した「Cota」です。
　「Cota」の特徴は、給電用モジュールから10m離れても給電が可能なほか、複数端末を同時に充電することができるそうです。
　加えて、スマホのアプリケーションから充電する端末を管理でき、認証システムを備えるので紐づけされた端末以外は充電しない仕組みになっているとのことです。
　なにより特徴なのは、給電する端末にはICチップの搭載が必要ですが、非常に小型で搭載も難しくないとのことで、機種を選ばずコネクタも塞がない、従来のワイヤレス充電から大きく躍進したものになりそうです。
　一方で課題もあり、現在の通常の充電器に比べ出力電圧が劣り、充電に時間がかかってしまうようです。
　
　アメリカでは実用化が目前のようですが、日本でこの方式が実用化されるには法整備が求められるとのことです。
　現在の電波法には「無線での電気供給」に関する規定がないため、電波法の整備が必要となってきます。
　
#ワイヤレス充電の理想の将来
　「電波受信方式」の充電であればスマホに限らず、電波を受信するアンテナを実装した電化製品であればどんなものでも充電できそうです。
　先は長そうですが、それが家庭、公共施設、ゆくゆくは街中にその仕組みが整えば、日常生活においては電池が要らなくなるかもしれません。






参考：engadget「『スマホを充電不要にする技術』KDDIとOssiaが出展、距離10mでも使える無線充電Cotaをデモ：CES 2016」
　http://japanese.engadget.com/2016/01/08/kddi-ossia-10m-cota-ces-2016/
VueのComponentにObjectを渡したいのに属性値だよ消えるよって怒られる


webpackerを使ってVueJSを書いている中で、
componentへObjectを継承したい場面でぶつかった壁の話。

なんも考えずにやると、

```
// parent.vue
<template>
  <child hoge="hoge">
</template>

<script>
import Child from 'child'

export default {
  components: {
    'child': Child
  },
  data () {
  	return {
  	  hoge: {
        name: 'hoge',
        age: 30
      }
  	}
  }
}
</script>


// child.vue
<template>
  <p v-text="hoge.name"></p>
</template>

<script>
export default {
  props: ['hoge']
}
</script>
```

みたいな感じで、子のコンポーネントのprops値としてオブジェクト渡せるかなーと思ったんですが、
このような書き方だと、子のprops値 `hoge` には、Stringとして`'hoge'` が入ってきてしまいました。

別のやり方を探って

https://012-jp.vuejs.org/guide/components.html#動的な-Props

この辺を見て、親コンポーネントで

```
<child hoge="{{hoge}}">
```

とかやってみると


```
Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of...
```

というようなコンパイルエラーが出てしまいました。


## 解決策

結論をいうと

```
<child :hoge="hoge">
```

これでした。

```
<child :hoge="{{hoge}}">
```

とかやってもうまくいかずで、
http://qiita.com/satetsu888/items/abd67917097ee00d768d
こちらの記事の中で使っていた方法を試したらうまくいきました。

よく見たらエラー文言に書いてある通りなんですが、

`hoge="hoge"` → 通る
`hoge="{{hoge}}"` → 怒られる
`:hoge="{{hoge}}"` → 怒られる

という手順を踏んでしまったのでハマった感じですね。。
検索していてもドンピシャっぽい記事がなくて困ったので書いておきます。
解析入門 1 問題1.1 解答

松坂和夫 解析入門<1>(ISBN: 978-4007304514) の解答です。

## 問題 1.1

### 1
#### 問題
$x$ が有理数、$y$ が無理数ならば、$x+y$ は無理数であることを示せ。

#### 回答
$x+y$ が有理数であると仮定して、$x+y=\frac{q}{p}$ とおく。
$x$ を移項して、$y=\frac{q}{p}-x$。
これは $y$ が無理数であるという前提に反するので、$x+y$ は無理数。

### 2
#### 問題
$x$ が $0$ でない有理数、$y$ が無理数ならば、$xy$ は無理数であることを示せ。

#### 回答
$xy$ が有理数であると仮定して、$xy=\frac{q}{p}$ とおく。
$x$ を移項して、$y=\frac{q}{px}$。
これは $y$ が無理数であるという前提に反するので、$x+y$ は無理数。

### 3
#### 問題
整数 $a$ に対して $a^{2}$ が $3$ の倍数ならば $a$ 自身 $3$ の倍数であることを示せ。このことを用いて $\sqrt{3}$、$\sqrt{6}$ が無理数であることを証明せよ。

#### 回答
$a$ が $3$ の倍数でなければ、$a^{2}$ の素因数に $3$ は含まれない。従って、$a^{2}$ は $3$ の倍数ではない。対偶が証明された。

### 4
#### 問題
$\sqrt{6}$ が無理数であることを用いて、$\sqrt{2}+\sqrt{3}$ が無理数であることを証明せよ。

#### 回答
$\sqrt{2}+\sqrt{3}$ が有理数だと仮定し、$\sqrt{2}+\sqrt{3} = \frac{n}{m}$ とおく。

```math
(\sqrt{2}+\sqrt{3})(\sqrt{2}+\sqrt{3}) \\
= \sqrt{2}^2 + 2\sqrt{2}\sqrt{3} + \sqrt{3}^2 \\
= 5 + 2\sqrt{6} \\
= \frac{n^{2}}{m^{2}} \\
\sqrt{6} = \frac{n^{2}}{2m^{2}} - \frac{5}{2}
```

より、$\sqrt{6}$ が有理数となるが、これは問題の前提と矛盾する。
よって、$\sqrt{2}+\sqrt{3}$ は無理数。

### 5
#### 問題
数直線上に無理数も稠密に存在すること、すなわち、$x \in \mathbb{R}$、$y \in \mathbb{R}$、$x<y$ ならば、$x<z<y$ を満たす無理数 $z$ が存在することを証明せよ。

#### 回答
$x<r_{1}<r_{2}<y$ とおく。($r_{1}$、$r_{2}$ は有理数)
$1<\sqrt{2}<2$ かつ、$\sqrt{2}$ は無理数なので、$z = r_{1}+\frac{\sqrt{2}}{2}(r_{2}-r_{1})$ とおくと $z$ は　$x<z<y$ を満たす無理数。
【R】[dplyr] rename()の中で変数を使う

# dplyr::rename(new = old)の中で変数を使うとき

## もんだい

`dplyr::rename(new=old)`を関数の中などで使う際に、`new`に変数を使いたい場面があります

```r:rename.R
varname <- "new_varname"
df <- iris

df %>% 
  rename(varname = Sepal.Length) %>% 
  colnames()
```
このままだと`varname`が変数("new_varname")ではなく文字列の"varname"として扱われてしまいます

>[1] "varname"      "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species" 


## かいけつさく

特別な代入演算子を使います
[Pass a variable to dplyr "rename" to change columnname](hhttps://community.rstudio.com/t/pass-a-variable-to-dplyr-rename-to-change-columnname/6907/4)

```r:rename.R
varname <- "new_varname"
df <- iris

df %>% 
  rename(!!varname := Sepal.Length) %>% 
  colnames()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143058/917a78a5-4ed1-0ac5-4e19-e071095c2051.png)

# メモ

以前の記事では以下のように書いていたのですが、`rename_() is deprecated. `とのことなので更新いたしました。
><strong>rename_()</strong>を使えば、変更前の変数名に関数を使ってもアクセスできるようです.


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143058/f65cc741-75c0-04b0-8424-175dbc517225.png)
npm install でエラーが発生したら

いちいち原因究明やってられないから全クリア

```
% rm -rf node_modules
% npm cache clean --force
% rm -rf C:\Users\"HOGEHOGE"\AppData\Roaming\npm-cache
% nodenv uninstall "version"
% nodenv install "version"
% nodenv global "version"
% npm install -g npm@latest
```
BeautifulSoupでWindows-31Jに遭遇した場合の対処方法

#Windows-31Jで変なことになる

所謂文字化けで何も読めない場合、単純にdecodeしても無理というときに対処法。

```shell-session
pip install chardet
```


Anacondaなら既に入ってます。
あとは、res.textとかしてたところを直すだけ。


```test.py
res = requests.get(url)
soup = bs4.BeautifulSoup(res.content, 'lxml')
```
laravelコマンドでLaravelの5.5系をインストールする


Laravel5.5が正式にリリースされたので環境を構築してみた。

Composerのcreate-projectコマンドでインストールしてみたら、まだバージョン5.4がインストールされる。

```
$ composer create-project laravel/laravel
```

### laravelコマンドでインストールする
Laravel5.5の公式サイトを参考に以下の手順でインストールする。

Composerでインストーラーを取得する。

```
$ composer global require "laravel/installer"
```

Laravelコマンドをどこからでも使えるようにする。

```
vi ~/.bashrc

##PATHに追加
export PATH="$PATH:$HOME/.composer/vendor/bin/"
```


インストール

```
$ laravel new [プロジェクト名]

Application ready! Build something amazing.

# バージョン確認
$ cd [プロジェクト名]
$ php artisan --version
Laravel Framework 5.5.2
```

無事に5.5系をインストールすることができた。
プッシュ通知設定画面へ遷移させる為の実装

# プッシュ通知設定とは
プッシュ通知設定は、ユーザー通知と呼ばれるローカル通知やプッシュ通知に関連した設定のことです。
iOSでは 設定 > 通知 > アプリ > 通知を許可 から、通知の受信設定の変更を行うことができます(下記)。

<img width="375" alt="IMG_3500.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/143619/2c995acc-ed42-910c-46f8-65adbcdf167c.png">

アプリユーザーに対してプッシュ通知を届けるためには、ユーザーにプッシュ通知受信の許諾を得て、且つその後もこの通知受信設定をONの状態を維持して貰う必要があります。

一度プッシュ通知を受信拒否もしくは設定をOFFにしたユーザーは、自ら設定画面を開いてONに設定変更してくれることはほぼありません(少なくとも僕はほぼやりません)。

そのため、アプリ内で設定状況のON/OFFを取得して、OFFの場合だったらこの設定画面へ遷移させる。という実装を行います。

# できたもの
通常のホーム画面から設定画面へ遷移するまでの操作と、今回の画面遷移の差を比較するため、両方の操作画像をお見せします。

また、この機能については[Github](https://github.com/takuyama29/DeepLinkToPushSetting)でも公開しているので、ぜひ活用してみて下さい。

### ホーム画面から設定画面への遷移

![homeScreen.gif](https://qiita-image-store.s3.amazonaws.com/0/143619/4ca07051-da9e-57c7-43e4-03ed55ba43c2.gif)

### アプリ内から設定画面への遷移
※`Reload`ボタン押下後にLabelのtextが変更されるまで10秒ほどかかります。

![InApp.gif](https://qiita-image-store.s3.amazonaws.com/0/143619/f9aef796-ed94-6fcc-52c5-27542ae92ce7.gif)

両方の比較して分かるように、この設定画面へのディープリンクを設定するのと、そうでないのとではユーザーの手間が大きく異なります。

# 実装

### 通知設定画面へのディープリンク

下記の`{YOUR_BUNDLE_ID}`に自分のプロジェクトのBundle_IDをセットすることで、設定画面へ遷移させることができます。

```
// OSの通知設定画面へ遷移
if let url = URL(string:"App-Prefs:root=NOTIFICATIONS_ID&path={YOUR_BUNDLE_ID}") {
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    } else {
        UIApplication.shared.openURL(url)
    }
}
```

また、`App-Prefs:root=NOTIFICATIONS_ID`は、通知設定画面へ遷移させるスキームですが、それ以外にも**Bluetooth**や**写真とカメラ**などの設定画面へ遷移させることもできます。

スキームに関しては[【iOS10】設定画面に遷移するURLスキームの設定について](http://qiita.com/shnj884/items/1bb1b2b3360a009f154c)に一覧があるので、ぜひ見てみてください。

僕もこちらの記事を参考にさせていただきました。良い記事をありがとうございますm(_ _)m

### 通知設定の取得

通知設定の取得には[getNotificationSettings](https://developer.apple.com/documentation/usernotifications/unusernotificationcenter/1649524-getnotificationsettings)を使用しています。
この処理は[UNUserNotificationCenter](https://developer.apple.com/documentation/usernotifications/unusernotificationcenter)からユーザーの通知設定状態を取得していますが、非同期処理となるのでご注意下さい。

```
// 通知設定状況を取得
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
    
    let targetViewController = vc as! ViewController
    
    switch settings.authorizationStatus {
    case .authorized:
        print("Allow notification")
        targetViewController.settingStatusLabel.text = "Allow notification"
        targetViewController.viewDidLoad()
        
    case .denied:
        print("Denied notification")
        targetViewController.settingStatusLabel.text = "Denied notification"
        
    case .notDetermined:
        print("Not settings")
        targetViewController.settingStatusLabel.text = "Not settings"
    }
}
```

パーミッションが必要な機能を提供しているアプリの場合、このディープリンクを使うことでよりユーザーが使いやすいものに改善できることもあると思うので、もし良ければ活用してみて下さい。
EC2にSSH接続しててすぐに切れちゃってキレちゃった時のメモ

.ssh/configに↓を追加すればOKです。
(スリープさせてしまうと切れてしまいますが。。)

```:.ssh/config
Host magento-dev
  HostName 【ホスト名】
  User 【ユーザー名】
  Port 22
  IdentityFile ~/.ssh/【SSHキー】
  ServerAliveInterval 100 # ←追加
  TCPKeepAlive yes 　　　　　　　　　　　　　　# ←追加
```
[Tips]Redshiftで文字列の末尾を削除する

末尾からn文字分だけ削除した文字列を取得する。

```
-- ２文字削除の場合
SELECT SUBSTRING('abcdef', 1, CHAR_LENGTH('abcdef')-2));
> abcd

-- 3文字削除の場合
SELECT SUBSTRING('abcdef', 1, CHAR_LENGTH('abcdef')-3));
> abc

```
VS Code でEmmetを使ってみる。

#概要
HTMLやCSSのZen Coding　-Emmetがあることは知っていましたが、勝手にVS codeでは出来ないと思い込んでいました。
しかし、普通に対応されていたみたいなので、いろいろと試してみました。

#できること
VS Codeの場合、Emmet記法で書いたああとにtabもしくはEnterで展開してくれます。
HTMLとCSSでそれぞれ書き方があるようです。

##html
たとえば、html:5 と打ち込んでEnterを押すと

```html:TEST1.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```
このように自動展開してくれます。

省略記法は、調べればいくらでも詳しく出てきますが以下の例を実行してみます。
nav>ul#menu>li*3>a

すると、

```html:TEST2.html
<nav>
    <ul id="menu">
        <li><a href=""></a></li>
        <li><a href=""></a></li>
        <li><a href=""></a></li>
    </ul>
</nav>
```
と展開されるので、一気にメニューを作れます。すごい。

##css

CSSでは、見かけた例として以下をやってみます。

w100+h200+m10-0-10-10+tac

しかし、最初の"+"を打ち込んだ時点で、もうEmmet展開できません･･･

w100 [Enter]とすれば、以下のようにwidthの指定は出来ます。

```css:test.css
#test{
    width: 100px;
}
```
widthの場合まだは良いですが、m10-0-10-10の部分に関しては、本来

```css:test2.css
#test2{
    margin: 10px 0 10px 10px;
}
```
となるべきところが、m10 まででしかEmmet展開できないために

```css:test2a.css
#test2a{
    margin: 10px;
}
```
で終了してしまうため、上下左右で指定するには、他の値を打ち直す必要があります。



参考：http://tracpath.com/works/development/emmet-for-web-developers/

#使ってみて

少し訂正したり、カーソルを動かすと、普通にEnter,Tabになってしまう点が使いづらさを感じました。
いろいろ調べてみると、Atomではエディターでは[Ctrl+E] で、構文展開してくれるみたいです。
そのようなショートカットが使えると、より一層使いやすいと感じました。

またいろいろ試したら更新していきます。


#追記

http://qiita.com/bushi/items/82cc7133f809d34c0da1
こちらの記事を参考に設定を変えたら、CSSの記法を途中で止めずtabで出来るようになりました。すごい。
Emmet展開のキーアサインをいじろうと思っていたので、朗報でした。
videoタグで指定した動画の中央揃え

HTML5からサポートされたvideoタグの中央揃え。
`margin:0 auto`や`text-align:center`が効かなくて困ったが、なるほどブロック要素になっていない。
ブロック要素にし、classで指定してあげるとうまくいった。

```hoge.html
<div class="hoge">
<video src="hoge.mp4" controls="controls" poster="fuga.png"></video>
</div>
```

```fuga.css
.hoge{
text-align:center;
}
```
脱レガシー！最新技術キャッチアップ方法

私は今まで、古い手法や技術での保守や保守開発プロジェクトに携わってきました。
今後環境が変わるのを機に、皆の開発がすこしでも楽になるように、最新技術をキャッチアップして展開できるようになりたいと考えています。
そこで、偉い人や技術力の尖った人はどう技術をキャッチアップしているのかを調査・検討しました。

# 幅広く情報収集する
情報源を大きく分けると以下のようになります。

- Twitter
- 情報サイト
- イベント
- フィードリーダー
- キュレーションサービス

## [Twitter](https://twitter.com/)
技術の第一人者をフォローしておく。
[TweetDeck](https://tweetdeck.twitter.com/)で、特定ユーザーのツイートのみをリアルタイムに見れる。

## 情報サイト
情報サイトから効率的に情報を収集するのには、Twitter、フィードリーダー、メールマガジンが使えます。

- [はてぶ - テクノロジ](http://b.hatena.ne.jp/ctop/it)
- [InfoQ](https://www.infoq.com/jp)
> 海外の情報をいち早くキャッチアップできる。開発・設計・データサイエンス・文化＆手法・DevOpsといった分野毎に海外の著名者の記事を閲覧できる。

- [TECHNOLOGY RADAR](https://www.thoughtworks.com/radar)
> 技術、ツール、言語、プラットフォームという4つの領域のトレンドが分かる。 4つの領域のそれぞれにおいて、Adopt、Trial、Assess、Hold の4つの階級が一覧になっている。Adoptの項目は、企業での使用が推奨されることを意味する。Trialの項目は、投資する価値はあるが、リスクの少ないプロジェクトで使用すべきであることを意味する。Assessは、使用方法や、潜在能力を検討し学ぶ価値がある項目のためにある。Holdは、現時点では注目や資源に値しない項目のためにある。
[参考にしたURL](https://www.infoq.com/jp/news/2010/01/ThoughtWorks-Technology-Radar)

- [ITmedia](http://www.itmedia.co.jp/)
- [TechTarget](http://techtarget.itmedia.co.jp/)
- [CodeZine](http://codezine.jp/)   
> 翔泳社が運営するプログラミング系Webマガジン
翔泳社はテクノロジー系の書籍を出版している会社で、本屋のIT関連コーナーに良く積まれている。本屋に積まれている書籍からも今の流れは分かる。


## イベント
- JJUG CCC
> 日本Javaユーザーグループ主催のイベント

- [Dev Love](https://devlove.doorkeeper.jp/)

### イベント系サイト
- [TECH PLAY](https://techplay.jp/)
> 興味あるタグを登録し、気になるイベント情報をキャッチすることが出来る。

- [connpass](https://connpass.com/)
- [Doorkeeper](https://www.doorkeeper.jp/)

## フィードリーダー
- [Feedly](https://feedly.com/)

> イベントや情報のサイトを登録し、欲しい情報をカスタマイズできる。

## キュレーションサービス
- [TechFeed](https://techfeed.io/)

 > テクノロジー系の情報（特にエンジニア向け）を自動的に収集し、1日3回提供してくれる。

---

また、[コチラの記事](http://qiita.com/nesheep5/items/e7196ba496e59bb2aa28)にも情報収集について幅広く纏められており大変参考になります。

# キャッチアップする習慣をつける
上記の情報源から得られる情報量は膨大で、隅々まで調査するのは（私にとっては）不可能です。
モチベーションと体力を維持するためにも、毎日こつこつという気持ちでいます。
今後は、以下のような習慣を付け、キャッチアップしようと思います。

1. 情報源は広く浅くながめる
2. 自分が惹かれる情報をストックしておく
3. 時間のあるときに、ストックした記事を見る = 特定の技術に興味を持つ   
> ストックは[pocket](https://getpocket.com/)がおすすめ。chromeの拡張機能やiOS,Androidアプリがあるので、どんな端末でも共有できます。

4. 興味をもった技術について、ピンポイントに情報源の中から記事を見て学ぶ
5. 情報源となる人物に着目し、その人物の記事・書籍で学びを深くする
6. 興味をもった技術に関するイベントに参加する
typealias + closure を使ってみる Swift3.0

まだ自分でもよく理解できていません。詳しい方教えてください。でも、もしかしたらtypealiasとclosureを使うと（特にこの記事ではtypealias）コードが簡潔っていうか読みやすくなるのかもしれない。





# typealiasを使う

```swift

//関数でパラメータとしての閉包を宣言する
//タイプエイリアスでクロージャ構文タイプを定義します
typealias closure = (Int , Int) -> ()


//クロージャ構文を使用して関数を宣言します。
func myClosureFunction(action: closure) -> () {
    action(2,5)
}


//クロージャを呼び出して関数内でその値を取得します。 ブロック内でAとBの値を得ることができます。
myClosureFunction { (A, B) in
    print(A) //2
    print(B) //5
}
```

typealiasを定義してclosureという型を使えるようにします。closureは二つのInt型の引数を受け取り何も返しません。だから`(Int , Int) -> (Void)`でも良いです。

次、クロージャ構文を使用して関数を宣言します。actionという引数で先ほど宣言した`typealias closure`を指定します。closure型の引数actionを受け取る関数です。closure型の引数actionは二つのInt型の引数を受け取り何も返さない型ですから`action(2,5)`という風にすれば引数actionに二つのInt型の値が渡されます。

最後にクロージャを呼び出して関数内でその値を取得します。 ブロック内でAとBの値を得ることができます。余談ですがクロージャっていうのは即時関数だから、呼び出さなくても実行できるのかな？と思っていたけれど、結局呼び出さなければいけないらしいです。どうしてA, Bという引数名で値が取得できるのかは謎です。



# typealiasを使わない

```swift


//クロージャ構文を使用して関数を宣言します。
func myClosureFunctionNoClosure(actionn: Int, actionnn: Int) -> () {
    print(actionn)
    print(actionnn)
}
myClosureFunctionNoClosure(actionn:2, actionnn:5)
//2
//5
```

上記のtypealiasを使う方のコードをtypealiasを使わないで書くとこんな感じになるんでしょうか。先ほど申し上げたように、どうしてtypealiasを使うとA,Bで受け取れるのか謎です。typealiasを使わない方だとA,Bじゃ受け取れません。この関数は、二つにIntを受け取る引数をとって何も返さない関数です。呼び出すときに引数に二つのIntを私て関数の中で引数の値を受け取ってprintします。クロージャ構文を使用してと書いてありますが、これって単純に関数じゃないかと思うような。。
AndroidStudioの設定リセット（AndroidProjectが扱えないバグ？）

たまにあるんですが、
AndroidStudioで急にAndroidプロジェクトを開けないことがある。

この画面になると私はアウト。
もうNewProjectしようにもAndroidProjectの選択肢もでません。。
![Screen-Shot-2017-09-05-at-22.52.08.png](https://qiita-image-store.s3.amazonaws.com/0/85214/ae7004b3-936e-930c-1260-008844ea827f.png)

どなたか復帰方法がわかる方がいらっしゃればご教授ください。。！

## 対策1: 設定ファイル削除

**AndroidStudioを入れ直してもダメです。**

なので設定ファイルを消しましょう。
AndroidStudioのバージョンによって削除フォルダは変えてください。

`rm -rf ~/Library/Preferences/AndroidStudio2.3`


## 対策2: Git使ってるならもう一度Cloneして開く

そのまま。割愛。
在 Android 中限制 TextView 只能顯示一行並顯示三個點

（筆記）

預設　TextView 有辦法跟著內容長高不會限制行數
在目標的 TextView 的 xml 加入這個屬性的設定就可以把內容限制在只顯示一行：

```
android:maxLines="1"
```

當限制行數時，預設的行為只會把內容切掉，不會顯示 `...`
如果要加上後綴的 `...` ，只要在 TextView 加上這個屬性的設定即可：

```
android:ellipsize="end" 
```
iOSで:hoverに擬似要素を設定した時に発生するバグの対策

##iOSでホバー領域のリンクがダブルタップしないと反応しない
iOSのバージョンのバグ？なのか、既に色々と解決策について出回っているようですが、現状の対応策について備忘録としてまとめました。
よりよい方法などがあればご指摘ください！

今回対象とするHTMLとCSSは下記の通りです。

```ruby:index.html
<div>
  <h2>ニュース</h2>
  <ul>
    <li><a href="" class="hover__link">カテゴリ</a></li>
    <li><a href="" class="hover__link">カテゴリ</a></li>
  </ul>
  <a href="">テキスト</a>
</div>
```
```ruby:styles.css
  .hover__link {
    display: flex;
    align-items: center;
    padding: 0 15px;
    height: 100%;
    color: #222;

    &:hover {
      background: $hover_color;
      text-decoration: none;

      &:after {
        content: '';
        position: absolute;
        left: 40px;
        bottom: 10px;
        width: 5px;
        height: 5px;
        border-top: 2px solid $main_color;
        border-right: 2px solid $main_color;
        -webkit-transform: rotate(135deg);
        transform: rotate(135deg);
      }
    }
  }
```
###対応策
####1.JavaScriptでユーザーエージェントを取得し、iOSでhoverを無効に指定
プラグイン（[Device.js](https://github.com/matthewhudson/device.js)など）を使うかネイティブで記述してデバイスを判別し、iOSの時は不具合が発生しているセレクタに対してhoverの無効にする処理を入れる。

####2.メディアクエリでブレイクポイント以上の場合だけホバーを適用
ブレイクポイントを720pxで指定している場合は、`min-width`でプラス1pxした幅を設定しhoverを設定する。

```ruby:styles.css
@media screen and (min-width: 721px) {
  .hover__link {
    &:hover {
      background: $hover_color;
      text-decoration: none;
      &:after {
        content: '';
        position: absolute;
        left: 40px;
        bottom: 10px;
        width: 5px;
        height: 5px;
        border-top: 2px solid $main_color;
        border-right: 2px solid $main_color;
        -webkit-transform: rotate(135deg);
        transform: rotate(135deg);
      }
    }
  }
}
```
####3.メディアクエリでスマホ幅の時は擬似要素を打ち消す
現状では、原因がはっきりしないようですが、hoverに擬似要素を設定すると、現象が発生するようなので、今回は対象の要素が限られていることもあり、こちらの方法で対応しました。

####参考サイト
[@wakamshaさんのAltJS,AltCSS課題をGulp, SCSS, TypeScript でやってみた ｜ Developers.IO
ざっくりGulp.js入門（Mac向け）](http://qiita.com/hibikikudo/items/6703f11627ac0c55c796)
[JavaScriptでユーザーエージェントを取得しclassを付与する](http://qiita.com/tonkatu_tanaka/items/472ec6055dcf9c4110b1)
Pythonでオブジェクトを文字列化する6つの方法

関連: [Pythonにおける % と str.format() 。どっちを使うの？](http://qiita.com/amedama/items/8635aff8729a248bad16)

上についてf-stringsという言及があったのですが、文字列化する方法はそれだけではない気がします。メモ的に思いつくものを挙げます。

# str() と repr()

```shell-session
>>> import datetime
>>> d = datetime.datetime(2017, 9, 1, 12, 12, 0, 0)
>>> str(d)
'2017-09-01 12:12:00'
>>> repr(d)
'datetime.datetime(2017, 9, 1, 12, 12)'
>>> eval(repr(d))
datetime.datetime(2017, 9, 1, 12, 12)
```

`repr(obj)` によって内部では `obj.__repr__()` が呼ばれ、`str(obj)`によって内部では `obj.__str__()` が実装されていればそれが、なければ `obj.__repr__()` が呼ばれて代わりに使われます。 

`repr(obj)` の結果は、可能であればPythonの式(expression)とすることが期待されますが、いつもそうとは限りません。上述のdatetimeの例では `eval()` で評価できる文字列が返ってきています。

`str(obj)` の結果はPythonの式であるべきみたいな要請はなく、人が読みやすいフォーマットであることを優先するのが一般的です。

「オブジェクトを読みやすい文字列に直す」というと、例えば`pprint`モジュールなども思いつきます。そちらは`obj.__repr__()`を利用するようです。まぁ`__str__()`の結果から構造を把握するのは無理だわな。



* https://docs.python.org/3/reference/datamodel.html#object.__repr__
* https://docs.python.org/3/reference/datamodel.html#object.__str__

# %演算子と文字列メソッド `str.format()`

上の記事の主題でした。普段の開発上では最も重要な気がしますが、省略。

* [printf 形式の文字列書式化](https://docs.python.jp/3/library/stdtypes.html#old-string-formatting)
* [書式指定文字列の文法](https://docs.python.jp/3/library/string.html#format-string-syntax)
* [Using % and .format() for great good!](https://pyformat.info)

# f-strings

Python 3.6 より導入された記法で、文字列の中にPythonの式を直接記述できるようにするものです。

[PEP 498 -- Literal String Interpolation](https://www.python.org/dev/peps/pep-0498/)

FizzBuzzの例です。

```py3
>>> print(*[f"{'Fizz'*(not i%3)}{'Buzz'*(not i%5)}" or i for i in range(1,31)], sep='\n')
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
```

Redditの「[a Py3.6 fizzBuzz oneliner with f-strings](https://www.reddit.com/r/Python/comments/5k7lnb/a_py36_fizzbuzz_oneliner_with_fstrings/)」を参考にしていますが、`map()`よりはリスト内包表記を使う方が最近しっくりするのでそちらに変えました（`reduce()`がライブラリ落ちしたのもあります）。

念のため、`print()`の引数の頭にある`*`はリストのアンパックを示します。

型チェックという点では、少なくともmypy 0.521 はf-stringsの中身を見ます。

```py3
$ mypy --version
mypy 0.521
$ cat /tmp/test.py
def func(a: int) -> int:
    return a ** 2

print(f'{func(10.0)}')
$ python /tmp/test.py
100.0
$ mypy /tmp/test.py
/tmp/test.py:4: error: Argument 1 to "func" has incompatible type "float"; expected "int"
```

残念ながら筆者は3.5以前を使う機会も多いため、率先してこれだけに統一するという状況には至ってません。
ただ、将来的には `str.format()` を押しのけて f-strings が中心になる可能性はあるかなと思います。

# テンプレート文字列

[https://docs.python.jp/3/library/string.html#template-strings](テンプレート文字列)

昔からある機能として`$変数`を置き換えるというテンプレート文字列の機能がPython組み込みにあります。上記のサンプルを軽く紹介しときます。

```shell-session
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
```

あいにくHTMLエスケープ等はサポートしていないです。個人的にめったにお目にかかりませんが、使用を検討したことはあります。

# その他

タイトルでは6つとしましたが、Python標準の機能だけでもまだあります。

* `pprint`モジュール
* 組み込み関数 `format()` (コメントいただきました。筆者は知りませんでした。 [参考](https://docs.python.jp/3/library/functions.html#format))
* (他にあればご指摘ください……)

jinja2などの外部ライブラリを使用すれば文字列化する方法は他にもあるはずです。もちろん自前で作ればその分選択肢は増えます。
ハロウィン仮装にRaspberryPiを使って「喋る帽子」を作る

# 概要
我が家は毎年ハロウィンの時期になると仮装を自作しており，その仮装を作る作業とラズパイコンテストの応募が時期的にも重なるので，いっそ一緒に作ってしまおうということになりました．
今年は「[みんなのラズパイコンテスト2017](http://coin.nikkeibp.co.jp/coin/itpro-s/seminar/LIN/abstract/index.html)」でソニーセミコンダクタソリューションズさんの「[超小型カメラ IU233](http://www.sony-semicon.co.jp/products_ja/IS/sensor3/index.html)」をお借りすることができたので，このカメラを使った仮装をしようということになりました．
今回作成したのは「喋る帽子」です．


途中までこちらで作成していたのですが、技術的内容というよりは日記的になってきたので、はてなブログの方に移行しました。
行き先はこちら
[はてなブログ：ハロウィン仮装にRaspberryPiを使って「喋る帽子」を作ってみた](http://tajmahal0707.hatenablog.com/entry/2017/09/19/110030)



# 謝辞
IU233を貸与していただきました、ソニーセミコンダクターズ様．おかげで面白いハロウィンになりそうです．
IU233について色々な質問を投げさせていただき、そこにいつも丁寧に回答していただきましたビジョンプロセッシング・コミュニティの皆様方．
そして、USB基板のトラブルに迅速に対応していただけました日経BPさんに感謝いたします。
皆さんの助力がなければここまで辿り着くことはできなかったと思います。
rspecでbe_includedマッチャを自作した

`a` が `1` `2` `3`のいずれかであることをテストしたく、

```rb
expect(a).to be_included([1, 2, 3])
```

と書きたかったのだが、調べてもそのようなマッチャが見つからなかったので自作した。
すでにあったらスマン。


```rb
# actualがexpectedに含まれているか
RSpec::Matchers.define :be_included do |expected|
  match do |actual|
    expected.include?(actual)
  end
  description do
    "be included in #{expected}"
  end
end
```