OmniAICreator/Qiita-1.07M huggingface dataset:
[Laravel 5.6] ルーティングを書く順番をミスって画面真っ白から抜け出せなくなった話

#ルーティングを書く順番の大切さ

Laravel でルーティングを書くとき `Route::resource()` を使えば勝手にルーティングを生成してくれて便利です。

```web.php
Route::resource('/user', 'UserController');
```

ただ、これ以外にも user まわりで新しいルーティングを使いたいときは自分で書き足す必要があります。

ここで注意。

ルーティングを書き足すとき、上の方に書いたルーティングが優先されます。

```web.php
Route::resource('/user', 'UserController');  // こっちが優先！
Route::get('/user/hogehoge', 'UserController@hogehoge');
```

```UserConstroller.php
class UserController extends Controller
{
    public function hoge ()
    {
        return 'hoge!';
    }

    public index()
    {
        //
    }

    // 以下略
}
```

こう書いてしまうと、`/user/hogehoge` にアクセスしても正しくビューが表示されません。

（私の場合はエラーもなく真っ白な画面が表示されました。。。）

これは `/user/hogehoge` のルーティングよりも `Route::resource()` で生成した `user/{user}`（User コントローラーの show メソッド）の方が優先されることが原因です。

`/user/hogehoge` の <b>hogehoge</b> がパラメーターとして `user/{user}` の <b>{user}</b> の中に入ってしまい、User コントローラーの show メソッドが呼ばれてしまいます。

ルーティングの書く順番を入れ替えれば正しく表示されるはずです！

```web.php
Route::get('/user/hogehoge', 'UserController@hogehoge');
Route::resource('/user', 'UserController');  // resource を下に
```

以上～
Docker + ubuntu16.04 + python3.6.5 + opencv3.4.0

最近"no module named cv2"で相当うんざりしたので

とりあえずこれでDockerfile作ってビルドすれば通る

メモとして残す

([opencvは3.4.1にバグがある](https://ja.stackoverflow.com/questions/43138/darknet-yolov3-gpu%E4%BD%BF%E7%94%A8%E6%99%82%E3%81%AEmake%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)って話を聞いたので一応3.4.0にしておく)

``` Dockerfile
FROM ubuntu:16.04

ENV DEBCONF_NOWARNINGS yes
RUN rm -rf /var/lib/apt/lists/*
RUN apt-get clean
RUN apt-get update -yq
RUN DEBIAN_FRONTEND=noninteractive apt-get -yq install build-essential cmake curl \
    gcc git libssl-dev libbz2-dev libreadline-dev libsqlite3-dev libglib2.0-0 libfontconfig1 \
    libxrender1 libsm6 libxext6 make pkg-config python-dev python-pip unzip vim wget zip zlib1g-dev
ENV PYTHONIOENCODING "utf-8"

# pythonの環境準備
ENV HOME  /
ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH
RUN git clone https://github.com/yyuu/pyenv.git .pyenv
RUN pyenv install 3.6.5
RUN pyenv global 3.6.5

RUN pip install --upgrade pip
RUN pip install opencv-python==3.4.0.12

```
Hyperion-Androidを使ってみた


社内でHyperion-Androidがデバッグに便利、という情報を得たので試しに使ってみた。

# 環境

```
Android Studio 3.2 Beta 5
Build #AI-181.5281.24.32.4913314, built on July 26, 2018
JRE: 1.8.0_152-release-1136-b04 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.12.6
```

# Hyperion-Androidとは

説明は書くのが面倒なので省く、以下記事をみると分かりやすい
- Hyperion-AndroidでAndroidアプリをデバッグしよう - Qiita https://qiita.com/takahirom/items/2f6557f945ddd7c5e074

# インストール

リポジトリを探してREADMEを眺める

willowtreeapps/Hyperion-Android: App Debugging & Inspection Tool for Android https://github.com/willowtreeapps/Hyperion-Android


usageに載ってるが、コア機能とプラグインをapp/build.gradleに突っ込めば使えるそうだ

```diff:app/build.gradle
     implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
     implementation 'androidx.constraintlayout:constraintlayout:1.1.2'

+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-core:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-attr:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-measurement:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-disk:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-recorder:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-phoenix:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-crash:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-shared-preferences:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-geiger-counter:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-timber:0.9.24'
+    debugImplementation 'com.willowtreeapps.hyperion:hyperion-build-config:0.9.24'
+
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'

```

# ビルド=>エラー

Sync => OK

Run Buld => エラーになった!!!??

エラーメッセージは

```
Program type already present: android.support.v4.os.ResultReceiver
```

既に`ResultReceiver`が存在？ 何を言っとるんだねキミは...

ググるとAndroidX関連のエラーらしい

そういえば試しにAndroidX導入したんだった。

## 解決方法

gradle.propertiesに以下を追加するだけ

```diff:gradle.properties
 # This option should only be used with decoupled projects. More details, visit
 # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
 # org.gradle.parallel=true
+android.enableJetifier=true
+android.useAndroidX=true
```

# ビルド再チャレンジ

Sync => OK

Run Buld => OK

よーし、できた

本体を振るとHyperion-Androidメニューが表示された

<img src="https://qiita-image-store.s3.amazonaws.com/0/52227/a41eace2-d9c2-d3ba-8b2f-ee614631b15d.png" width=20%>

Hyperion-Androidを使用する動画も撮ってみた

<blockquote class="twitter-tweet" data-lang="ja"><p lang="no" dir="ltr">Hello Hyperion-Android <a href="https://t.co/2lPF4lzI6X">pic.twitter.com/2lPF4lzI6X</a></p>&mdash; イケムラ (@ikemura_jp) <a href="https://twitter.com/ikemura_jp/status/1024587469692387329?ref_src=twsrc%5Etfw">2018年8月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 備考

今回使用したコードのリポジトリは以下

https://github.com/ikemura23/Android-Kotlin-Lab/tree/Hyperion-Android
最近の Chrome packaged app では  content_security_policy が使えない (或いは、 Chrome packaged app で Vue とか使いたい人のためのTIPS。)

## 結論
* 外部ファイルが読めない
    * 全部ローカルに保存してそこから読む
* `eval`とか使えない( `eval` 使ってるライブラリが全部使えない) 
    * [Using eval in Chrome Extensions. Safely.](https://developer.chrome.com/extensions/sandboxingEval)
    * サンドボックスとやらに指定して iframe の中で実行するとうまくいくらしいです。

## 経緯
Chromeの拡張機能を作ろうと思って、普段Vue使ってるから、今回もそれで作ろうとしたんですよ。
アプリの規模小さいからめんどくさい事は考えずにVueは直接読めばいいや。と思ったら

```html:index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <h1>Hello, let's code!</h1>
  <div id="app">
    {{ message }}
  </div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="js/main.js"></script>
</body>
</html>
```

```javascript:main.js
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
});
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/6817/c78d96f3-1853-9d29-fffe-1dc7e9af7d9a.png)

```
Refused to load the script 'https://cdn.jsdelivr.net/npm/vue/dist/vue.js' because it violates the following Content Security Policy directive: "script-src 'self' blob: filesystem: chrome-extension-resource: 'wasm-eval'".
```

はいはい。セキュリティポリシー変えればいいのね。とりあえず全許可でいいや。

```json:manifest.json
{
  ....
  "content_security_policy": "script-src *"
}
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/6817/19ad29fb-ab1b-6479-1737-80fee7463672.png)

………:thinking:

はい。この通りです。
調べると「 `content_security_policy` を入れればいい」って記事も大量に出てくるんですが(これも本当に厄介)、事 packaged app においてはそもそも `content_security_policy` そのものが使えないようです。どないせいっちゅーねん。

とりあえずローカルに落としてみます。

```html:index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <h1>Hello, let's code!</h1>
  <div id="app">
    {{ message }}
  </div>
<script src="js/vue.js"></script>
<script src="js/main.js"></script>
</body>
</html>
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/6817/b6a3d6af-7073-5aaf-2545-4dd3816201cb.png)

eval が使えないって怒られました。 :rage:

そも `content_security_policy` が使えないのに許可しろもクソもありません。どないせいっちゅーねん。


で、[Using eval in Chrome Extensions. Safely.](https://developer.chrome.com/extensions/sandboxingEval) をみると解決策が載ってました。

```html:index.html
<!doctype html>
<html>
  <head>
    <script src="js/eventpage.js"></script>
  </head>
  <body>
    <iframe id="theFrame" src="main.html" style="size:100%"></iframe>
  </body>
</html>
```

```html:main.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <h1>Hello, let's code!</h1>
  <div id="app">
    {{ message }}
  </div>
<script src="js/vue.js"></script>
<script src="js/main.js"></script>
</body>
</html>
```

```json:manifest.json
{
  ...
  "sandbox": {
    "pages": ["main.html"]
 }
}
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/6817/bb2953f7-24ec-5f2b-3cb8-207a427883f4.png)

……めんどくさいな………
macOS Mojaveでソフトウェアアップデートのキャッシュを消す方法

# はじめに
Apple Beta Software Programに加入すると，次のmacOSのbeta版を使用することができます。

その際，macOSのアップデートは「設定」アプリの中に移されましたが，アップデートしようとすると「インストール中にエラーが発生しました」と表示され，アップデートできない現象になりました（2回）。

# 原因
僕の場合の原因は，アップデートデータのダウンロードが正常に完了していないことでした。

ダウンロードがやけに早いなぁと思っていたのですが（3GB超のデータが5分足らずで終わってた）。


# 対処法
途中までダウンロードしたデータ(キャッシュ)を削除してまたイチからダウンロードし直す方法です。

## SIPの無効化
ダウンロードしたデータは `/Library/Updates/` の中にあります。
これを削除すればいいのですが，El Capitanから導入されたセキュリティ機能SIP，通称Rootlessがあるため，中身を見ることはできても削除ができません。

なので，先ずはSIPを解除します。

1. macを一旦シャットダウンする
1. macを `command+R` を押しながら起動し，ユーティリティモードへ入る
2. メニューバーの「ユーティリティ > ターミナル」からターミナルを起動する
3. `$ csrutil disable` と打ち込む
4. macを再起動

これでSIPが無効化されました。

```zsh
$ csrutil status
System Integrity Protection status: disabled.
```

と表示されていれば無効化できています。


## キャッシュの削除

`/Library/Updates` フォルダを削除します。

念の為リネームしてもいいと思います。


## ソフトウェアアップデート

あとはソフトウェアアップデートを行えばダウンロードの最初から始まるはずです。


## SIPの有効化
正常にアップデートできたら再度SIPを有効化しておきます。

無効化の時の手順と同じで，有効化のコマンドは
`$ csrutil enable` です
最短で試すPythonテストコード

# はじめに
本記事は、FizzBuzzを題材にPythonでテストコードを書く際の自分向けの備忘録です。
最近よく目にする「テストコード最高！書かないやつは○○！」的なマウンティングゴリラ達に怯える初学者の助けに少しでもなれば幸いに思います。

# テストコード
まずは早速テストコードから

```test_fizzbuzz.py
# coding:utf-8

import unittest
import fizzbuzz as fb


class FizzBuzzTest(unittest.TestCase):
    def setUp(self):
        # 初期化処理
        pass

    def tearDown(self):
        # 終了処理
        pass

    def test_normal(self):
        self.assertEqual(1, fb.fizzbuzz(1))

    def test_fizz(self):
        self.assertEqual("Fizz", fb.fizzbuzz(3))

    def test_buzz(self):
        self.assertEqual("Buzz", fb.fizzbuzz(5))

    def test_fizzbuzz(self):
        self.assertEqual("FizzBuzz", fb.fizzbuzz(15))


if __name__ == "__main__":
    unittest.main()
```

ここではテストクラスという物を定義しております。

最初の２関数`def setUp(self)`と`def tearDown(self)`は今回使っているPythonのテスト用標準ライブラリ`unittest`の関数でそれぞれ初期化・終了のタイミングで走る関数、残りの４関数が今回定義した**テスト**という事になります。


# メインコード
次にメインコードです。

```fizzbuzz.py
# coding:utf-8


def fizzbuzz(number):
    if number % 15 == 0:
        return "FizzBuzz"
    if number % 5 == 0:
        return "Buzz"
    if number % 3 == 0:
        return "Fizz"

    return number


if __name__ == "__main__":
    for i in range(1, 101):
        print(fizzbuzz(i))

```

# 実行
上記２ファイルが用意出来たら、あとはテストコードを実行するだけです。

```
python test_fizzbuzz.py
```

以下のような結果が帰ってくればOK（＝テストに通った）という事になります。

```
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK
```

# 結局何が嬉しいのか
テストコードが最も威力を発揮するのは、いわゆるリファクタリングと呼ばれる「コードの見直し」のときかと思います。

FizzBuzzでよくある「７の倍数のときは"Hoge"を出力せよ」といった新しい要件が追加されたときに、安心してコードに手を加えられるのが良かったりしますね。

<br>
以上です。
ありがとうございました。
Python 2とPython 3 > C実装の標準出力を受けて標準出力する

```
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
Python 3.4.2
gcc (Raspbian 4.9.2-10) 4.9.2
```


### 概要

- C実装で1秒おきに標準出力される
- その標準出力を受けて、Pythonで標準出力する

CでI2C通信を実装して、その結果をpySerialを使ってPythonでRS-232Cに送信しようと考えている。
そのための予備調査。

## 実装
### C > 1秒おきの標準出力

- [Raspberry Pi > C > ローカルタイムのmsec(ミリ秒)まで取得して標準出力 > gettimeofday()使用版とclock_gettime()使用版](https://qiita.com/7of9/items/bf327b4327fcb5b08881)

```tickTime_180801.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <time.h>

static void printTime_clock_gettime(bool addLF)
{
    struct timespec tvToday; // for msec
    struct tm *ptm; // for date and time

    clock_gettime(CLOCK_REALTIME_COARSE, &tvToday);
    ptm = localtime(&tvToday.tv_sec);

    // date and time
    printf("%04d/%02d/%02d,%02d:%02d:%02d,",
        ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday,
        ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
    // msec
    printf("%03d,", (uint16_t)(tvToday.tv_nsec / 1000000));

    if (addLF) {
        printf("\n");
    }
}

int main(void)
{
	struct timespec req;	
	int loop;
	
	req.tv_sec = 1;
	req.tv_nsec = 0;

	for(loop=0; loop<5; loop++) {
		printTime_clock_gettime(/*addLF=*/true);
		fflush(stdout);
		nanosleep(&req, NULL);
	}
}
```

### Python 2 > 標準出力を受けて標準出力する

```redirect_180801.py
# v0.1 Aug. 01, 2018
#   - break when [EOFError]
#   - read using raw_input()

# on Python 2.7.9

while True:
    try:
        res = raw_input()
        print(res)
    except EOFError:
        break

```

### コンパイルと実行

- [python > print > 処理終了時にしかリダイレクトされない? > -u 付きで実行する](https://qiita.com/7of9/items/f674e155f53f0fd06458)

```txt:
$ gcc tickTime_180801.c -o tickTime_180801
$ ./tickTime_180801 | python2 -u redirect_180801.py 
2018/08/01,18:06:11,972,
2018/08/01,18:06:12,982,
2018/08/01,18:06:13,982,
2018/08/01,18:06:14,982,
2018/08/01,18:06:15,982,
```

標準出力は1秒おきに実施される。

**注記: raw_input()はPython 2で使います**

### 備考

- `sys.stdin`では希望の動作にはならなかった

### Python 3 > 標準出力を受けて標準出力する

Python3ではraw_input()でなくinput()を使う。

- 参考: 科学技術計算のためのPython入門 by 中久喜健司様
    - p14の表1.4 Python 2系列とPython 3系列の違いの例

```redirect_py3_180801.py
# v0.1 Aug. 01, 2018
#   - break when [EOFError]
#   - read using raw_input()

# on Python 3.4.2

while True:
    try:
        res = input()
        print(res)
    except EOFError:
        break

```

```txt:run
$ ./tickTime_180801 | python3 -u redirect_py3_180801.py 
2018/08/01,18:37:13,143,
2018/08/01,18:37:14,153,
2018/08/01,18:37:15,153,
2018/08/01,18:37:16,153,
2018/08/01,18:37:17,163,
```
[AWS]私が経験したDynamoDBアンチパターン

# はじめに

DynamoDBをデータベースにしたアーキテクチャでシステムを構築し、運用をし始めてから1年近く経ったので、DynamoDBを使い始める前に感じていた幻想と、実際に使った後に打ち付けられた現実を、DynamoDBはこんな使い方に向いてないっていうパターンを合わせて書き連ねたいと思います。
DynamoDBについての説明は割愛します。

## あのとき幻想…

当時、DynamoDBって

* 短いスパンの書き込みに強い
* ある程度のスパイクには耐えてくれる
* オートスケールでキャパシティを自動で増減できる
* DAXとかグローバルテーブルとか色んな機能もあって素敵やん

という印象を持っており、

**DynamoDBって有能やん！！！**

と思っていた時期もありました………

## 現実は甘くない

現実はそんなに甘くなかった。
デバイスから無造作に投げられるデータ。
そのデータをさばくKinesisDataStreamsやAWSLambda。
あとはDynamoDBにデータが格納されれば何も問題はなかった…

## [アンチパターン1] オートスケールに頼りすぎる問題

DynamoDBにはオートスケールという機能があり、各テーブルに対してのRead/Writeごとのキャパシティを、負荷をトリガーに自動的に増減させてくれる機能があります。
なので、「デバイスからのデータ量やリクエスト量が増えても、オートスケールが発動してキャパシティ上げてくれるから安心やな！」と思っていました。

なにが問題かって言うと、
「オートスケールよ。お前スロースターターやのう…」
ということです。

### 何が起きたか

デバイスから一度のリクエストで2000件近くのデータを投げていて、KinesisDataStreamsやLambdaは問題なく可動しているんだが、DynamoDBの該当テーブルには途中までしかデータが格納されていなかった…

### 実際に確認してみた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95875/fa59ab56-bff9-51ca-7186-faff1ab0f451.png)

オートスケールのトリガーがあってから、キャパシティが反映されるまで約10分程度かかってました…
DynamoDBはキャパシティ不足が続くと、おそらくすべてのテーブルに対する操作を拒否します。したがってLambdaが死にます。それに伴い、Lambdaに渡されたデータは闇へ葬り去られます…

### どうするのか

1. 1件あたりのデータ量が多くなる可能性がある場合は、予めキャパシティに余裕を持たせておきましょう。ここをケチると痛い目に遭います。
2. キャパシティ上げたら金額上がるから、オートスケールでなんとかしたい…という場合は、大人しくLambdaの前にKinesisDataStreamsをはさみましょう。オートスケールが仕事をするまでリトライ処理をしてくれます。

## [アンチパターン2] DynamoDBStreamsのシャード数いじれない問題

DynamoDBStreamsという機能があります。
各テーブルに対して何かしらのイベントが発生したら、それをトリガーにLambdaを実行することができる機能です。
テーブルからデータを加工して、他のテーブルに書き込みをすることができたりします。
私が携わる案件では、デバイスから送信されてくるデータをサマライズするのによく利用しています。

### 何が起きたか

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95875/f3b915dc-ece5-fdf6-9f7f-d8652d704041.png)

こんな感じのアーキテクチャがあって、デバイスからデータが送信されてきて各テーブルに書き込まれた後、そこからサマライズして違うテーブルに書き込むような処理をしています。

ある日突然何台かのデバイスから想定していないインターバルでデータが送信されてきたときに問題が起きました。
DynamoDBStreamsが詰まりに詰まって、データの処理が半日程度遅延していました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95875/3baa5b40-a92a-7e6d-20ec-9b800f9cfc09.png)

DynamoDBStreamsのシャード数はAWS内部で自動的に生成しては、削除してという感じになっているので、ユーザー側からコントロールすることができないのです…

### どうするのか

現段階で回避するにはDynamoDBStreamsからLambdaの間にKinesisDataStreamsを挟む方法が有効です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95875/c3a6671e-3d18-9ff6-b937-6cb8e1390f61.png)

## さいごに

DynamoDBはNoSQLなので、IoTとは相性が良いので、データの格納先にはベストなんだと思っています。
ですが決してとりあえず投げ込めばいいや。ということではないので、付随するサービスも合わせてアーキテクチャを考えていかないといけません。
またRDBと違い

- トランザクションという概念がない
- SQLは書けない

という特徴があるので、マスターデータなどの情報をDynamoDBで持つと、これも痛い目に遭うと思います。(これもアンチパターンの一つですかね…)

ではまた！
telnetサーバ(systemd)の設定の仕方

セキュリティがばがばのために、入ってるだけのtelnet。
勉強のために使いたかったけど、設定の仕方がわからなかったので、書き置き。

OS ： arch linux

# systemd関連
- telnet@.service
- telnet.socket

# 設定の仕方
telnetの設定は、systemdとxinetdの2種類があるらしいが、今回はsystemdを使った方法で設定した。

# 前準備
まず、inetutilsをインストールしておく。大抵はデフォルトで入っていると思う。

```bash
sudo pacman -Syu inetutils
```

# telnet.socketを開く
telnetサーバの起動 ＝ telnet.socketを開く

```shell_session
# ブート時に開きたい場合（有効化）
systemctl enable telnet.socket

# 一時的に開きたい場合（起動）
systemctl start telnet.socket
```

# 確認
サーバに接続してつながればOK

```bash
telnet localhost
```

以上
VS Code でスニペットをサジェストの一番上に表示させる方法

Visual Studio Code の User Snippets で定義したスニペットをコード補完のサジェストの一番上に表示させるには、 User Settings で以下の設定を追加します。

```json:settings.json
{
  "editor.snippetSuggestions": "top"
}
```

- `inline`: スニペットを他の候補に混ぜて表示（デフォルト）
- `top`: 他の候補より上
- `bottom`: 他の候補より下
- `none`: 表示しない

デフォルトだとせっかく自分で定義したスニペットがすぐに選択できず不便ですが、この設定を追加するとすぐ選択できるようになります。

参考： https://stackoverflow.com/questions/40110541/how-to-edit-existing-vs-code-snippets
Ruby on Rails—テーブルカラムにコメントを追加するマイグレーション

## マイグレーションファイルの例

```rb
  class AddUsersComments < ActiveRecord::Migration[5.1]
  def up
    change_column :users, :first_name, :string, comment: "This is first name of user"
  end

  def down
    change_column :users, :first_name, :string, comment: nil
  end
end
```

## 環境

- activerecord (5.1.6)
- Rails 5.1.6

## Gist

- [Ruby on rails — How to change column comment with migration](https://gist.github.com/YumaInaura/a587ade00f46cba0665df82680d3bdd6)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
仕様変更に弱いからテストは書かない……？(´・ω・`)＜仕様変更を想定するならテストを書いてくれ頼む

テスト書けない人をディスったらバズりました。
「[スピード感重視なのでテストは書かない。テストはなぜ開発を遅くするか](https://qiita.com/aimof/items/d68bdb347283ee2dbccf)」

気になる反応があったので別記事にまとめておきます。

## 「仕様変更に弱いからテストは書かない」

テストがあると頻繁な変更に弱い、と考える方が複数いらっしゃるようです。実際に、スタートアップの現場では、昨日の決定が今日と違うなんてことはザラにあります。

私の立場は「仕様変更が多いならテストを書いてくれ頼む」です。絶対に間違いなく一行の変更も加えず書いたコードを捨てることが決まっているのなら、テストは不要な可能性が高いです。しかし私の経験上は、プロトタイプであっても変更を加えたくなることは多々あります。その際にテストがないと困るだろう？というのが今回の主張です。

## 前提

* フロント、特にGUIは私が無知なので対象としません。
* 間違いなく書き捨てるコードは対象としません。少なくとも一週間くらい動かして多少の変更を加える予定のコードを想定しています。
* 既存のレガシーコードは対象としません。新規で開発する場合を想定しています。
* 最初から最後まで一人で開発するプログラムは対象としません。一人でやるなら好きにすれば良いと思います。
* 頭の中でテストを完了できる方は対象としません。

## 今まで出会った、テストがなくて大変だった経験

個人的な経験です。

### ありとあらゆる変更が、デプロイするまで結果がわからない

個別に開発環境容易するほどのリソースはないので、開発検証用の環境は一つだけで共有です。ローカルでの開発をエイヤで済ませた後、デプロイしてTracebackが出て(´・ω・`)となります。

もう一回ローカルで修正して、開発環境の順番待ちをしてからもう一回(´・ω・`)となる。

みたいなことを延々繰り返していきます。

テストがないって恐ろしい。

(´・ω・`)＜入った瞬間に、ローカルでテストできるようにしようと言ったけど却下された

### ちょっとした変更を加えて（デプロイしてから）動かすと、全く想定していなかったところでエラーが出てくる

よくわからないところで密に結合しており、一見なんの関係もなさそうな（というかあってはいけない）関数の変更で壊れます。
一般的にはテストファーストな実装をしているとIOが限られるため、こういう状態には強いのだが……

## テストコードがあると、変更しやすくなります

上記は極端な例に思われるかもしれませんが、何も考えずにテストを導入しない環境はひどいことが起きます。
(´・ω・`)＜それでも…テスト…いらない？

考えた末にテストやらないのならいいのですが、思考停止でテスト捨てると大概詰みます。

## テストがあると変更に弱いと考えている人が勘違いしていそうなこと

* 変更に強いテストと実装に技術力はいらないと考えている
* 実装した人がいつまでもメンバーにいると思っている
* 必ず全関数にテストを書かなければならないと思っていて、カバレッジ100%みたいな指標を持ち出す
* 開発時のテストをそのまま実運用に使えると思っている。逆に、実運用に耐えるレベルの完全なテストを開発時に要求する

### テストと技術力について

変更しやすいテストと実装を書くためには技術がいります。私が完璧かといえばそんなことありません。極めるのは遠い道のりです。

精進せずにコスト高いと言いはるのはいかがなものかと…。

テストファーストって設計レベルから絡む話なので、設計がうまくいかないと、コスト高いです。

## 実装した人いなくなったらテスト無しでどうするの？

実装した人がいなくなる事件は、何処の職場でもよくあります。この際にテストがないと詰みます。その関数で何がしたかったかわからないからです。
(´・ω・`)＜テストのないコードを読むの大変

### 必ず全てにテストを書くかどうか

書かない、というか、書けない。たまに聞くのは「結果的に」カバレッジが80%~85%になるのが最善、だとか。

例えば私は「外部とのIO関連で、モックの山を築かないと実現できないテスト」は実装しないことが多いです。普通は外部パッケージを利用するので、テストはパッケージのコミュニティに任せましょう。

外部とのIOがビジネスロジックから切り離されていないなら、それはテストの問題ではなく設計の問題です。

### 開発時のテスト ≠ 最終的なテスト

開発時のテストを流用することもありますが、基本的に、開発中のテストがそのまま最終的な成果物になるという想定をおいてはいけません。ケースの抜けは間違いなくあります。逆に開発中に完璧なテストケースなんて作ろうものなら、間違いなく仕様変更のたびに開発が大幅に遅れます。

(´・ω・`)＜なんで「テストを書け＝完璧なテストを書け」みたいな極端な解釈になるんだ

## まとめ

* テストファーストは設計レベルで考えたほうが良い
* 負担になるようなテストを開発初期に書かない
* テストを書くことが負担なら、プログラマの技量とか、設計とかを見直した方が良い
* テストを信奉しない

## テスト書くの大変だと思ったら

記事追加しといた。

[テストを書くかどうか議論するの不毛だから、どうやってテストを書きやすくするか議論しよう](https://qiita.com/aimof/items/419b9c20e73ba6e18a5e)
NPOIを使用したExcelのオートフィルタ機能のバグ

# 概要
　エクセルファイルをオートフィルタ機能を掛けた状態で保存し、NPOIを用いて保存処理を実行すると
クラッシュする。
　なぜクラッシュするのかは一旦置いといて、xls,xlsx形式の両方でオートフィルタが掛かっているかを
調べる方法を調査した。

# 調査結果

## xlsx形式
オートフィルタを適用しているかどうかはCT_Worksheetクラス内のfilterColumn.Countで判断できる。


    MethodInfo methodInfo = sheet.GetType().GetMethod("GetCTWorksheet", BindingFlags.NonPublic | 
    BindingFlags.Instance);  
    if (methodInfo != null)
    {    //XSSFの場合
    　　　var ct = (CT_Worksheet)methodInfo.Invoke(sheet, new object[] { });
        　　　if (ct.autoFilter.filterColumn.Count != 0)
    
    ～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～


参考サイト：https://stackoverflow.com/questions/38178326/how-to-convert-isheet-to-ct-worksheet-in-c-sharp-using-npoi-xssf

## xls形式
xlsx形式とは異なり、CT_Worksheetクラスが取得できない。
参考サイト：http://apache-poi.1045710.n5.nabble.com/Detect-or-remove-auto-filter-td5728276.html

代わりに、AutoFilterRecordクラスを用いて、オートフィルタが掛かっているかを判断する。
参考サイト：http://interoperability.blob.core.windows.net/files/MS-XLS/[MS-XLS].pdf


    HSSFSheet hSheet = (HSSFSheet)sheet;
    NPOI.HSSF.Record.Record record = hSheet.Sheet.FindFirstRecordBySid(AutoFilterRecord.sid);
    if (record != null)
    {
    ～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～

AutoFilterRecordクラスにオートフィルタに関する情報が格納されるみたい。


皆さんの参考になれば幸いです
MacBookのJIS配列キーボードをUS配列に変更する

MacBookProのJIS配列キーボードをUS配列に変更した際の備忘録

# JIS配列をUS配列に変更する

__Karabiner__ ([https://pqrs.org/osx/karabiner/](https://pqrs.org/osx/karabiner/))をインストールする

__ → System Preferences → Keyboard → Keyboardタブ → Change Keyboard Type__

と進み，__”ANSI (United States and others)”__を選択する

<img width="780" alt="Screen Shot 2018-08-01 at 11.12.18 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/99815/db3a247a-5534-5197-1955-ebc7a81fa2be.png">


# 「`」と「~」を割り当てる

MacBookのJIS配列キーボードでは，US配列の「`」「~」に相当するキーが無いので，
右上（Backspaceの左）のキーに割り当てる

Karabiner-Elementsを起動し，Simple Modificationsで以下のようにアイテムを追加する
__From key: international3__  ...  __To key: grave_accent_and_tilde (`)__

<img width="1112" alt="Screen Shot 2018-08-01 at 11.03.48 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/99815/85f15010-3629-2b36-f5f0-a477da210b4d.png">


# commandキーとcontrolキーを入れ換える

Windowsでは，CtrlキーとCaps Lockキーを入れ替えてショートカットを多用していた
Macでも同じように利用したいので，commandとcontrolを入れ替える

上の画像のようにアイテムを追加する
(個人的に，英数キーとかなキーもcommandキーの入れ替える)

* 英数キー　→　left_command
* かなキー　→　right＿command
* left_command　→　left_control
* left_control　→　left_command

# control+スペースで日本語入力

__ → System Preferences → Keyboard → Shortcutsタブ__

と進み，__Input Sources__の２つの項目にチェックを入れる

<img width="780" alt="Screen Shot 2018-08-01 at 11.11.35 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/99815/ccd877f3-5e2c-fd18-2982-7b29800c664f.png">
Mapでの連想配列を定義と for of ループと分割代入

連想配列を JavaScriptオブジェクトで使うのをやめて極力 Map を使うやり方にシフトしたいのでメモ。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map

```javascript
const mapTest = new Map([
    ['key1', 123], 
    ['key2', 456]
]);

mapTest.get('key1') == 123
mapTest.get('key2') == 456
```

for...of ループは各処理で [キー, 値] の配列を返すので、分割代入を利用して以下のようにそれぞれの値を取得することができる。

```javascript
for (const [key, value] of mapTest) {
    console.log(`${key} : ${value}`);
}

// 出力結果:
// key1 : 123
// key2 : 456
```

それぞれのキーを順番に巡回したいときは Maps.keys() メソッドが、Mapオブジェクト内の要素に対して挿入順に keys を含む新しい Iterator オブジェクトを返す機能をもっているので以下のように書くことができる。ただ大抵はkeyとvalueの組み合わせで使うので上記のループで事足りるかもしれない。

```javascript
for (const key of mapTest.keys()) {
    console.log(key);
}

// 出力結果:
// key1
// key2
```
アメリカでドローンを飛ばすためのFAA(アメリカ連邦航空局)登録方法

# はじめに 

DJI社製ドローンTelloを購入しアメリカの野外で飛ばす際に行なった申請FAA登録方法をまとめました。
FAAとはアメリカ連邦航空局（アメリカれんぽうこうくうきょく、英称：Federal Aviation Administration、略称：FAA）のことで、アメリカ合衆国運輸省の下部機関で、航空輸送の安全維持を担当する部局。米国内での航空機の開発、製造、修理、運航の全ては、同局の承認無しには行えない。本部はワシントンD.C.に置かれている。 （Wikipediaより）
と何のことやら、と思った方、FAAは何をやっているか等は知る必要は無いです。が、ドローンをアメリカで飛ばしたい・飛ばす予定の方はか・な・ら・ずこの申請は行なっておいてください！！もしやっていない事がバレると法律により処罰される可能性があります。。
15分もあれば終わります。

# 必要なもの
クレジットカード(登録料約500円(5ドル)の支払いがあります)
ドローンのシリアル番号（基本的には機体に記載があります）

# 登録方法
1.FAAホームページよりアカウント作成
-https://registermyuas.faa.gov/register

2.登録したemailアドレス宛に届いたメールをチェック

3.メール文中のリンクをクリック。

4.ポップアップの”I Agree”をクリック。
-ざっくりと解説するとアメリカにおける個人情報の取り扱い等に同意を求めるものです。

5.2つの選択肢が現れます。左がモデル航空機登録、右がドローン登録です。大きさによって登録の申請入口が異なります。

6.プロフィールの登録を行ってください。名前・住所を登録しましょう。
※現住所で良いです。日本にお住いの方は日本の現住所を登録しましょう。
※FAAからの郵便物等（届くことはないと思いますが）を現住所以外に届けて欲しい場合はMailing Addressも登録しておいてください。

7.Nextボタンをクリック。機体登録画面に移動します。

8.Add UASボタンをクリック。
※UASとはドローンのことでnmanned Aircraft Systemsの略になります。
※UAVは無人航空機のことでnmanned Aerial Vehicle, Unmanned Air Vehicleの略になります。

9.UASタイプ（購入したものであればPurchased）と製造元(例DJI)、モデル名、シリアル番号を入力します。NICKNAMEも必須となりますのでドローンに任意で名前を付けちゃいましょう。

10.Addボタンを押すと登録済みドローンを確認できます。支払いに進むためにCheckoutをクリックしましょう。

11.注意書きを読みNextをクリック。

12.支払い情報を入力します。
※登録時から有効期限は3年と注意書きがありますので、忘れないようにしておいてください。

13.支払いの確認が完了すると登録済みE-mailにメールが届きます。

14.登録したドローンのRegistration番号が表示されます。Small UAS Certification of Registrationと共にCertificate Number＝これが登録番号です。が表示されます。このデータはデータとして保管の他にコピーなどをしておいてください。さらに登録番号を紙にコピーし、車のナンバープレートのようにドローンの機体に貼っておきましょう。

以上でFAA登録は完了です。いかがでしたか？日本語のサポートがないため少し敷居が高いように感じたかもしれませんが、これであなたもドローンをアメリカ国土で飛ばす事ができる権利をGetしました！DJI社のホームページ等でフライトマップ（どこで飛ばせるかを表示してあるマップ）があるので飛ばす前に必ず確認してくださいね！
-https://www.dji.com/jp/flysafe/geo-map
では、Enjoy your drone life!
[統計] 見せかけの相関と偏相関係数

2回目の投稿です。
~~会社であまりやることがないので~~Kaggleのようにガンガン手を動かす取り組みもいいけど、なあなあにしてきた統計の基礎知識ってきっちりつけないとダメだよねと感じたので、現在この本を使ってお勉強しています。

[統計学入門 (基礎統計学Ⅰ)   東京大学教養学部統計学教室](https://www.amazon.co.jp/dp/4130420658/ref=cm_sw_r_tw_dp_U_x_6TvyBbB69C3C4)

ということで、今回はこの本の第3章から、統計を学び始めた人が勘違いしやすい「見せかけの相関」と「偏相関係数」について私が好きな野球のデータを使って解説しようと思います。
基本的な統計知識なのでここを見るような方には釈迦に説法だと思いますが、自身への備忘録も兼ねて。

# 見せかけの相関とは

あるデータ系列$A=[a_1, a_2, ... , a_n]$と$B=[b_1, b_2, ... , b_n]$の相関係数(の絶対値)が高い値を示すが、両者の間に直接の因果関係・相関は無く、**介在する第3のデータ系列$C=[c_1, c_2, ... , c_n]$とA/Bの相関の高さによってAとBにも相関があるように見える**現象のこと。

私の書き方がヘタクソなのが最大の原因ですが、文字で書いてもピンと来ないと思うので野球データをもとにして実例を挙げます。

有難いことに、MLBに関しては下記サイトで歴代の個人成績データが提供されています。
[SeanLahman.com](http://www.seanlahman.com/baseball-archive/statistics/)
NPBもこういうのやってくれたらいいんですけどね。。~~公式サイトがあの有様だとあと50年ぐらいかかりそう~~
*2017 – comma-delimited version – via Baseball Databank project* のリンクから2017年度までの選手データがcsvでダウンロードできますのでどうぞ。

落としたデータの中から、選手ごとのシーズン打撃成績データを読み込みます。
簡単のために2000年以降のデータに絞ります。

```py
import pandas as pd
import numpy as np
import math

#見かけ上の相関と偏相関係数についてMLBのデータから学ぶ

#打撃成績を取得
bat = pd.read_csv("./baseballdatabank-master/core/Batting.csv")
#2000年～2017年まで抽出
bat = bat[bat["yearID"]>=2000]
```

では、最もポピュラーであろうシーズン安打数とシーズン三振数の相関を計算してみましょう。

```py
#安打数と三振数の相関を計算する
corrcoef_h_so = np.corrcoef(bat["H"],bat["SO"])[0,1]
print("Correlation coefficient between hits and strikeouts: {0}".format(corrcoef_h_so))

# Correlation coefficient between hits and strikeouts: 0.8895936528559321
```

相関0.89と出ました。18年分、MLB30球団の全選手のデータを使っているのでサンプル数は十分なはず。
ということは、**三振をする選手ほど安打を打つことが出来る優秀な選手**ということでしょうか？

そんなはずはないですね。この2指標の相関が高く出るのは、

- 打席数が多いほど三振数が増える
- 打席数が多いほど安打数が増える

というように、「打席数」という隠れた指標とこの2指標の相関が高いことが理由です。
実際、上記データにおいて打席数と三振数の相関は0.92、打席数と安打数の相関は0.99にもなっています。
これが**「見せかけの相関」**です。

# 偏相関係数とは
上で述べたケースにおいて、安打数と三振数の相関性をより正しく分析するには、**「打席数」の影響を排除した「安打数」と「三振数」の相関係数**を求める必要があります。
これが**「偏相関係数」**になります。

偏相関係数の求め方はこうです。
データ系列A,B,Cがあり、AとB,BとC,AとCの相関係数をそれぞれ$r_{AB},r_{BC},r_{AC}$と表す時、
データ系列Cの影響を排除したデータ系列AとBの相関係数(データ系列AとBの偏相関係数)$r_{AB・C}$は

```math
r_{AB・C} = \frac{r_{AB}-r_{AC}r_{BC}}{\sqrt{1-{r_{AC}}^2}\sqrt{1-{r_{BC}}^2}}
```

実際に先ほどの例を使って、「安打数」と「三振数」の偏相関係数を求めてみましょう。

```py
#打席数の影響を除いた安打数と三振数の偏相関係数を計算する
p_corrcoef_h_so = float(corrcoef_h_so-corrcoef_ab_h*corrcoef_ab_so)/float(math.sqrt(1-corrcoef_ab_h*corrcoef_ab_h)*math.sqrt(1-corrcoef_ab_so*corrcoef_ab_so))
print("Partial correlation coefficient between hits and strikeouts: {0}".format(p_corrcoef_h_so))

# Partial correlation coefficient between hits and strikeouts: -0.4387090916909891
```

偏相関係数は-0.44でした。したがって、打席数の影響を排除すると、三振が少ないほど安打が増える傾向にあるということが読み取れます。

#おわりに
今回の例は(特に野球を知っている人には)極めて単純な例であり、「こんなのミスリードされるわけないやろ」と感じると思います。
そもそも野球というフィールドでは、三振はともかく、安打は「数」ではなく「率」で評価することが殆どなので、その場合は打席数の影響が最初から排除されていますからね。

しかし野球とは関係ない、特に自分が初めて触れる種類の実データを扱っていると、ついついこの「見せかけの相関」に騙されて誤った結論を導きかけることも有り得るのではないでしょうか。
少なくとも私はまだデータ分析初心者なので時々ひっかかります(笑)

今後気を付けようと感じました。

#次回

前回の投稿で触れたHome Credit Default RiskコンペはDeadlineまでまだ1ヶ月近くあるので終わってから書く予定です。
failed call to cuInit: CUDA_ERROR_NO_DEVICE

備忘録

突然GPUではなくCPUで学習されていたため、調査

python開いて
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
を実行、すると


2018-08-01 09:53:52.674706: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2018-08-01 09:53:52.674743: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2018-08-01 09:53:52.674755: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2018-08-01 09:53:52.674765: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2018-08-01 09:53:52.674775: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
2018-08-01 09:53:52.698489: E tensorflow/stream_executor/cuda/cuda_driver.cc:406] failed call to cuInit: CUDA_ERROR_NO_DEVICE
2018-08-01 09:53:52.698581: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:158] retrieving CUDA diagnostic information for host: chopin
2018-08-01 09:53:52.698624: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:165] hostname: chopin
2018-08-01 09:53:52.698699: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:189] libcuda reported version is: 384.111.0
2018-08-01 09:53:52.699152: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:369] driver version file contents: """NVRM version: NVIDIA UNIX x86_64 Kernel Module  384.111  Tue Dec 19 23:51:45 PST 2017
GCC version:  gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 
"""
2018-08-01 09:53:52.699223: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:193] kernel reported version is: 384.111.0
2018-08-01 09:53:52.699246: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:300] kernel version seems to match DSO: 384.111.0
[name: "/cpu:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 1341842



と出る。どうやら使用するGPUが指定されていないらしい。

なので
export CUDA_VISIBLE_DEVICES='0'

で使用するGPUを直接指定してやれば動作する。

筆者はなぜか.bashrcにexport CUDA_VISIBLE_DEVICES='' が書き込まれていて発狂していた。
【Rails】validates_format_ofを使ってformat指定を複数適応させる

##実現したいこと
すでにURIのformat指定をしていたわけだが、もう一つformat指定したいと思った。

```
validates :url, format: /\A#{URI::regexp(%w(http https))}\z/
#ここにもう一個urlのformatを指定したい
```

しかし、下にもう一個同じモデルでvalidationを立てればオーバーライドしてしまうだけで、実際に適応されるvalidationは一つのみになってしまう。

今回はこれを解決すべくいろいろ試してみた。

##試したこと
ドキュメントをみると`validates_format_of` というformに特化したメソッドがあり、オプションには
`with` ・・・　正規表現を適応させるformat
`without` ・・・正規表現をかけたくないformat
とあった。

参考: http://railsdoc.com/references/validates_format_of

今回はドメイン名にbit.lyを含めたくないので、以下のようにオプションを指定。


```
validates_format_of :url, with: /\A#{URI::regexp(%w(http https))}\z/, 
                          without: /\A(http|https):\/\/bit.ly/  
```

```
Either :with or :without must be supplied (but not both)
```
しかし、どっちかにしろと怒られてしまった。。

これではbit.lyを含んだurlもしっかりパスしてしまう。

さらに`before_validation`で追加もしたがこれもダメ。


```
before_validation :sub_format

def sub_format
  url =~ /\A(http|https):\/\/[^bit.ly]/ 
end
```

##バリデーションもう一個追加で解決
バリデーションをもう一個書いたらちゃんと両方ともバリデーションがかかりました。

```
validates_format_of :url, with: /\A#{URI::regexp(%w(http https))}\z/
validates_format_of :url, without: /\A(http|https):\/\/bit.ly/  
```
ここで注意したいのが、**withoutで指定したほうは正規表現に含めたくないもの、すなわち否定系**になることに気をつけていただきたい。


参考: https://stackoverflow.com/questions/19032445/validates-format-of-with-uriregexpwhttp-https-issue
API Managementで管理しているAPIを外部から実行すると失敗する時の対処法

# API Managementで管理されたAPIの実行が失敗

Azure FunctionsでAPIを作成し、API Management上のテストでは成功したのですが、
Azure BLOBからAPI Managementで管理されたAPIを実行すると、以下のエラーが出ました。

    No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '<BLOB URL>' is therefore not allowed access.
    
理由を調べたところクロスドメインの制限がかかっているから、
CORSの設定が必要みたいです。

詳しい解説は下記の動画が勉強になります。（英語ですが）

https://azure.microsoft.com/en-us/resources/videos/cors-and-api-management/

# API Management でのCORSの設定方法

AzureポータルからAPI Management→「API」タブ→作成したAPI→「デザイン」タブの順に進みます。
下記の図のように、Inbound processingの右上の三角をクリックし、「Code editor」を開きます。

![api_edit.png](https://qiita-image-store.s3.amazonaws.com/0/226827/adb807fb-063c-5456-a9b0-10a62e2e1591.png)

CORSを`<inbound>`タグに追加し、allow-credentialsを`false`にします。

![add_cors.png](https://qiita-image-store.s3.amazonaws.com/0/226827/0a12748e-93b4-c0cb-55de-a53557d3c38b.png)

制限をかける場合は適宜`*`を置き換えてください。
後は設定を保存すれば、無事にAPIの実行ができます。
Ruby on Railsで、そんなページは無いわよ（404エラーページ）のフロント実装をする時にやる事

# Railsでエラーページのフロント実装確認

## 背景

- ローカル開発環境で、無いURLを入れた時に出てくる「そんなページはないわよ」が出るエラーページのフロントUI実装をしようとした
- 意図的に出そうと無いURLを入れたが、エラーページは出ずRails自体の赤と黒と白の英語のやつが出た
- そのデバッグページを出すためのRailsなのだから、それはそうだ

## やった事
- `consider_all_requests_local`で検索して全部 `false`に
- サーバー再起動
- 無いURLを入れた
- 「そのようなページはございません！」出た

## 注意点
- 作業が終われば`consider_all_requests_local`の`false`にした箇所は元に`true`に戻しておく

参照：
http://yachibit.hateblo.jp/entry/2014/03/06/010021
Rails  ExecJSのエラーについて

#始めに
ExecJSのエラーが発生した時の対応方法についての備忘です

#環境
OS:Windows10 pro
Rails:5.0

#どのようなエラーが発生したか？
##問題の背景
新しいWindowsマシンにRailsの環境構築した時のお話です
モジュールはGitHubからクローンしています
ちなみに、旧環境ではエラーは発生していません
##発生したエラー
サーバを起動してトップページにアクセスしたところ、
「ExecjsRuntimeError」
が発生しました
ログを見た感じだと、Turbolinkの変換がうまくいっていないように見えました。
私の環境ではReact.jsモジュールを使っていることもあり、JavaScriptのトランスパイルかアセットパイプラインがうまくいっていないのでは、推測しました。

#エラーの解消方法
以下の対処をしたところエラーは起こらなくなりました

 - GemFileのgem 'therubyrhino'をコメントアウトする
 - Node.jsをインストールする
 - サーバー再起動

#最後に
「ExecjsRuntimeError」でググると「Node.jsをインストールする」という解消方法は検索結果に出てこなかったので、この記事を書いてみました
何かのお役に立てれば幸いです
Googleスプレッドシートに新規追加されたタスクをSlackで通知する（Google Apps Script）

似たような記事たくさんありそうだが、[Incoming WebHooks](https://api.slack.com/incoming-webhooks) の仕様も逐一変わっているようなので。

個人的にTrelloでタスク管理しているのに、偉い方から「君のタスクを把握したいので、スプレッドシートにまとめて欲しい」という依頼を受けてしまった場合を想定。


Slack側でWebHook URLを取得し、Googleスプレッドシート側でSlack通知用関数を実装するまでは下記を参考に。
参考：[Google Apps Scriptを使ってSlackに自動で定期通知をする方法](https://www.virtual-surfer.com/entry/2018/03/15/190000)

```javascript
//受け取ったtextをslackに通知する
function slackPost(text){
  var url     = '';
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : JSON.stringify({
      "channel" : "channel", // 通知先チャンネル名(DM時は@を忘れず)
      "text" : "【 " + text + " 】のタスクが追加されました\n (スプレッドシートURLなど)",
    })
  };
  UrlFetchApp.fetch(url, options);
}
```

スプレッドシート側では通常の更新項目に、通知用の作業列を加えておく。

| タスク名| 項目B| ...| 項目N| 通知フラグ|
|-----:|-----:|-----:|-----:|-----:|
| ...| ...| ...| ...| TRUE|
| ...| ...| ...| ...| TRUE|
| ...| ...| ...| ...| FALSE|


ここまで準備できたら、先程定義した`slackPost`関数を
メインとなる`notifyTask`関数側で呼び出す。

```javascript
function notifyTask() {
  var notifySheet = SpreadsheetApp.getActiveSpreadsheet(); //シートの取得
  var range = notifySheet.getRange("A1:A1000");
  
  //最後の列まで順にチェック
  for (var i = 1; i < notifySheet.getLastRow(); i++){
    if ( notifySheet.getRange("A" + i).getValue() != "" ){
      if (notifySheet.getRange("O" + i).getValue() == false){

        //「通知フラグ」がFALSEだった場合にはTRUEに書き換え
        // かつ「項目A」の内容をSlackで通知
        notifySheet.getRange("B" + i).setValue(true);
        var postText = range.getCell(i,1).getValue();
        slackPost(postText);
      }
    }
    else{
      break;
    }
  }
}
```

Apps Scriptのプロジェクト起動トリガーを”シートの更新”にすることで、
スプレッドシートに何かしら追記があった場合に「通知フラグ」カラムをチェックし、
FALSEのものが見つかったらSlack通知＋フラグをTRUEに変更する。
OpenCVでFCNのSemantic Segmentationを試す

まず

http://shibafu3.hatenablog.com/entry/2017/03/28/164125

を参考にOpenCVとcontribを導入

導入が済んだら
~/Source/opencv/samples/dnn/fcn_semsegm.cpp
がFCNのプログラムなので、これを起動したい。

~/Source/opencv/samples/samples/dnn
に置いてある

pascal-classes.txt
fcn8s-heavy-pascal.prototxt
rgb.jpg

をすべてfcn_semsegm.cppのあるフォルダにコピー

その後、学習済みのモデルをダウンロードしたいので

http://dl.caffe.berkeleyvision.org/fcn8s-heavy-pascal.caffemodel
で検索、するとfcn8s-heavy-pascal.caffemodelが勝手にダウンロードはじまる（ファイルサイズ538MBあるから注意）

これも同様にfcn_semsegm.cppのあるフォルダに置く

そしたらfcn_semsegm.cppのあるフォルダに移動して
cd ~/Source/opencv/samples/dnn

g++ fcn_semsegm.cpp -o fcn_semsegm `pkg-config --libs opencv`

でコンパイルするとfcn_semsegmっていう実行ファイルが作成されるから

./fcn_semsegm rgb.jpg

とコマンドを打てばrgb.jpgの画像でFCNのsemantic segmentationが起動できる。




この記事は
http://bfin.sakura.ne.jp/?p=976
の「fcn_semsegmデモ」を参考にした
Django の小技とパッケージまとめ

## この記事について

自分が普段使っているようなパッケージやコマンドのメモです。

## パッケージ
### 共通
`pip install django django-cors-headers django-debug-toolbar django-filter djangorestframework djangorestframework-camel-case drf-yasg`

### プロダクション
`pip install gunicorn django-storages`
django-storages は Google Cloud Storage だと バグってしまい CSS などの path がちゃんと表現されないので `https://github.com/gregmccoy/django-storages` を使っている。( **現在は不明** )
インストール方法は `pip install git+https://github.com/gregmccoy/django-storages --upgrade`。

## 小技
### Django Admin User
1. manage.py でスーパーユーザー作る
2. `python3 manage.py dumpdata auth.User --indent 4 > app/fixtures/initial_data.json` でプロジェクト作成時にできるアプリケーションのディレクトリにフィクスチャを入れる
3. 読み込みは `python manage.py loaddata ./app/fixtures/initial_data.json` で行う(スーパーユーザーは明示的に fixture ファイルを指定する)

### receiver
1. `Model.objects.filter(col=col).update(col=col)` でモデルを更新すると `post_save` シグナルを発信しない

## 便利なパッケージ
### django-cleanup
[django-cleanup](https://github.com/un1t/django-cleanup) は pip で入れて INSTALLED_APPS に追記するだけで ImageField 等で登録したファイルで不要なものは自動的に削除される

### django-mptt
[django-mptt](https://github.com/django-mptt/django-mptt) は木構造（カテゴリーなど）を表現したい時に便利

### django-channels
[django-channels](https://github.com/django/channels) は websocket を利用できるようにする。ただし本番で使うには uwsgi とかむずそう…。

### graphene-django
[graphene-django](https://github.com/graphql-python/graphene-django) は GraphQL を利用できるようにする。ただし `n + 1` 問題を解決してなさそう。

### django-constance
[django-constance](https://github.com/jazzband/django-constance) は動的に共通の設定を持ちたいときに使えそう。ただし DB や redis で管理されるので git 管理できない点は注意。
Healthkitで初回のrequestAuthorization後に画面がタップできなくなる問題とその対処

### 発生を確認した環境

- Xcode 9.4.1
- Swift 4.1
- iOS11.4

### 現象
Healthkitで初回のrequestAuthorization完了後に画面がタップできなくなる問題が発生しました。

```swift

let healthStore = HKHealthStore()

healthStore.requestAuthorization(toShare: shares, read: reads, completion: { success, error in

  // ここから画面がタップできなくなる
}
```

### 原因
Healthkitが表示したUIWindowが、認証完了後も消えず前面に重なって表示され続けているためでした。

![window.png](https://qiita-image-store.s3.amazonaws.com/0/72194/17524404-4067-f756-898c-ad3bd5c76a4f.png)

### 対処

このWindowは不要と思われるので削除したいところですが、まっとうに削除する方法がないため、以下のようにアプリのメインであるwindowとHealthkitが表示したwindowのwindowLevelを入れ替えることで対処しました。

```swift

DispatchQueue.main.async {
    
    for window in UIApplication.shared.windows {
        if window.windowLevel == 999.0 {
            window.windowLevel = 0.0
        }
    }
    
    if let appDelegate = UIApplication.shared.delegate {
        appDelegate.window??.windowLevel = 1.0
    }
}
```
iPhoneの時間の位置とナビゲーションバーのタイトルの位置がずれる

<img width="320" alt="Simulator Screen Shot - iPhone 4s - 2018-08-01 at 15.34.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/57412/ce83591e-9623-d46f-e309-3ae42791af9c.png">

画像を見ると時間の表示される位置と
ナビゲーションバーのタイトルの表示位置がずれます。
表示しているのは設定のアプリですが、
自作のアプリでもそうなります。

この仕様は修正可能でしょうか。
nodebrewでNode.jsをアップデートする

久しぶりにバージョンを確認したら中々古いものだったのでアップデートしまして、その流れを忘れないように備忘録も兼ねて。

# そもそもnodebrew入ってないよ！という人は
`curl`コマンドでインストールして

```sh
curl -L git.io/nodebrew | perl - setup
```

PATHを通して

```sh
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

設定ファイルをリロードして

```sh
source ~/.bashrc
```

インストールできたか確認

```sh
nodebrew help
```

おしまい！

# nodebrewでNode.jsをインストール
インストールのコマンドは幾つかあってこんな感じです。

```sh
# バージョン指定でインストール
nodebrew install-binary {version}

# 安定版インストール
nodebrew install-binary stable 

# 最新版インストール
nodebrew install-binary latest 
```

基本的には`install-binary stable`で安定版インストールが良いと思います。
安定してなくて良いからとにかく最新のやつ！という方は`install-binary latest`で。

このバージョンでやりたい、という方は`install-binary {version}`でバージョンを指定してインストールしましょう。
`{version}`のところは`v1.0.0`みたいな感じで指定します。

`install-binary`と`install`とありますが、
通常の`install`は使う場面があるのか不明だったので載せていません。
（`install-binary`なら数秒で終わるのが、`install`だとソースからコンパイルしている影響で数十分かかったりする。）

# インストールしたバージョンのリストを表示
ちゃんとインストールできたか確認してみましょう。
下記のコマンドで、インストールしたバージョンを表示できます。

```sh
nodebrew list
```

# 使用するバージョンを指定
Node.jsのインストールができたら使用するバージョンを指定してあげましょう。
バージョンの指定コマンドも幾つか種類があります。

```sh
# インストールしたリストの中からバージョンを指定
nodebrew use v0.1.99

# インストールしたリストの中からv0.1系の最新版を指定
nodebrew use v0.1.x

# インストールしたリストの中から安定版を指定
nodebrew use stable

# インストールしたリストの中から最新版を指定   
nodebrew use latest
```

基本的にはインストールしたものの中から最新のバージョンを指定してくれる`latest`で良いと思いますが、
安定版と最新版の両方をインストールしていて安定版を指定したいという時は`stable`にすれば良いのではないでしょうか。

# バージョンの確認
バージョンの指定ができているか確認してみましょう。
下記のコマンドで、現在のNode.jsのバージョンが確認できます。

```sh
node -v
```

指定したバージョンが表示されたらアップデート完了です。
個人学習メモ#12　文字列をhtmlの要素に変換する

omachizura様のサイトから引用です。
[javascript|文字列をhtmlの要素(DOM element)に変換する](http://omachizura.com/note/%E6%96%87%E5%AD%97%E5%88%97%E3%82%92html%E3%81%AE%E8%A6%81%E7%B4%A0(DOM%20element)%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B.html)

ローカルで実装してみました。
こういう方法もあるんですね、勉強になりました。

※リンクだけの内容はあまりよろしくないとの指摘を頂いたので、修正しました。

出てきたコード
-

createElement=要素を追加する

innerHTML=HTML要素の中身を変える

.appendChild()=指定した要素の子ノードのリストの最後に、ノードを追加する

.getElementById=任意のHTMLタグで指定したIDにマッチする要素を取得する

.removeChild=子ノードを取り除く
Macで画像のトリミングをしたい時

http://inforati.jp/apple/mac-tips-techniques/multimedia-hints/how-to-clip-or-reverse-or-turn-picture-with-mac-preview-app.html

この通り選択して切り取りまではできたがそこからわからなかった

「ファイル」→「クリップボードから新規作成」


と選択していくとうまくいけた
Firefox + Selenium で全画面キャプチャをするたぶん簡単な方法

## 何が問題なんでしたっけ？
昔のFirefoxは全画面キャプチャが取れたけど、geckodriver 経由で操作するようになったあたりから、キャプチャが可視範囲でしかとれなくなった。

そもそもブラウザごとばらばらであり、そういうものらしい。
参考: https://qiita.com/meganetaaan/items/b11338d2867c8c8f072a

ということで、どうしても全画面キャプが欲しいときは、JSで可視範囲を動かし、画像を結合する方法が上の記事でも紹介されています。
僕もこれを参考にいままでやっておりました。でも、サイドバーついてきちゃったり、なんか遅延表示とかでずれたり、縦に長い画面で時間がかかったり、ギャア！ しんどい！ ってなって。具体的には昨日なって。

要件にもよるのですが、表示されてること分かれば良いとか、ゆるい要件の場合、もっとサクッとやりたい気持ちがある。で、ちょっと試行錯誤してたら、なんか出来た。


## 結論から
言ってしまえば簡単なんだけど、windowのサイズを内部のサイズにあわせて広げたらうまくいった。一発で撮れるし楽すぎる。

- Ubuntu 16
- Firefox 61.0.1
- GeckoDriver 0.18.0
- Python 3.6.1
- Selenium 3.4.3


``` test.py
url = ''
img_file_save_path = ''

driver = webdriver.Firefox()
driver.get(url)
total_width = driver.execute_script("return document.body.offsetWidth")
total_height = driver.execute_script("return document.body.parentNode.scrollHeight")
driver.set_window_size(int(total_width), int(total_height))
time.sleep(2)
driver.save_screenshot(img_file_save_path)
```

## 補足
ほかのOSでできるかやってないのと、ずっとできるかは知らない。


おしまい
forEach vs map in JavaScript

ある会社の面接でforEachとmapの違いを聞かれて、十分な回答ができず後悔。。
forEach、map、filterの違いをまとめました。


## 比較

|     |       forEach |    map    |  filter    |   
|:-----------------|:------------------|:------------------|:------------------|
| 動作             | 配列の全要素に対して関数を一度ずつ実行。| 配列の全要素に対して関数を一度ずつ実行。returnを返さない場合、新しい配列のindexが同じ場所にundefinedが入る。 | 配列の全要素に対して関数を一度ずつ実行。実行結果がtrueの要素を新しい配列に挿入する。|
| 返り値           | 不要 | 要 | 要 |
| 返す値            | undefined | 新しい配列　|新しい配列　|
| 元々の配列の変更           | 可 | 不可　|不可　|
| 新しい配列のサイズ            |       | 元々の配列の数  |実行テストに通った要素の数  |
|速度            |速い |遅い | |
|使用例  |配列の全要素に対して同じ関数を実行させたいが、返り値が不要、もしくは元々の配列を変更させたい場合　|配列の全要素に対して同じ関数を実行させて新しい配列を作りたい場合  |配列の全要素に対して同じ関数を実行させ、実行テストに通った要素で新しい配列を作りたい場合  |

## コードの例

```forEach.js
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let newArr = []
arr.forEach((item, index) => {
 if (item % 2 == 0 ) { arr[index] = item * 2 }
})
```

```map.js
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let newArr = arr.map((item) => {
 return item * 2
})

```

##　速度の比較
<strong>map VS forEach</strong>
<img width="908" alt="Screen Shot 2018-08-01 at 2.12.58 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/157309/b88fdc52-da73-a511-0b6b-2a04da970361.png">

`mapのほうが速い。`
ブラウザによっても結果が少し異なると思うが、forEachのほうが３０％程遅いとの結果がでた。

## ポイント
・`forEach()`と`map()`は書き換え可能。
・`map()`は新しい配列をメモリに割り当て、新しい配列を返す（元の配列とサイズは同じ）。`forEach()`は新しい配列を返さず、常に`undefined`を返す。
・`forEach()`は元の配列を変更可能。`map()`は元の配列を変更せず、新しい配列を返す。
・`forEach()`よりも`map()`のほうが処理速度が高い。
・`filter()`は実行テストを通った値を新しい配列として返すため、実行テストに通った要素数が配列の要素数となる。`map()`は元の配列とサイズが同じ。
データ構造

#データ構造の種類
配列　メモリ使用量は少ないが宣言時に長さを決める必要があるため、要素の追加などが苦手
List 重複可能で要素を順番に扱えるデータ構造
Set 重複不可能で、順序保証なしのデータ構造
Map 重複した場合、一番新しい要素に置き換えられる



#ArrayList
特徴
配列の長さを気にしなくてよく、気軽に要素の追加を行える。要素の順番は、追加された順番である。

メソッド
add 要素の追加
get 要素の取り出し

例

```java
array.add("フランス");
String country = array.get(2);
System.out.println(country);
```

```test:出力
フランス
```

要素のソート

```java
Collections.sort(ArrayListの名前);
```

#HashMap
特徴
要素をキーと結びつけ、キーによって要素を取り出すというデータ構造。また、重複を許さない。要素の順番は、入れた順番ではない。

メソッド
put 要素の追加
get 要素の取り出し
getOrDefault 要素の取り出し、なかったら指定したdefault値を返す
keySet keyを全て返す

例

```java
HashMap<String,String> map = new HashMap<String,String>();
map.put("りんご", apple");
map.put("ぶどう", "grapes");

System.out.println(map.get("りんご"));
System.out.println(map.getOrDefault("パン","レーズン"));

System.out.println();

for(String key:map.keySet()){
System.out.println(map.get(key));
}

```

```text:出力
apple
レーズン

apple
grapes
```

要素のソート

```java
Map<String, String> sortedMap = new TreeMap<>(HashMapの名前);
```

#TreeSet
特徴
配列の長さを気にしなくてよく、気軽に要素の追加を行える。また、重複を許さず、自動的にソートされる。要素を取り出す際には注意が必要。

メソッド
add 要素の追加
remove 要素の削除
isEmpty 要素が空だったらtrueを返す

例

```java
TreeSet<String> ts = new TreeSet<String>();
ts.add("C");
for (String a : ts) {
   System.out.println(a);
}
```

```text:出力
C
```

引用、参考
https://www.javadrive.jp/start/
https://eng-entrance.com/java-array-list
Reactのイベントコールバックで非同期にeventオブジェクトを参照する

Reactでイベントコールバックの`event`オブジェクトに非同期でアクセスしようとするとエラーが出て怒られる｡例えば､`setState`の第二引数のコールバック内で`event`を参照しようとした時とか｡

```javascript

function clickHandler(event) {
  this.setState({
    foo: 'bar'
  }, function () {
    console.log(event.target.value); // error
  });
}
```

## なぜ参照できないか

Reactのドキュメントの[Event pooling](https://facebook.github.io/react/docs/events.html#event-pooling)に書いてあった｡

> The SyntheticEvent is pooled. This means that the SyntheticEvent object will be reused and all properties will be nullified after the event callback has been invoked. This is for performance reasons. As such, you cannot access the event in an asynchronous way.

簡単に説明すると､`event`オブジェクトはReactによって`SyntheticEvent`オブジェクトとしてラップされていて､パフォーマンスのために使いまわしてますよ｡その関係で､イベントコールバックが実行され終わったら全てのプロパティを`null`にするから､非同期ではアクセスできませんよ､ということらしい｡

## 解決策

これもドキュメントの同じ項に書かれている｡

> If you want to access the event properties in an asynchronous way, you should call event.persist() on the event, which will remove the synthetic event from the pool and allow references to the event to be retained by user code.

非同期でアクセスしたかったら`event.persist()`使ってくれ､と書かれている｡なのでイベントコールバックの中で呼んであげれば非同期で`event`を参照することができる｡

```javascript

function clickHandler(event) {
  event.persist();

  this.setState({
    foo: 'bar'
  }, function () {
    console.log(event.target.value); // ok
  });
}
```