OmniAICreator/Qiita-1.07M huggingface dataset:
トラ技 aiスピーカをJuliusで使用するときに音量を調整するには

# はじめに
トランジスタ技術2018年3月号付録（付録は基板のみ）のaiスピーカを音声認識エンジンJuliusで使用する際、トラ技サイトからダウンロードしたイメージのままだと音量が小さく、MEMSマイクに相当近づかないと認識してくれません。alsamixer で音量調整できるようですが、ステレオのみです。対して、Juliusで使用できるサウンドデバイスは、モノラルのみです。
そこで、モノラルでの音量を調整するために色々と試した結果、うまく音量を調整することができ、MEMSマイクから（数メートル）離れていても音声認識できるようになったので、その方法について記述します。
なお、juliusのインストールや辞書作成、PythonでのLチカについては、他のページを参照してください。
※ Julius でALSA を有効にするには、Julius をコンパイルする際に、あらかじめ ALSA ライブラリをインストールしておく必要があります。

# 具体的に
下記のとおりに行うことにより、音量を制御することができます。
## 1．.asoundrc の変更
~/.asoundrc の pcm.softvol の定義の下に、下記を追加します。

```
pcm.plugvol{
    type softvol
    slave.pcm "plughw:1,0"
    control{
        name "Boost Capture plug volume"
        card sndrpisimplecar
    }
    min_db -3.0
    max_db 30.0
}
```
## 2．音量の設定
alsamixer を起動して、F6→"1 snd_rpi_simple_card"→F4 するとバーが2本表示されるので、左右キーでplug volume を選択した後、上下キーで録音音量を設定します。
※ 一度、録音を実行しないとalsamixer に表示されないようです。

```
$ arecord -D plugvol -c1 -r16000 -f S16_LE test.wav 
```
## 3． 環境変数の設定
julius 起動時に環境変数 ALSADEV に"plugvol"を設定します。

```
$ ALSADEV="plugvol"
$ julius -C ../grammar/hmm_mono.jconf -nostrip -input alsa -gram [文法ファイル名] -module
```

以上で、音量を上げ、うまく音声認識することができるようになりました。
辞書やPythonプログラムの作成は、「julius L チカ」で検索するとヒットします。
このとき注意することは、デリミタを「yomi」ファイルでは'tab'、「voca」ファイルでは'(space)'にするということです。

※  sudo apt-get upgrade を実行すると、録音で使用するデバイス（snd_rpi_simple_card）が見えなくなってしまいました。そこで、トラ技 3月号のP.81 「［ラズベリー・パイの準備⓶］MEMSマイクとの通信」の手順を最後（P.83）まで実行してみると、再度、録音で使用するデバイスが見えるようになりました。
Cloud9でPythonを試してみる


# はじめに

イマドキは勉強用の環境もクラウドですよね。
AWSのCloud9というサービスを利用して、勉強用の環境を構築してみました。

# Cloud9環境の構築

「Create evironment」をクリックします。

NameとDescriptionは任意の値を入力します。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/8ba76ca8-3ce1-7e4b-d92a-f832f52c9826.png)

新しくEC2インスタンスを構築します。

勉強用なので、一番小さなインスタンスを選択しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/bb5da34d-521b-bb75-aaea-80e9a8d740a0.png)

確認して「Create」。
数分待ちます。

EC2インスタンスが起動しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/77fa2fcb-2110-57f6-c596-dda053f4514d.png)

Cloud9の画面は以下のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/4cfdcf8d-52e4-53e5-02f3-6ea59702959c.png)

下部のタブでシェルも実行できます。
Python3系も実行可能です。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/8b1630bd-7d41-42ae-5724-8a43e49fe13b.png)

# Hello World!

おなじみのHello Worldです。
普通のIDEと同じように直感的に操作できます。
左のファイルツリーから「New File」でpyファイルを作成します。

```py
print "Hello World!"
```

確認のために、あえてpython2系でのみ実行できる組み込みprintスタイルで記述してみます。

手癖でCtrl+sしたらしっかり保存できました。
実行してみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/a08954e9-61f1-933b-8c92-813092659037.png)

できました。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/5245a0a0-e0f5-783d-da8d-c870c248b2b0.png)

python3系で実行するためにはRunnerを切り替えれば良いようです。
設定からデフォルトを3系にすることもできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/b00ed90b-adeb-4c00-f529-8b8f54fa9381.png)

しっかりエラーになりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/23769b7f-704e-9694-0b9e-f4c2e4b84265.png)


## Lambdaにしてみる

これだけだとあれなので、AWS Lambda関数を作成してみます。
Welcom Pageの「Create Lambda Function」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/261c91ff-9405-3236-6978-e39a377d7a54.png)

適当な名前を入力します。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/db9dedba-89ad-8c51-bb1a-de55d5f3f581.png)

スケルトンを選べるようです。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/c5dc047d-ca1e-6b3f-8ada-637e8e9067ac.png)

API Gatewayも合わせて作れるようです。

スケルトンができました。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/054b4d8a-33dc-e1c9-8f3f-bee7afb7d41c.png)

右の再生アイコンから実行確認できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/d10b3558-1ad4-985e-efdf-f6c2361dcc87.png)

これは便利そうですね。

## おわりに

勉強用どころか実用的かも…

## 参考
PEP8 > if asDict == True > E712 comparison to True should be 'if cond is True:' or 'if cond:' > is Trueは正しいのだろうか? | ==をisにして動かなくなる例

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L476

```py
      if asDict==True:
```

上記をpep8コマンドでチェックすると

> Mie.py:476:16: E712 comparison to True should be 'if cond is True:' or 'if cond:'

isはオブジェクトの同一性の確認だったかと思うが、この場合は`==`でなく`is`の方にすべき、というのは正しいのだろうか?

以下を見つけた。
https://github.com/PyCQA/pycodestyle/issues/696

### `==`を`is`に変更して動かなくなる例

https://stackoverflow.com/questions/18998010/flake8-complains-on-boolean-comparison-in-filter-clause

> answered Sep 25 '13 at 6:50
Martijn Pieters♦

That's because SQLAlchemy filters are one of the few places where `== False` actually makes sense. **Everywhere else** you should not use it.

PEP8 E712の通りに変更すると動かなくなる場合もありそう。


### link

- [python3: difference between "is" and "==", unexpected behavior with integers](https://qiita.com/weedslayer/items/36a4d156e44b215fb7cc)

その他、`==`と`is`の違いについての記事
https://qiita.com/search?utf8=%E2%9C%93&sort=&q=Python+title%3Ais
autopep8 > error > The 'pep8>=1.4.5' distribution was not found and is required by autopep8 > autopep8のバグ?

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

読んでいるPythonコードがPEP8に準拠していないので、読みにくい。

autopep8を実行しようとしたら、以下のエラーになった。

```
$ autopep8 Mie.py 
Traceback (most recent call last):
  File "/usr/bin/autopep8", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2927, in <module>
    @_call_aside
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2913, in _call_aside
    f(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2940, in _initialize_master_working_set
    working_set = WorkingSet._build_master()
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 635, in _build_master
    ws.require(__requires__)
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 943, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 829, in resolve
    raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'pep8>=1.4.5' distribution was not found and is required by autopep8
```

pep8のバージョンが古いかというと古くない。

```
$ dpkg -l | grep pep8
ii  pep8                                       1.7.0-2                                      all          Python PEP 8 code style checker
ii  python-autopep8                            0.9.1-2                                      all          tool that automatically formats Python code to conform to PEP 8
ii  python3-pep8                               1.7.0-2                                      all          Python PEP 8 code style checker - python3
```

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=817860

autopep8自体のバグかもしれない。

autopep8をアップデートしようとしたが、最新版とのこと。


### Ubuntu 16.04 LTSでエラー

Ubuntu 14.04 LTSで実行時にはautopep8は使えていたようだ。
https://qiita.com/7of9/items/5085d0f3b0e889ce91fd

Ubuntu 16.04 LTSにインストールし直してから何か変わってしまったのかもしれない。

最新版はv1.3.4がGitHubにある。
https://github.com/hhatto/autopep8/releases
Python > ifインデント内で定義したoptを使ってその上位でチェックする (if opt:)

```txt:動作環境
ideone (Python 3.5)
```

https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L317

if文のインデントにて`_q`を定義して、その`_q`をifでチェックしている。

以下のような実装だ。
https://ideone.com/wDTrPu

```py
val = 314

if val == 314:
	opt = True
else:
	opt = False
	
if opt:
	print('opt')
```

```txt:
opt
```

optのスコープはifインデント内でなく、その上位側にも見えているのか。

### link

- [Pythonの変数スコープの話](https://qiita.com/msssgur/items/12992fc816e6adf32cff)

### 謝辞

@shiracamus さんのコメントにてPythonでは関数単位のスコープであることを教えていただきました。

情報感謝です。
Python > string > in > 大文字と小文字のチェック > if angleMeasure.lower() in ['radians','rad']:

```txt:動作環境
ideone (Python 3.5)
```

https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L281


```py
  if angleMeasure in ['radians','RADIANS','rad','RAD']:
    adjust = np.pi/180
```

PyMieScattには上記のように４つのパターンのチェックをしている実装がいくつか見られる。

下記でいいと思う。

```py
  if angleMeasure.lower() in ['radians','rad']:
    adjust = np.pi/180
```


https://ideone.com/jO0bQp

```py

def check_unit_original(angleMeasure):
	if angleMeasure in ['radians', 'RADIANS', 'rad', 'RAD']:
		print('in(org)')

def check_unit_lower(angleMeasure):
	if angleMeasure.lower() in ['radians', 'rad']:
		print('in(lower)')

def check_unit_in(angleMeasure):
	if 'rad' in angleMeasure.lower():
		print('in(in)')

alist = 'radians', 'RADIANS', 'rad', 'RAD'
for astr in alist:
	check_unit_original(astr)

for astr in alist:
	check_unit_lower(astr)

for astr in alist:
	check_unit_in(astr)
```

```txt:run
in(org)
in(org)
in(org)
in(org)
in(lower)
in(lower)
in(lower)
in(lower)
in(in)
in(in)
in(in)
in(in)
```

check_unit_in()はやり過ぎかもしれない。
radioactiveもひっかかる。

### link

https://docs.python.org/ja/3.6/library/string.html
仮想通貨とPythonではじめる裁定取引 その1(準備編)

## Python×仮想通貨でアービトラージシステムをつくろう

海外大手3取引所で取引されている多種の通貨ペアに着目して、裁定取引の機会を検証します。
手始めに、対象となる通貨ペアを洗い出しましょう。

ライブラリインストールをしましょう。

```bash
pip install cryptojp
```

下記のコードを実行して裁定取引対象のペアを探しましょう。

```python
from cryptojp import NewExchange
import itertools
import time

exchanges = ["hitbtc", "binance", "poloniex"]
exchanges_combinations = list(itertools.combinations(exchanges, 2))


class ArbitragePair(object):
    exchange_a = ""
    exchange_b = ""
    trading = ""
    settlement = ""

    def __init__(self, a, b, trading, settlement):
        self.exchange_a = a
        self.exchange_b = b
        self.trading = trading
        self.settlement = settlement

    def __str__(self):
        return "[%s-%s] %s_%s" % (self.exchange_a, self.exchange_b, self.trading, self.settlement)


arb_pairs = []
for ec in exchanges_combinations:
    cli0 = NewExchange(ec[0], "", "")
    cli1 = NewExchange(ec[1], "", "")
    ms0 = cli0.markets()
    ms1 = cli1.markets()
    for m0 in ms0:
        for m1 in ms1:
            if m0.trading == m1.trading and m0.settlement == m1.settlement:
                arb_pair = ArbitragePair(
                    ec[0], ec[1], m0.trading, m0.settlement)
                arb_pairs.append(arb_pair)

print(arb_pairs)
```

実行してみましょう。

```
[hitbtc-binance] DASH_BTC
[hitbtc-binance] ETH_BTC
[hitbtc-binance] LSK_BTC
[hitbtc-binance] STRAT_ETH
[hitbtc-binance] XEM_ETH
[hitbtc-binance] BQX_BTC
...
[binance-poloniex] LTC_USDT
[binance-poloniex] NAV_BTC
[binance-poloniex] STEEM_BTC
[binance-poloniex] STEEM_ETH
[binance-poloniex] VIA_BTC
[binance-poloniex] XEM_BTC
```

上記のような結果が得られるはずです。
次回は、裁定取引が可能な合計186の通貨ペアから、
価格検証を行っていきます。
PyMieScatt > SU = (SR + SL) / 2 > unpolarized = (perpendicular + parallel) / 2

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

### Reference

- Bohren C.F. and D. R. Huffman, "Absorption and Scattering of Light by Small Particles", John Wiley, New York, NY (1983)
- PDF: [MATLAB Functions for Mie Scattering and Absorption, Research Report No. 2002-08, June 2002](https://omlc.org/software/mie/maetzlermie/Maetzler2002.pdf) by Christian Mätzler

### SR, SL, SU

http://pymiescatt.readthedocs.io/en/latest/forward.html#ScatteringFunction
https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L306


```py
    SL[j] = (np.sum(np.conjugate(S1)*S1)).real
    SR[j] = (np.sum(np.conjugate(S2)*S2)).real
    SU[j] = (SR[j]+SL[j])/2
```

行列?

行列は@mpywさんとのやり取りでRuby実装を教えていただいたことがある。
https://qiita.com/mpyw/items/321c5485236615ca4664#comment-adb7fba3e87b85b4c18e
ideoneでは以下
https://ideone.com/XS2Mzc

https://en.wikipedia.org/wiki/Triangular_matrix

L(左三角形）とR(右三角形）という定義はあっただろうか?

http://pymiescatt.readthedocs.io/en/latest/forward.html#ScatteringFunction
> ... then computes parallel, perpendicular, and unpolarized intensities by

```math
SR(\theta) = | S_1 |^2
```

```math
SL(\theta) = | S_2 |^2
```

```math
SU(\theta) = \frac{1}{2}(SR + SL)
```

L(Parallel)とR(perpendicular)を足したのはU(unpolarized: 無偏光)になる。

L(左円偏光)とR(右円偏光)を足した場合は直線偏光になるだっただろうか。忘れた。


### left-polarized (parallel) light

http://pymiescatt.readthedocs.io/en/latest/forward.html#ScatteringFunction

> Returns
SL :numpy.ndarray
An array of the scattered intensity of left-polarized (parallel) light. Same size as the theta array.

SLは左偏光(parallel)という記載。

left-polarizedとparallel component of the electric field vectorは別の定義と認識していたが。。。

https://en.wikipedia.org/wiki/Circular_polarization#Left/right_handedness_conventions

left-polarizedは電場の振動方向が時刻により変化する。
parallel componentはある軸を基準に、電場の振動方向はその軸にparallelのまま。
?
PyMieScatt > ScatteringFunction() > adjust = 1/200 for gradians > 不明 | QSPACE by Sorensen(2013)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

### Reference

- Bohren C.F. and D. R. Huffman, "Absorption and Scattering of Light by Small Particles", John Wiley, New York, NY (1983)
- PDF: [MATLAB Functions for Mie Scattering and Absorption, Research Report No. 2002-08, June 2002](https://omlc.org/software/mie/maetzlermie/Maetzler2002.pdf) by Christian Mätzler

### adjust = 1/200

ScatteringFunction()の処理において、1/200という定義をしている部分がある。

https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L284

```py
  elif angleMeasure in ['gradians','GRADIANS','grad','GRAD']:
    adjust = 1/200
```

gradiansの定義は不明。

http://pymiescatt.readthedocs.io/en/latest/forward.html#ScatteringFunction
> This angle can be in either degrees, radians, or gradians for some reason.

for some reasonって何か?

> The angles can either be geometrical angle or the qR vector (see [Sorensen, M. Q-space analysis of scattering by particles: a review. J. Quant. Spectrosc. Radiat. Transfer 2013, 131, 3-12](https://www.sciencedirect.com/science/article/pii/S0022407313000083)).

上記の論文に記載されているのだろうか。

論文のabstractの以下は気になる。

> It applies to scattering from dielectric spheres of arbitrary size and refractive index (Mie scattering), fractal aggregates and irregularly shaped particles such as dusts. 


https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L292

QSPACEで処理する場合はlogでの積分をする、ということのようだ。
Sorensen(2013)は読んでいないが、abstractから見るにpower lawで表すことができるとある。power lawで表すことができるのせ、積分もlogで実施できるということだろうか。
GitHub Pages + 独自ドメイン + HTTPS (SSL) のサポートをGitHubが提供開始

# 前提
GitHub Pagesでお手軽にHTTPSを利用したい

# はじめに
[GitHub Pages](https://pages.github.com/)ではSSLサーバ証明書の設定ができません。
そのため、GIthub Pages + 独自ドメインでHTTPS (SSL) に対応するには、
CDNでリバースプロキシを利用するといった方法をとられている方が多いと思います。

- [カスタムドメインの GitHub Pages で HTTPS を使う](https://qiita.com/superbrothers/items/95e5723e9bd320094537)
- [GitHub Pages + CloudFlare で独自ドメインをSSL化する](https://qiita.com/noraworld/items/89dd85a434a7b759e00c)

# GitHubのHTTPSサポートの動向
## GitHubが独自ドメイン用の証明書を発行するようになった
2018年2月中旬ごろ、Github Pages側で[Let's Encrypt](https://letsencrypt.org/)のSSLサーバ証明書が
自動で発行されるようになり、リバースプロキシの設定をする必要がなくなりました。

- [Add HTTPS support to Github Pages including custom domains #156](https://github.com/isaacs/github/issues/156)

## GitHub PagesがHTTPSを公式にサポート開始
2018年2月中旬から4月下旬まで、独自ドメインのHTTPSサポートを非公式に提供するにとどまっていましたが、2018/05/01にGitHub Pagesが公式に独自ドメインでHTTPSをサポートすることを発表しました。

- [Custom domains on GitHub Pages gain support for HTTPS](https://blog.github.com/2018-05-01-github-pages-custom-domains-https/)

# GitHub Pagesにおける独自ドメインとHTTPSの利用設定
## 独自サブドメインの利用設定
利用する独自ドメインがサブドメイン (例: `www.example.com`) の場合、DNSのCNAMEレコードを設定します。

1. GitHub Pagesを利用するGithubレポジトリのメインページへ移動
1. Settingをクリック
1. Custom domainのテキストボックスに利用するサブドメインを入力しSaveをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/227682/553d796a-a172-67db-28fb-83aeaefd8bc6.png)
1. 利用するサブドメインが記載されたCNAMEというファイルがレポジトリに自動で追加される

1. 対象のサブドメインに対する元のドメインとして `YOUR-DOMAIN.github.io` (`YOUR-DOMAIN`は置き換え) を指定する。`YOUR-DOMAIN`に指定する内容はCustom domainの設定の**テキストボックスの上の説明文**中で確認できる (上記画像参照)

- [Github Pages - Setting up a custom subdomain](https://help.github.com/articles/setting-up-a-custom-subdomain/)

## 独自メインドメインの利用設定
**独自サブドメインのみをGitHub Pagesで利用する場合、この設定はしないでください。**

利用する独自ドメインがメインドメイン (例：`example.com`) の場合、Aレコードを設定します。
対象のメインドメインに対するIPアドレスとして以下の4つを指定します。

    185.199.108.153
    185.199.109.153
    185.199.110.153
    185.199.111.153

- [Github Pages - Setting up an apex domain](https://help.github.com/articles/setting-up-an-apex-domain/)

## HTTPSの利用設定
1. GitHub Pagesを利用するGithubレポジトリのメインページへ移動
1. Settingをクリック
1. Enforce HTTPSにチェック

<img width="738" alt="github-pages_hsts.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/227682/98528e79-0efb-779d-f979-b09395e38303.jpeg">

- [Github Pages - Securing your GitHub Pages site with HTTPS](https://help.github.com/articles/securing-your-github-pages-site-with-https/)

### Enforce HTTPSにチェックできない場合
（[@aikawameさん](https://qiita.com/aikawame) 情報提供ありがとうございます）
「Enforce HTTPS」の設定で以下のようなメッセージが表示されている場合、HTTPSを設定ができません。
2018年4月末現在、全リポジトリでHTTPSが利用可能にはなってはおらず、順次展開されているようです。

> Unavailable for your site because you have a custom domain configured (example.com)
[Emacs] 選択範囲をクリップボードに送る


## 前置き
tmux上のemacsからウインドウシステムのクリップボードに文字列を送りたい。

Emacsでクリップボードというと`x-select-enable-clipboard`が常道だが、ターミナル上のEmacsでは動作しないように思われる。

## 方法

xselをインストール

```bash
$ sudo apt install xsel
```

あとは設定ファイルに以下の関数を定義するだけ。

```emacs-lisp:init.el
(defun x-clipboard-copy ()
  (interactive)
  (when (region-active-p)
    (shell-command-on-region (region-beginning) (region-end) "xsel -ib" nil nil)))
```

範囲を選択して`M-x x-clipboard-copy`で選択範囲がクリップボードに送られる。
WRF | WPS > NCEP FNL data > GDAS > 欠損しているGDASデータの取得 > from the tape archive

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

### 関連

- [WRF | WPS > NCEP FNLデータ取得スクリプト (2018-03-23) NCARサイトの障害の一時的対応として | GDAS側の問題](https://qiita.com/7of9/items/8e976e37b666e6d98843)

### 欠損データの取得

WRFの前処理WPSに使うNCEP FNLデータは2018年3月24日現在、NCEP UCARのサイトのディスク障害により復旧の目処が立っていない。

FNLデータと同じファイルはGDASというサイトから取得可能であると聞いたが、GDASのサイトでは0バイトのファイルやファイル欠損(ディレクトリ欠損)が見つかる。
それら欠損ファイルについてどうするかGDASの連絡先に問い合わせをしていたところ、以下の手順を紹介された(+翻訳）。

> spinning disk directoryでデータが見つからない場合、tape archiveから注文できます。

https://www.ncdc.noaa.gov/has/has.dsselect

> model sectionのGDAS(daily or hourly)を選択してください。

> もしここでも見つからない場合、archiveにも本当に見つかりません。

Thank you very much, Scott.


### NCEP RDAサイト復旧
(追記 2018/03/26)

NCEP RDAのサイトが復旧した (2018/3/24)。
http://ncarrda.blogspot.jp/2018/03/3242018-all-rda-data-access-services.html

NCEP RDAサイトからあらためてFNLファイルを取得したところ、GDASで見られたようなファイルの欠損はなかった。
sqmail 導入

*絶滅危惧種 qmail派生パッケージ s/qmail

老兵は死なず。
-----
![199CD679-5BC2-4094-A2D4-3244C3D4154C.png](https://qiita-image-store.s3.amazonaws.com/0/91470/f5da5a6e-fe26-7e6e-5ff0-fa4a8ea46e41.png)

-----

配布元:

https://www.fehcom.de/sqmail/sqmail.html

取り敢えずインストールすることに。

この野良パッケージに先行して "FreeBSD-ports" より mail/qmail-spamcontrol を入れていた。

------
細かい事:

(この稿未完)
【Laravel】3階層のリレーションを持つテストデータ作成

#概要
3階層のリレーションを持つテストデータを作成したかったのですが、2階層までしかサンプルがなかったためメモなのと、なんとなくやったらエラーが出たのでメモ。

```
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'parent_id' cannot be null
```

#よくある2階層のやりかた
Book->Chapterのリレーションがあるとした時は以下のようになる。

```php:2階層
factory(App\Book::class, 10)->create()->each(function ($book) {
    $book->chapters()->saveMany(
        factory(App\Chapter::class, 5)->make()
    );
});
```

#3階層でやってみる
Book->Chapter->Postのリレーションがあるとした時は以下のようになる。

```php:3階層
factory(App\Book::class, 10)->create()->each(function ($book) {
    $book->chapters()->saveMany(
        factory(App\Chapter::class, 5)->make()
    )->each(function ($chapter) {
        $chapter->posts()->saveMany(
            factory(App\Post::class, 10)->make()
        );
    });
});
```
saveもしくはsaveManyの使い方として注意しておきたいのは、Eloquentのインスタンスをsaveメソッドの引数に指定するみたいなので、saveメソッドの引数にいれる値はEloquentインスタンスであるか(modelメソッドでインスタンス化するなど)を確認してみると良いと思います。


#参考
https://laravel.com/docs/5.6/eloquent-relationships
http://am1tanaka.hatenablog.com/entry/2016/10/17/231931
TensorFlowの関数と意味の一覧＜日本語の記事を紹介＞

#この記事
https://dev.classmethod.jp/machine-learning/tensorflow-math/

http://mirai-tec.hatenablog.com/entry/2016/02/22/001459

#おまけ　APIについてまとめられた記事
https://qiita.com/supersaiakujin/items/464cc053418e9a37fa7b

https://qiita.com/FukuharaYohei/items/f9bb9a0afd47be9ecef8
Bootstrap4のカラム幅リスト

Bootstrap4のカラム幅のリストを見たかったが、探しても見当たらなかったので作りました。

**カラム幅**

|   |  sm  |  md  |  lg  |  xl  |
|:-:|:----:|:----:|:----:|:----:|
| 1 |  45px|  60px|  80px|  95px|
| 2 |  90px| 120px| 160px| 190px|
| 3 | 135px| 180px| 240px| 285px|
| 4 | 180px| 240px| 320px| 380px|
| 5 | 225px| 300px| 400px| 475px|
| 6 | 270px| 360px| 480px| 570px|
| 7 | 315px| 420px| 560px| 665px|
| 8 | 360px| 480px| 640px| 760px|
| 9 | 405px| 540px| 720px| 855px|
|10 | 450px| 600px| 800px| 950px|
|11 | 495px| 660px| 880px|1045px|
|12 | 540px| 720px| 960px|1140px|

**パディングを差し引いた幅**

|   |  sm  |  md  |  lg  |  xl  |
|:-:|:----:|:----:|:----:|:----:|
| 1 |  15px|  30px|  50px|  65px|
| 2 |  60px|  90px| 130px| 160px|
| 3 | 105px| 150px| 210px| 255px|
| 4 | 150px| 210px| 290px| 350px|
| 5 | 195px| 270px| 370px| 445px|
| 6 | 240px| 330px| 450px| 540px|
| 7 | 285px| 390px| 530px| 635px|
| 8 | 330px| 450px| 610px| 730px|
| 9 | 375px| 510px| 690px| 825px|
|10 | 420px| 570px| 770px| 920px|
|11 | 465px| 630px| 850px|1015px|
|12 | 510px| 690px| 930px|1110px|

プログラムで計算して、テーブルに出力しただけなので、一部間違いがあるかもしれません。
direnvで環境変数などを個別に設定 (rails)

#direnvについて
**rails**プロジェクト毎で個別に環境変数を設定して利用したい時に[`direnv`](https://github.com/direnv/direnv)使うと便利なんじゃないですか？
>[いまさら direnv の解説](https://qiita.com/ngyuki/items/fda1bbf29384bef7a805)


#direnvを導入する
[こちら](https://qiita.com/kompiro/items/5fc46089247a56243a62)とか[こちら](https://deeeet.com/writing/2014/05/06/direnv/)の記事を参考に、今回は`homebrew`からインストール

    brew install direnv

エディタは`vim`、シェルは`zsh`を使用しているので、`.zshrc`に下記を追記

```zsh:~/.zshrc
# direnv(.envrc)用設定
export EDITOR=vim
eval "$(direnv hook zsh)"
```
反映させる

    source ~/.zshrc

これでdirenvが使用可能になりました。

`もし、以降のコマンドが機能しない場合、「.zshrc」を確実に反映させるため、ターミナルを再起動してください（もしくは新規タブを開いて作業します）。`

#direnvに環境変数を設定
プロジェクト内で利用したい環境変数を設定する。

####プロジェクトディレクトリ内で下記コマンドを実行して、設定ファイル`.envrc`を作成

    direnv edit .

（適宜書換えてください ↓）

```zsh:.envrc
export EEJANAICA_APP_ID="参照値"
export EEJANAICA_APP_SECRET="参照値"
```
---
####エラーの場合

`direnv: error .envrc is blocked. Run 'direnv allow' to approve its content.` というエラーが発生する場合は下記コマンドで設定を有効化する（有効化するまで設定が無効のままなので注意）。

    direnv allow

---
##git管理しているプロジェクトの場合

.gitignoreに**.envrc**を**追加**する（**バージョン管理から外す**）

```zsh
    echo '/.envrc' >> .gitignore
```

#利用するとき
任意のファイル内で

```rb
ENV['EEJANAICA_APP_ID']
ENV['EEJANAICA_APP_SECRET']
```
CloudFormationでProperty DeviceIndex cannot be empty. が出る場合

CloudFormationで`Property DeviceIndex cannot be empty.`のエラーが出る場合があります。
[AWS CloudFormation デザイナー](https://console.aws.amazon.com/cloudformation/designer)で吐かれた↓のようなyamlで再現。

```yaml
  ...

  EC2I3K8WP:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: ami-bec974d8
      NetworkInterfaces:
        - SubnetId: !Ref PNSubNet1
  ...
```

# 対応
インスタンスに`SubnetId`を紐付けたかったので以下のように修正。

```yaml
  ...

  EC2I3K8WP:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: ami-bec974d8
      SubnetId: !Ref PNSubNet1
  ...
```

# 備考
- エラーがわかりづらく少々はまりました。
- [CloudFormationの「Property DeviceIndex cannot be empty」エラーに対処する（Public IPアドレス割当のおさらい）](https://dev.classmethod.jp/cloud/aws/auto-assign-public-ip-by-cfn/)
プログラミングするならGitを学ばないと!! 文系学生が勉強してみた!!

##はじめに
インターン先でプログラミングを勉強中の文系学生。

「プログラミングで仕事していくつもりなら、Gitについても学んでおいたほうが良いね」
「Gitですか? Githubならアカウント作ってます」
「もうちょっと色々学んでおいたら?」

とのことで、勉強してみよう!!

##Gitとは
社員さんにGitのことを簡単に説明してもらった。
「Gitを簡単に言うと、仕事のバックアップやサポートをしてくれるツールだね。」
なるほど!!
とりあえず、社会で働いていくプログラマーには必須のツールか!!

##Git
とりあえずはGitについて調べてみるか。
[Git](https://git-scm.com/)のホームページを見てみると、インストールできそう。
とりあえずインストールしてみるか。

### TryGit
インストールしている間、ホームページ眺めていると、[TryGit](https://try.github.io/levels/1/challenges/1)なるものを発見!!
gitのコマンドを練習できるみたい。
やったことはこんな感じ。
`git init:初期化。
git log:今までのログを表示
git add:ファイルの作成、追加。
git rm ファイル名:ファイルの削除。
git status:現在の状態(ディレクトリ)を確認。
git commit -m:変更の保存。閉じても変更が破棄されない。
git remote add origin GithubのURL:ローカルのリポジトリをGithubに追加。
git reset ディレクトリ名/ファイル名:指定したファイルのディレクトリの依存を無くす。
git push:リモートでしていた作業をgit hubに追加
git push -u リモート名 ローカルブランチ名:gitにgithubの何処につなぐかを指定。
git pull リモート名 ローカルブランチ名:他のユーザによる変更を見る。
git diff HEAD:最近の変更内容を見る。
git diff --staged:直前に行った変更を確認する。
git reset ディレクトリ名/ファイル名:指定したファイルのディレクトリの依存を無くす。
git checkout ブランチ名:ブランチの切り替え。
git checkout -- ファイル名:ディレクトリに依存させた後の処理を無くす。
git reset ディレクトリ名/ファイル名:指定したファイルのディレクトリの依存を無くす
git blanch ブランチ名:ブランチの作成。ブランチ…複数のユーザが作業する場所。
`

20個ほど項目はあったけど、上に説明があったから１時間はかからなかったな。

って、インストールしていたこと忘れてた。

###Gitの設定
Qiitaに[Git for Windows インストール&設定](https://qiita.com/shinsumicco/items/a1c799640131ae33c792)という今の自分にぴったりのサイトを発見。
この内容に沿って進めていこう。

まぁ、無事に終わったかな。

###Gitの分岐モデル
社員さんから[Gitの分岐モデル](http://nvie.com/posts/a-successful-git-branching-model/)を紹介して貰った。
実際に扱っていないから、よくわからないところもあるけれど、見ておく必要はある気がする。

###Git操作の練習
[このページ]から自分のPCに合ったものをダウンロードすることで、実際に操作をしながらGitの操作を学べるみたい。

##最後に
今回はGitについての学習をしました。
プログラミングだけでなく、それを支えてくれるツールとかも勉強していこう!!
名簿に載ってる人から来たメールを抽出するスマートメールボックスをつくる

# 目的
- Excelなどで作成した名簿に載っている人から届いたメールを抽出するスマートメールボックスをつくる

# 環境
-macOS

# 手順
- Excelなどで作成した名簿をcsvに吐きだす。
- csvからvCardに変換して、`CATEGORIES` 属性にグループ名を設定する。
    - 例（大学のゼミの学生名簿）
        - CSVの様式
            - ```通し番号,所属,学年,性別,氏名（半角スペース区切り）,Name(名姓）,カタカナ,携帯,メール```
        - 正規表現で変換して、拡張子vcfで保存。
            - vCardの`CATEGORIES `属性に名簿のメンバを放り込むグループを設定しておく。

``` :検索
^\d+\,(.+?)\,(\w\d)\,.+\,(\w+)\ (\w+).*\,.+?\,(\w+)\ (\w+).*\,(\d+\-\d+\-\d+)\,(.+)$
```

``` :置換
BEGIN:VCARD
VERSION:3.0
N:\3;\4;;;
FN:\3 \4
X-PHONETIC-FIRST-NAME:\6
X-PHONETIC-LAST-NAME:\5
ORG:○○○○大学\1;
TITLE:\2
item1.EMAIL;type=INTERNET;type=pref:\8
item1.X-ABLabel:大学
TEL;type=CELL;type=VOICE:\7
CATEGORIES:研究会学生
END:VCARD
```

- 連絡先アプリにvCardの`CATEGORIES `属性に設定したグループを作っておく（すでにあるのならこの手順はスキップ）。
- 作成したvCardファイル（vcfファイル）をmacOS Xの連絡先アプリに読み込む（アイコンにドラッグ＆ドロップ）。
- `重複候補を確認…` を選び、すでに存在するカードについてはアップデートを選ぶ。
- メールアプリで、新規スマートボックスをつくり、条件として、`差出人が特定のグループのメンバーである` でvCardの`CATEGORIES `属性に設定したグループを含めるようにする。

## 更新
- グループのメンバを更新する場合、連絡先アプリのグループのメンバーをグループから削除する。（グループを空っぽにする）
- 更新された名簿のvCardファイルを読み込んで、重複分はアップデートする。
ファイルの最終行に改行があったら削除する

# はじめに
もうこんなシステムは世の中には存在しないと信じたいですが、仮にCSVやTSVの最終行に改行があったため、取り込みエラーを起こすような、お金払っても粗大ゴミとして捨てた方が良いシステムが存在した場合に役に立つコマンドをご紹介します。

# ゴミに取り込まれるものからゴミをとる
```
perl -0pe 's/\n$//m' -i gomi_ni_torikomaretaku_nai_yo-.csv
```

# おわりに
大きいファイルには向いてないです＆perl入ってなかったらごめんなさい。
picameraでエラー発生時の対象方法

picameraでエラーが発生した際の備忘録です。

# 現象

picameraのインスタンス生成時に下記のようなエラーが発生

```

>>> import picamera
>>> camera = picamera.PiCamera()
mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC
mmal: mmal_port_enable: failed to enable connected port (vc.null_sink:in:0(OPQV))0x113f660 (ENOSPC)
mmal: mmal_connection_enable: output port couldn't be enabled
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/picamera/camera.py", line 433, in __init__
    self._init_preview()
  File "/usr/local/lib/python3.6/site-packages/picamera/camera.py", line 513, in _init_preview
    self, self._camera.outputs[self.CAMERA_PREVIEW_PORT])
  File "/usr/local/lib/python3.6/site-packages/picamera/renderers.py", line 558, in __init__
    self.renderer.inputs[0].connect(source).enable()
  File "/usr/local/lib/python3.6/site-packages/picamera/mmalobj.py", line 2212, in enable
    prefix="Failed to enable connection")
  File "/usr/local/lib/python3.6/site-packages/picamera/exc.py", line 184, in mmal_check
    raise PiCameraMMALError(status, prefix)
picamera.exc.PiCameraMMALError: Failed to enable connection: Out of resources
```
# 原因
比較のために複数のカメラ用ソフトウェアをインストールしており、他のプロセスがカメラモジュールにアクセスしていたため、リソースの競合が発生していました。
この時はRPi-Cam-Web-Interfaceが起動していたので、下記のコマンドで停止して事象を回避できることを確認しています。

```bash

# cd /usr/local/bin/RPi_Cam_Web_Interface
# ./stop.sh
```

```
>>> import picamera
>>> camera = picamera.PiCamera()
>>>
```
LocalDateTimeの時刻を特定の時刻に設定する

Java8から追加されたDate Time API。この中にあるLocalDateTimeを使って書いたコードで、時にこんなコードを見かける。

```java:各フィールドを逐一設定する.java
LocalDateTime ldt = LocalDateTime.now().withHour(12).withMinute(0).withSecond(0).withNano(0);
```

「今日の12時」のような設定なのだが、時刻の各フィールドを一つ一つ設定している。
まあCalendar使ってた時は基本的に一つ一つの設定だったから流れでこうなったのかもしれない。
しかし、これは`withXxx()`のたびに新規インスタンスが生成されて効率が悪い。

こんな時に使うのが[LocalDateTime#with](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDateTime.html#with-java.time.temporal.TemporalAdjuster-)だ。

>public LocalDateTime with(TemporalAdjuster adjuster)
この日付/時間の調整済のコピーを返します。
これは、日付/時間を調整して、この日付/時間に基づくLocalDateTimeを返します。調整は、指定されたアジャスタ戦略オブジェクトを使用して行われます。どのような調整が行われるかを理解するには、アジャスタのドキュメントを参照してください。

TemporalAdjusterとはあまりなじみがないが、ここでは単純に次のような使い方だけ紹介する。

```java:一発で12時に設定する.java
LocalDateTime ldt = LocalDateTime.now().with(LocalTime.of(12, 0));
```

LocalTimeもこのTemporalAdjusterを実装しているため、withメソッドに渡すことができる。
そして、LocalDateTimeのインスタンスが持つ時刻を引数の時刻に変更してくれるのだ。
overCurrentContextの時のnavigationController、tabbarControllerの振る舞い

# 概要
よく、前の画面を表示したまま透過した画面を表示したいといったケースがあるかと思います。（ダイアログとか）
通常は `self.present(controller!, animated: true, completion: nil)` と書くことが多いと思いますが、ナビゲーションを持つ場合、タブバーを持つ場合での振る舞いがよくわかっていなかったので整理しました。

# selfにpresentした場合
```swift
let controller = self.storyboard?.instantiateViewController(withIdentifier: "sec")
controller?.modalPresentationStyle = .overCurrentContext
self.present(controller!, animated: true, completion: nil)
```

![スクリーンショット 2018-03-24 0.32.41.png](https://qiita-image-store.s3.amazonaws.com/0/70721/9d9a4616-681d-4518-5875-15909db34a7e.png) 

青が遷移先の画面です。
タブバーが表示されています。

# navigationControllerにpresentした場合
```swift
let controller = self.storyboard?.instantiateViewController(withIdentifier: "sec")
controller?.modalPresentationStyle = .overCurrentContext
self.navigationController?.present(controller!, animated: true, completion: nil)
```
![スクリーンショット 2018-03-24 0.32.41.png](https://qiita-image-store.s3.amazonaws.com/0/70721/267c8cc4-d752-78e2-6a71-e6d4f9f9f02a.png)

`self`と同じく、タブバーが表示されています。

# tabBarControllerにpresnetした場合
```swift
let controller = self.storyboard?.instantiateViewController(withIdentifier: "sec")
controller?.modalPresentationStyle = .overCurrentContext
self.tabBarController?.present(controller!, animated: true, completion: nil)
```

![スクリーンショット 2018-03-24 0.44.15.png](https://qiita-image-store.s3.amazonaws.com/0/70721/f6d47bde-ea22-0233-6d1f-294a2452b85f.png)

タブバーが表示されません。

# まとめ
よくある、背景透過のダイアログを作りたい場合、タブバーは表示されて欲しくないので必然的に `hidesBottomBarWhenPushed` を使用してタブバーを明示的に隠す、または`tabBarController`から遷移させて上げる必要がありそうです。
きっとNavigationControllerやTabBarControllerの仕組みを追うと当然の結果なのかもしれませんが、それは割愛。。
Androidのcheckboxの色を動的に変更させる

意外にはまったの備忘録として記載しておきます。

Androidのcheckboxの色を動的に変更させる方法です。
xmlで変える方法は、あちこちで紹介されているのですが、
Javaのコードで動的に変える方法が中々見つかりませんでした。

今回、トグルボタンのON<->OFFでcheckboxの色を赤<->青に変更するコードを実装しました。

```java:main
public class MainActivity extends AppCompatActivity {

    private CheckBox checkbox;
    private ColorStateList colorState; // 赤
    private ColorStateList colorState2;//青

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ToggleButton tButton = (ToggleButton) findViewById(R.id.toggleButton);
        tButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked) {
                    checkbox.setButtonTintList(colorState);//赤
                }else {
                    checkbox.setButtonTintList(colorState2);//青
                }
            }
        });

        checkbox = (CheckBox) findViewById(R.id.checkBox);
        colorState = new ColorStateList(
                new int[][] {
                        new int[]{ android.R.attr.state_checked},
                        new int[]{ -android.R.attr.state_checked},
                },
                new int[] {
                        Color.argb(0xff,0xff,0x00,0x00),
                        Color.argb(0xff,0xff,0x00,0x00),
                }
        );

        colorState2 = new ColorStateList(
                new int[][] {
                        new int[]{ android.R.attr.state_checked },
                        new int[]{ -android.R.attr.state_checked },
                },
                new int[] {
                        Color.argb(0xff,0x00,0x00,0xff),
                        Color.argb(0xff,0x00,0x00,0xff),
                }
        );
}
```

ColorStateListでcheckboxに指定したい色のカラーステートを作成して、
setButtonTintListでcheckboxにセットします。
ただ、setButtonTintListがAPI Level21からなので、Lollipop以降じゃないと使えないのご注意下さい。

実行結果は、こんな感じです。
![赤.png](https://qiita-image-store.s3.amazonaws.com/0/245306/a2fa4016-525a-02e7-d160-9354cbfece56.png)
![青.png](https://qiita-image-store.s3.amazonaws.com/0/245306/2cec98a8-350d-03e7-1fa2-8c6d7e3bb739.png)
EloquentでmapWithKeysでintはkeyに指定できない

**注意：Laravel5.3での話です!（5.4以降は修正されております）**

タイトルのままですが、CollectionのmapWithKeysメソッドを使用する際、returnする配列のkeyにintを指定するとkeyが自動的に0,1,2...と設定されてしまうバグがあって困ってました。
他に困る方がいらっしゃった時のために記事にして残しておこうと思います。
# mapWithKeysの説明
この記事にたどり着く方にmapWithKeysの挙動について説明する必要もないかと思うのですが、念のため記載いたします。
LaravelのドキュメントのmapWithKeysをところ(https://readouble.com/laravel/5.3/ja/collections.html#method-mapwithkeys )を見てみると

```
mapWithKeysメソッドはコレクション全体を反復処理し、指定したコールバックへ各値を渡します。
コールバックからキー／値ペアを一つ含む連想配列を返してください。
```
とあります。
上の説明で十分かと思いますが、PHPの標準関数的に言うとarray_mapでkeyとvalue同時に指定できるよー、な感じでしょうか？
# コードの内容とバグの詳細
以下のようなコードを書いた際に

```php

$collection = new Collection();
$collection = collect([
    ['id' => '1', 'name' => 'Yamada'],
    ['id' => '2', 'name' => 'Suzuki'],
    ['id' => '3', 'name' => 'Satou']
]);

$collection = $collection->mapWithKeys(function($item) {
    return [$item['id'] => $item['name']];
});

dd($collection->toArray());
```
予想される出力は

```php

array(3) {
  [1]=>
  string(6) "Yamada"
  [2]=>
  string(6) "Suzuki"
  [3]=>
  string(5) "Satou"
}
```
となります。
ですが実際に出力されるものはなぜか配列のkeyを0から順番に振り直してしまうので

```php

array(3) {
  [0]=>
  string(6) "Yamada"
  [1]=>
  string(6) "Suzuki"
  [2]=>
  string(5) "Satou"
}
```
となってしまいます。

# 解決策
一番簡単な方法はversionを5.4以上にあげることだと思います。が、私を含めて、何らかの理由があってversionを上げれない方もいらっしゃるかと思います。
そのような方は以下のコードを追記してください。

```php

collect()->macro('mapWithKeys_v2', function ($callback) {

    $result = [];

    foreach ($this->items as $key => $value) {
        $assoc = $callback($value, $key);

        foreach ($assoc as $mapKey => $mapValue) {
            $result[$mapKey] = $mapValue;
        }
     }

    return new static($result);
});
```
Eloquentに詳しい方でしたら解説は不要かと思いますが、macroメソッドで新たにメソッドを登録しています。
以降は

```php

$collection = $collection->mapWithKeys_v2(function($item) {
    return [$item['id'] => $item['name']];
});
```
のように呼び出したら予想している通りの挙動として使用できます。

# 最後に
って、githubのissueに全部書いてありました！
https://github.com/laravel/framework/issues/15409
Xamarin.Forms+ReactivePropertyでスマホアプリ開発！《ReactiveProperty編》

【記事ツリー】

- [スマホアプリ開発！《本編》](https://qiita.com/YSRKEN/items/0036c6506155b9bf8051)
 - [スマホアプリ開発！《MasterDetailPage編》](https://qiita.com/YSRKEN/items/521d2962ac664fa95ebe)
 - [スマホアプリ開発！《ReactiveProperty編》](https://qiita.com/YSRKEN/items/d6835ac9f1338eeaab05)
 - [スマホアプリ開発！《ファイル読み込み編》](https://qiita.com/YSRKEN/items/36fb3b4ae0c0cf7476db)
 - [スマホアプリ開発！《リリース・署名編》](https://qiita.com/YSRKEN/items/cf22da85013197949742)

# 概要

　[Xamarin.Forms+ReactivePropertyでスマホアプリ開発！《本編》](https://qiita.com/YSRKEN/items/0036c6506155b9bf8051)において、どのようにReactivePropertyを活用したのかといった話です。ReactivePropertyについての説明は次のページを参照してください。
　　[【C#】ReactiveProperty全然分からねぇ！って人向けのFAQ集【修正済】](https://qiita.com/YSRKEN/items/5a36fb8071104a989fb8)


# ReactiveProperty\<T\>編
　コントロールのプロパティによく利用される型ですが、Xamarin.Formsでも使用できます。注意したいのは、Xamarin.Formsには`UpdateSourceTrigger`という概念が無く、言うなれば**常にUpdateSourceTrigger="PropertyChanged"している状態**だということです。
　つまり、コントロールの操作によりBindingで紐づけされたデータが即時に更新され(OneWayToSource方向)、データを更新するとコントロールの内容が即座に書き換わります(OneWay方向)。[Xamarin.FormsにOneTimeという概念は存在しない](http://ryuichi111std.hatenablog.com/entry/2016/12/25/123408)そうですので、OneWay辺りで代用しましょう。
　ちなみに、「`ReactiveProperty`を`CombineLatest`で繋げながら`ReadOnlyReactiveProperty`を生成する」定番テクニックも**Xamarin.Formsでは使用できます**。

# ReactiveCollection\<T\>編
　`<Picker>`の`ItemSource`プロパティなどに利用される型ですが(以下略)。こちらは`ReactiveProperty<T>`と違い、XAMLにBindingする際は`{Binding Hoge.Value}`ではなく`{Binding Hoge}`でいいことに注意しましょう。
　また、コンストラクタ以降一切変更する気がなければ、タダの`List<T>`でも用を果たせます(`ObservableCollection<T>`を使うのは変更通知のためなので)。

　ところで、`ReactiveCollection<T>`における`T`って参照型しか使えないのはなぜなのでしょう？　`ObservableCollection<T>`なら値型でも大丈夫なのに……。

# ReactiveCommand編
　`<Button>`の`Command`プロパティなどに(以下略)。Xamarin.Formsだからどうこうといった話は私が知る限りありませんので、普通に`Subscribe`でイベントを貼り付けていきましょう。
LINEmessagingAPI と GoogleAppsScript でBOT作成してみて気になったこと

#背景
筆者は久しくコードから離れたインフラエンジニアである。
ふとコードを書いてみたい衝動にかられたが面倒なことは嫌なので
さくっと動くものが作ってみたかった。

簡単に調べた結果、LINEmessagingAPI と GoogleAppsScriptを用いて
簡単なBOTを作るというのが手軽そうだったのでやってみた。
ひとまずは応答メッセージとして単一の文字列を返すだけのものを作成したが
その際、何点かつまずいたところがあったので備忘する。

#LINEmessagingAPI
開発コンソールの登録はLINEのアカウントがあれば簡単に作成できた。
プランはひとまずtrialを選択した。
もし公開サービスとして運用していくのであればプラン変更が必要になる（trialは登録ユーザ数50が上限）

リファレンスは完全日本語でサンプルコードも見やすいのでつまずきにくいと思う。

#GoogleAppsScriptの設定
ChromeにGoogleAppsScriptアプリを登録し、ブラウザ上からコードが書ける。
一旦はStandaloneスクリプトを作成するのがわかりよいと思う。
GASの概要は下記が参考になった。
https://qiita.com/soundTricker/items/4d04c97c499b22886dfd

GASで一番つまずいた点は公開アプリケーションとして設定する点だった。
エディタ画面から
　公開　>　ウェブアプリケーションとして導入
を選択する。
「次のユーザーとしてアプリケーションを実行」欄は「自分」を選択する。
「アプリケーションにアクセスできるユーザー」欄は「全員（匿名ユーザを含む）」を選択する。
自分の権限としてアプリケーションを実行するため、他人の認証を行うと公開アプリケーションとして機能しない。

これらを設定すると「現在のウェブ アプリケーションの URL」として外部から呼び出せるURLが表示される。
これをLINEmessagingAPIのWebhook URLとして設定すればよい。
また「ウェブ アプリケーションで最新のコードをテストします。」としてテスト用のURLも利用できる。
この2種類のURLを以下にまとめる。

|      |       公開用URL |    テスト用URL    |
|:-----------------|------------------:|------------------:|
| URL末尾             |              exec| dev    |
| 編集反映タイミング  | 版（バージョンを更新した後） |     保存後即時   |

この編集反映タイミングに気づかず、ブラウザ上からのテストは想定通り動作するのに
LINEから呼び出すと動作しないという事態になり混乱してしまった。

#デバッグ方法
GASでのデバッグ方法はLogger.log(string)でログに吐き出すというのが基本になると思う。
吐き出したログはエディタ画面から編集　>　ログ（ctrl+Enter）で表示できる。
しかしこれは一度実行される度にリフレッシュされてしまうので
貯め続けたい場合はGoogleドキュメントに吐き出す等工夫が必要になりそうだ。（今回はそこまで必要にならなかった）

またブラウザからテスト用URLを叩くとGETメソッドが呼び出されるので
doGet()でPOSTパラメータを偽造してdoPost()を呼び出す等すれば簡単にテストできる。

#感想
以上のようにつまずいた箇所もあったが、アカウントの作成から動作確認まで2～3時間程でできた。
実態として書いたコードは70行程だったが。

インタフェースとして誰もが利用しているLINEが使えるというのはハードルが低いし、テストしやすいし、布教しやすいしとてもよかった。
気が向けばこれを機に更に試してみたい。

##参考
>https://qiita.com/cheese/items/33dda88acb5a63c7399c
>https://qiita.com/howdy39/items/4dc11af7b1c74c17f7f7
>https://qiita.com/soundTricker/items/4d04c97c499b22886dfda
>https://qiita.com/kkdmgs110/items/3483ad6cb5c85983ffc6
>
ALTER SYSTEM KILL SESSION…"だけ"の権限付与を定義者権限のプロシージャで実現してみる。(Oracle Database)

ALTER SYSTEM KILL SESSION…によるユーザーセッションの切断は許可したいけど、
ALTER SYSTEM権限の付与(GRANT)は範囲が広過ぎる、権限が強過ぎる。
ALTER SYSTEM KILL SESSION"だけ"を許可したい……てな要件を、
定義者権限(AUTHID DEFINER)のプロシージャで実現してみるやで彡(ﾟ)(ﾟ)

# 概要
以下のような構成でDBユーザーとストアド・プロシージャを作成します。
> DEFUSER … 権限の強いDBユーザー
↓
DEFUSER.PRC_KILL_SESS … KILL SESSIONを行うストアド・プロシージャ、定義者権限(AUTHID DEFINER)で作成
↓
実行権限付与(GRANT EXECUTE…)
↓
EXEUSER ←権限の弱いDBユーザー

# DBユーザー作成
権限の強いユーザー(DEFUSER)と弱いユーザー(EXEUSER)をそれぞれ作成します。

```sql
CONNECT /AS SYSDBA

-- プロシージャの所有者
CREATE USER DEFUSER IDENTIFIED BY xxxxxxxx
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;

-- DBAロールとALTER SYSTEM権限を付与
GRANT DBA TO DEFUSER;
GRANT ALTER SYSTEM TO DEFUSER;

User created.
Grant succeeded.
Grant succeeded.

-- KILL SESSIONを実行するユーザー
CREATE USER EXEUSER IDENTIFIED BY xxxxxxxx
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;

-- CREATE SESSION権限のみ付与
GRANT CREATE SESSION TO EXEUSER;

User created.
Grant succeeded.
```

# ストアド・プロシージャ作成＆権限付与
KILL SESSIONを実行するストアド・プロシージャをDEFUSERスキーマに
作成してEXEUSERに実行権限を付与します。

```sql
CONNECT DEFUSER/xxxxxxxx@yyyyyyyy

CREATE OR REPLACE PROCEDURE DEFUSER.PRC_KILL_SESS (
    in_sid    IN NUMBER
  , in_serial IN NUMBER
)
AUTHID DEFINER
IS
BEGIN
  EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || in_sid || ',' || in_serial || '''';
END;
/

Procedure created.

GRANT EXECUTE ON DEFUSER.PRC_KILL_SESS TO EXEUSER;

Grant succeeded.
```

# EXEUSERでKILL SESSIONの検証
EXEUSERでKILL SESSIONの検証をしてみます。下記のセッションをKILLしてみます。

```sql
CONNECT AYSHIBAT/xxxxxxxx@yyyyyyyy

Connected.

SELECT SID, SERIAL# FROM V$SESSION WHERE USERNAME = 'AYSHIBAT';

       SID    SERIAL#
---------- ----------
       775      31102
```

まずは ALTER SYSTEM KILL SESSION…から。権限が無いので当然失敗します。

```sql
CONNECT EXEUSER/xxxxxxxx@yyyyyyyy
Connected.

SHOW USER
USER is "EXEUSER"

ALTER SYSTEM KILL SESSION '775, 31102';
*
ERROR at line 1:
ORA-01031: insufficient privileges
```

ストアド・プロシージャ(PRC_KILL_SESS)によるKILL。こちらは成功します。

```sql
CONNECT EXEUSER/xxxxxxxx@yyyyyyyy
Connected.

SHOW USER
USER is "EXEUSER"

EXEC DEFUSER.PRC_KILL_SESS(775, 31102);
PL/SQL procedure successfully completed.
```

元のセッション(AYSHIBATユーザ)に戻ってみると……
見事にKILLされています。やったぜ。彡(^)(^)

```sql
SELECT SID, SERIAL# FROM V$SESSION WHERE USERNAME = 'AYSHIBAT';
*
ERROR at line 1:
ORA-00028: your session has been killed

SELECT SID, SERIAL# FROM V$SESSION WHERE USERNAME = 'AYSHIBAT';
ERROR at line 1:
ORA-01012: not logged on
Process ID: 4398
Session ID: 775 Serial number: 31102
```

マニュアルも読みませう彡(ﾟ)(ﾟ)
AUTHID DEFINERでプロシージャ(等)を作成すると、
定義者(今回のケースではDEFUSER)の権限で実行されるってことなんやね。

> Oracle Database PL/SQL言語リファレンス 12c リリース2 (12.2) 
E72879-03
実行者権限および定義者権限(AUTHIDプロパティ)
https://docs.oracle.com/cd/E82638_01/LNPLS/plsql-subprograms.htm#GUID-41D23DE7-3C07-41CF-962B-F92B696594B5
Python軽量フレームワークFalconでAPI開発 入門(その3)

# 概要
この記事はPythonフレームワークの一つである[Falcon](http://falcon.readthedocs.io/en/stable/index.html)の扱い方についてまとめた記事です。今回の記事は[前回](https://qiita.com/shimakaze_soft/items/911b339257f0e0bdd310)のその3になります。

Falconって何？って方は以下から読んで見てください。
[Python軽量フレームワークFalconでAPI開発 入門(その1)](https://qiita.com/shimakaze_soft/items/166071b17dd286e8913b)


今回は`Middleware`という機能の扱い方について解説します。


# Middlewareとは？
Middlewareとは、__全てのリクエストに対して任意の処理を追加できる機能__のことです。
それに対してHooksは、__指定したリソースに対して適用__されます。Middlewareは、__アプリケーション全体に対して処理が適用__されます。

Middlewareには以下の3つのメソッドを定義します。

- process_request リクエストを受信後に実行
- process_resource リソース(Resource)の到達前に実行
- process_response レスポンスを返す前に実行(つまりリソースの処理後に実行)

process_request, process_responseに関しては、__リクエストのURLに対するリソースが無い場合でも必ず実行__されます。
process_resourceは、URLに対するリソースが無い場合は実行されません。

## 実装例

それでは実際にMiddlewareを使用してみましょう。
middlewareはアプリケーション全体に適用されるため、以下のようにしてfalcon.APIの引数にmiddlewareのクラスを指定します。

middleware自体はリソース(resource)同様に、何も継承していないただのPythonクラスです。ここではExampleMiddlewareというmiddlewareのクラスを指定しています。(この後に実装例を記述します。)

```python:app.py

import middleware
.
.
(省略)

app = falcon.API(middleware=[
    middleware.ExampleMiddleware()
])
```

Middlewareのクラスを定義したファイルを作成します。
まず最初に`process_request`,`process_resource`の順に実行されます。その次にリソース(resource)が実行され、最後に`process_response`に処理が行きます。

```python:middleware.py


class ExampleMiddleware(object):
    
    def process_request(self, req, resp):
        print('process_request')
        print(req)
        print(resp)
        
    def process_resource(self, req, resp, resource, param):
        print('process_resource')
        print(req)
        print(resp)
        print(resource)
        print(param)

    def process_response(self, req, resp, resource):
        print('process_response')
        print(req)
        print(resp)
        print(resource)
```

# Middlewareの複数指定

Middlewareは以下のように複数指定することができます。
もしExampleMiddlewareTwo()というクラスがあった場合、カンマで区切って追加します。

```python:app.py

import middleware
.
.
(省略)

app = falcon.API(middleware=[
    middleware.ExampleMiddleware(),
    middleware.ExampleMiddlewareTwo(),
])
```

Middlewareを複数指定した場合、以下のような順番でMiddlewareは実行されていきます。

```
ExampleMiddleware.process_request
    ExampleMiddlewareTwo.process_request
        ExampleMiddleware.process_resource
            ExampleMiddlewareTwo.process_resource
                <Resource() class>
    ExampleMiddlewareTwo.process_response
ExampleMiddleware.process_response
```

# まとめ

今回紹介したのは以下二つです。

- ミドルウェアの作成方法
- ミドルウェアは複数指定することが可能

次回はリクエストパラメーターの詳細について解説していこうかなと思います。

http://falcon.readthedocs.io/en/stable/api/middleware.html
Excelで選択したセルの合計値をクリップボードにコピーする

選択したセルの合計値をクリップボードにコピーするExcelマクロです。
これでステータスバーに表示されている合計値を覚えておかなくても済みます。
個人用マクロブック（PERSONAL.XLSB）に保存し、"Ctrl+Shift+C"のようなショートカットキーを割り当てておくと便利です。
`WorksheetFunction.Sum(Selection)` の`Sum`を書き換えれば、平均、個数、最小値、最大値などもコピーできます。

![Excel.png](https://qiita-image-store.s3.amazonaws.com/0/55550/707242ad-502f-8c64-86d3-bf8ef366f38f.png)

```vb
Sub 合計値をコピー()
'
' マクロ名: 合計値をコピー
' ショートカット キー: Ctrl+Shift+C
'
    
    If Not TypeOf Excel.Selection Is Excel.Range Then
        Call Excel.Selection.ShapeRange.PickUp 'PickUp = 本来のCtrl+Shift+Cの動作
        Exit Sub
    End If
    
    Dim mySelection As String
    mySelection = Application.WorksheetFunction.Sum(Selection)
    With CreateObject("Forms.TextBox.1")
        .MultiLine = True
        .Text = mySelection
        .SelStart = 0
        .SelLength = .TextLength
        .Copy
    End With
    
    ' 確認のポップアップが必要なら、コメントを外す
    ' Call VBA.MsgBox("選択されているセルの合計値をコピーしました" & vbLf & mySelection, , "選択値の合計")
    
End Sub
```

最近のWindows（64ビット版）ではDataObjectが不安定なため、代わりにTextBoxを利用。