OmniAICreator/Qiita-1.07M huggingface dataset:
思考実験：VSTePで既存のテストにパブリックベータテストを追加する

##1. はじめに
2018/12/26に開催された[リリカルにVSTePを語る夕べ](https://kataruyube.connpass.com/event/111127/)([togetterまとめ](https://togetter.com/li/1302325))で[VSTeP](http://qualab.jp/vstep/)の一番の特徴は「NGTで図と線で描くテストコンテナ」という話がありました。また、リリカルさんはテスト要求分析を、みっきーさんはテストアーキテクチャ設計をVSTePの特徴として挙げられていました。

筆者はほかにもQAアーキテクチャとの親和性やシステムテストに限定されないこともVSTePの特徴かつすごいところと思います。そこでパブリックベータテストを題材にVSTePの魅力を探ります。

##2. VSTePのここがすごい
筆者の考えるVSTePのすごいところを以下に示します。

1. テストコンテナの柔軟性
2. QAアーキテクチャとの親和性
3. システムテストに限定されない

###2.1 テストコンテナの柔軟性
- テストコンテナは複数のテスト観点をグルーピングしたものです。
- テストコンテナ図で表現するとテストの全体像を俯瞰しやすくなります。
- 語る夕べでは「いろいろ突っ込める便利な箱」と解説されていました。

![vstep_testcontainer01.png](https://qiita-image-store.s3.amazonaws.com/0/221758/c15145d9-6243-b2a4-a097-bea2ed5db5f8.png)
(参考：[QAアーキテクチャの設計による説明責任の高いテスト・品質保証 ](https://www.slideshare.net/YasuharuNishi/qa-67559281) p.37-p.38)

###2.2 QAアーキテクチャとの親和性
QAアーキテクチャは[「QA勉強会「ここは苦しいところですが、どうか一つ、QAアーキテクチャを。」](https://connpass.com/event/46298/)の資料[QAアーキテクチャの設計による説明責任の高いテスト・品質保証](https://www.slideshare.net/YasuharuNishi/qa-67559281)をご参照ください。

この資料のp.73～p.77にアシュアランスパイプラインや工程の責務の話があるのですが、テスト観点の元になるものとして工程の責務を果たすのに必要と思える取組みや心配ごと、関心ごとがあります。また、VSTePでリファインすることでパイプラインの最適化を図れるそうです。

###2.3 システムテストに限定されない
アシュアランスパイプラインの工程はシステムテストに限りません。ソフトウェア開発の全工程がSQAのスコープですのでシステムテストに限定されないのはメリットです。

##3. 思考実験：既存のテストにパブリックベータテストを追加する
思考実験として2.1節で図示したプロジェクトが使用性[^1]を評価するために新たにパブリックベータテストを行うことを想定し、2.1節のテストコンテナにパブリックベータテストを追加します。

まずパブリックベータテストとラベルを貼ったテストコンテナを配置します。ひとまず何でも配置できるのがテストコンテナの良いところです。
![vstep_testcontainer11.png](https://qiita-image-store.s3.amazonaws.com/0/221758/09c5f50c-d062-4299-40b5-2fb739606a8a.png)

パブリックベータテストというテストコンテナがあることでベータテスターへβ版をリリースする前に何かしらテストをする必要がありそうだとわかります。そこで、何をするかはさておき「パブリックベータリリース前テスト」とラベルを貼ったテストコンテナを配置します。
![vstep_testcontainer12.png](https://qiita-image-store.s3.amazonaws.com/0/221758/b114fcd7-558a-a995-e715-92232941c5d7.png)

ここでパブリックベータリリース前テストの工程の責務を挙げます。一例を以下に示します。

1. 使用性確認の妨げとなる不具合が摘出されていることを確認する
2. パブリックベータでテストする機能が動作することを確認する
3. パブリックベータ版では伏せておく機能がマスクされていることを確認する

次にテスト観点にブレークダウンします。1はテストを行うことで結果的に得られるとすると、2の機能テストと3の機能マスクテストがテスト観点として得られます。
![vstep_testcontainer13.png](https://qiita-image-store.s3.amazonaws.com/0/221758/40ffc0c9-958b-663c-8f56-e6d71aa7c57f.png)

パブリックベータテストを実施するには少なくとも、1)テスト対象の機能(プログラム)ができていて、2)ベータテスターによる使用性の確認を妨げるような不具合が摘出されている必要があります。時期的には早くても結合テストをパスしシステムテストの一周目のテストサイクルが終わって不具合の修正を終えたあたりでしょうか。また、パブリックベータテストでテストする機能は正式リリースで提供する機能でもありシステムテストで準備するテストを流用できると考え、リソースの問題はひとまず置いておいてパブリックベータリリース前テストをシステムテストにまとめます。
![vstep_testcontainer14.png](https://qiita-image-store.s3.amazonaws.com/0/221758/74425930-892a-8d84-2246-38c4568041d1.png)

以上、パブリックベータテストやこれに伴って発生するテストをVSTePの技法を用いて2.1節のテストコンテナに追加しました。この新しいテストコンテナもまたVSTePの成果物なので「機能テスト」「機能マスクテスト」というテスト観点を詳細化したりコンテナを整理してパイプラインを効率化したりするなどVSTePで統一的に扱うことができます。

##4. おわりに
パブリックベータテストは必ずしもテストの専門家ではない有志のユーザが任意に操作して行うためテストアーキテクチャはこれといってありませんし使用性テストというテスト観点はほかのテストコンテナと粒度が揃っていませんが、VSTePはそんな一風変わったテストでも統一的に扱うことができてすごいと思います。

[^1]: パブリックベータテストの目的は使用性だけとは限りませんがソフトウェア品質知識体系(SQuBOK)ガイド第2版でベータテストが使用性の技法の一つとして取り上げられていますのでそれに合わせました。
AMP仕様の要点まとめ

こんにちは、Enigmo 新卒エンジニアの[@sean0628_i](https://twitter.com/sean0628_i)です。
[**Enigmo Advent Calendar 2018**](https://qiita.com/advent-calendar/2018/enigmo) 2日目の記事です。

## 初めに
Accelerated Mobile Pages の略であり、高速でスムーズにWeb ページを表示するためのライブラリー、或いはその仕組みのことです。
通常のHTML に比べて、制限が多く存在します。
今回は[AMP 公式のドキュメントの仕様に関する箇所](https://www.ampproject.org/ja/docs/fundamentals/spec)が英語だったので、読解し要点をまとめます。

## AMP 制限
- 特定の要素をマークアップに含める。
- JavaScript は利用不可。
- inline CSS のみ利用可。 -> 50KB の制限付き
- 特定のHTML tag は利用不可。
- HTML 内、コメント不可。
- 特定のCSS properties は利用不可。

### 必要なマークアップ
- `<!doctype html>` でHTML を書き始める。
- `<html ⚡>` tag を含める。（`<html amp>` でも代用可能）
- `<head>` tag と`<body>` tag を含める。（通常のHTML では任意）
- `<head>` tag 内の一番初めに、`<meta charset="utf-8">` を含める。
- `<head>` tag 内に、`<link rel="canonical" href="$SOME_URL">` を含める。（`$SOME_URL` は通常版のHTML のURL、通常版のHTML が存在しない場合はAMP のURLを入れる。）
- `<head>` tag 内に、`<meta name="viewport" content="width=device-width">` を含める。`minimum-scale=1` および、`initial-scale=1` も含めることが勧められる。
- `<head>` tag 内に、`<script async src="https://cdn.ampproject.org/v0.js"></script>` を含める。
- `<head>` tag 内に、AMP Boilerplate Code（`head > style[amp-boilerplate]` と `noscript > style[amp-boilerplate]`）を含める。

### HTML tags
| tag | 適正 |
|:-:|:-:|
| script | ×（type が`application/ld+json` の場合のみ○） |
| noscript | ○ |
| base | × |
| img | amp-img にて代用 |
| video | amp-video にて代用 |
| audio | amp-audio にて代用 |
| iframe | amp-iframe にて代用 |
| frame | × |
| frameset | × |
| object | × |
| param | × |
| applet | × |
| embed | × |
| form | ○（[amp-form](https://www.ampproject.org/docs/reference/components/amp-form) extension を含めることで利用可） |
| input elements | 一部（`<input[type=image]>`、`<input[type=button]>`、`<input[type=password]>`、`<input[type=file]>`）を除いて○`<fieldset>`、`<label>` は○ |
| button | ○ |
| style | `<head>` tag 内に、一つのみ追加可。`amp-custom` attribute を持たせる必要あり。 |
| link | [microformats.org](http://microformats.org/wiki/existing-rel-values) に、登録されている`rel` は○ |
| meta | `http-equiv` attribute が特定の値に利用可。詳細: [AMP validator specification](https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii) |
| a | ○ `href` attribute を`javascript:` から始めてはいけない。`target` を設定する場合、`_blank` を利用。 |
| svg | 殆どのSVG は利用可 |

### Comments
- HTML 内でコメントは利用できない。

### CSS
- 50,000 bytes の上限を超えてはいけない。
- `!important` は利用できない。
- transition および、animation 関連は`opacity` 、`transform` properties のみ利用可。
生SQLからEloquent Modelを作る3つの方法

## はじめに
生SQLから`Eloquent Model`を作りたいと思ったことはないでしょうか？
3つほど方法があるので、ご紹介します。

## `DB`で`CREATE VIEW`してその`Eloquent Model`を作る
以下のように、`VIEW`を生成し、その`VIEW`に対する`Eloquent Model`を作ります。

```sql
CREATE VIEW view_user_with_groups AS (
  SELECT
    u.id,
    u.email,
    u.group_id,
    g.name AS group_name
  FROM users u
    LEFT OUTER JOIN groups g ON u.group_id = g.id
);
```

```php
use Illuminate\Database\Eloquent\Model;

class ViewUserWithGroup extends Model
{
}
```

## `hydrate`を使ってクエリ結果を`Eloquent Model`にマッピングする
以下のように、クエリ結果を`Eloquent Model`にマッピングします。

```php
$sql = <<< SQL
SELECT
  u.id,
  u.email,
  u.group_id,
  g.name AS group_name
FROM users u
  LEFT OUTER JOIN groups g ON u.group_id = g.id
WHERE u.id = :id
SQL;

$user = DB::select(DB::raw($sql), ['id' => auth()->id()]);
$userWithGroup = UserWithGroup::query()->hydrate($user);
```

```php
use Illuminate\Database\Eloquent\Model;

class UserWithGroup extends Model
{
}
```

## `fromSub`を使って、`Eloquent Model`の`from`にサブクエリをセットする
以下のように、Eloquent Model`の`from`にサブクエリをセットします。

```php
use Illuminate\Database\Eloquent\Model;

class UserWithGroup extends Model
{
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('default', function (Builder $builder) {
            $sql = <<< SQL
SELECT
  u.id,
  u.email,
  u.group_id,
  g.name AS group_name
FROM users u
  LEFT OUTER JOIN groups g ON u.group_id = g.id
SQL;

            $builder->fromSub($sql, 'user_with_groups');
        });
    }
}
```

```php
$userWithGroup = UserWithGroup::find(auth()->id());
```

ポイントは、`fromSub`の第2引数`alias`を`Model::getTable()`の戻り値と一致させておくことです。
`protected $table = '{table_name}';`とテーブル名を直接指定してもOKです。

```php
namespace Illuminate\Database\Eloquent;

abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable
{

    public function getTable()
    {
        if (! isset($this->table)) {
            return str_replace(
                '\\', '', Str::snake(Str::plural(class_basename($this)))
            );
        }

        return $this->table;
    }
```

## どういうときにどの方法を選ぶか
それぞれの方法のメリットとデメリットを列挙すると以下のようになります。

- `DB`で`CREATE VIEW`してその`Eloquent Model`を作る
  - SQLと`Eloquent Model`が分離されるので、コードがシンプルになる
  - `CREATE VIEW`もしくは`ALTER VIEW`するマイグレーションスクリプトが必要になる
- `hydrate`を使ってクエリ結果を`Eloquent Model`にマッピングする
  - `hydrate`するタイミングで動的にモデルを生成できる
  - `hydrate`しないことには何もできない（`find`などクエリ系のメソッドは一切使えない）
- `fromSub`を使って、`Eloquent Model`の`from`にサブクエリをセットする
  - `find`などクエリ系のメソッドが使える（更新系は除く）
  - サブクエリの結果に対して、クエリを発行することになるので、SQLが重くなる可能性がある

## おわりに
3つの方法それぞれにメリットとデメリットがありますが、いずれにしても、肥大化する`Eloquent Model`を分割することにはなるので、それぞれに合った方法を採用してみてはいかがでしょうか？

個人的には、クエリが十分に早ければ、`fromSub`を使う方法がマイグレーションも必要ないし、採用しやすいのではないかと思います。

ではでは。
【Rails】IPアドレスでアクセス制限

# 概要
RailsアプリでIPアドレスを元にアクセス制限をかける方法を紹介します。

# 方法
- [ステップ１(メソッドを定義)](#ステップ１メソッドを定義)
- [ステップ2(before_filter)](#ステップ2before_filter)

### ステップ１(メソッドを定義)
制限をかけたいコントロール上の`privateメソッド`として以下の様なメソッドを定義します。
今回は例としてアプリ全体にアクセス制限をかける為に`ApplicationController`にメソッドを定義していきます。

```ruby:controllers/application_controller.rb
class ApplicationController < ActionController::Base

  private
  # 配列内にアクセスを許可するIPアドレスを羅列する。
  def whitelisted?(ip)
    return true if [123.43.65.1, 123.43.65.77].include?(ip)
    false
  end

  #　whiltelisted?で許可したIPアドレス以外のアクセスがあれば制限をかける（この場合はgoogle.comに飛ばしている。）
  def block_foreign_hosts
    return false if whitelisted?(request.remote_ip)
    redirect_to "https://www.google.com" unless request.remote_ip.start_with?("123.456.789")
  end
end
```
### ステップ2(before_filter)
次に`  before_filter`を使用して、実際に制限をかけます。

```ruby:controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :block_foreign_hosts
#### メソッド部省略
end
```
メソッドの中身に関しては改善が見込めそうですが、上記の流れでRailsアプリでIPアドレスを元にアクセス制限をかけることが可能です。

# 参考
[Restricting Access to Rails App based on IP-Address
](https://stackoverflow.com/questions/30218460/restricting-access-to-rails-app-based-on-ip-address)
N個の整数からM個の整数を選んで掛け算をしてその積が最大になる値を出力するプログラム

```cpp
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <cstdio>
#include <algorithm>
#include <queue>
#define BEGIN ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define END return EXIT_SUCCESS;
using namespace std;

void dfs(vector<int> integer_list, vector<bool> &used, int used_num, int target_num, int product, priority_queue<int> &products, int start) {
  if (used_num == target_num) {
    products.push(product);
    return;
  }
  int size = integer_list.size();
  int i;
  for (i = start; i < size; i++) {
    if (!used[i]) {
      used[i] = true;
      dfs(integer_list, used, used_num + 1, target_num, product * integer_list[i], products, i + 1);
      used[i] = false;
    }
  }
}

inline void solve() {
  vector<int> integer_list;
  string input;
  cin >> input;

  istringstream iss(input);
  string integer;
  while (getline(iss, integer, ',')) {
    integer_list.push_back(stoi(integer));
  }
  int size = integer_list.size();
  if (size < 3) {
    cout << -1 << endl;
    return;
  } else if (size == 3) {
    cout << (integer_list[0]*integer_list[1]*integer_list[2]) << endl;
    return;
  }
  vector<bool> used(size);
  priority_queue<int> products;
  dfs(integer_list, used, 0, 3, 1, products, 0);
  cout << products.top() << endl;
}

int main(int argc, char**argv) {
  BEGIN
  solve();
  END
}
```
Go言語でDLLの関数（システムコール）を呼び出す

★★★2021/11/23追記★★★

`mksyscall_windows.go`というツールを使っていますが、あまりちゃんと認識していませんでした。
（今も深くは理解していませんが）このツール自体名前からして、Windowsのシステムコールを作るものですね。
「任意のDLLの関数を呼び出す方法」としては不適切だったため、タイトルを変更しました。

---

こちらを参考にさせていただきました：[Big Sky :: golang で型付きで DLL を呼び出す方法](https://mattn.kaoriya.net/software/lang/go/20160926174552.htm)
―――――――――――

まず、以下を定義した`syscall_windows.go`というファイルを作成しました。

* `go generate`向けの、ツール`mksyscall_windows.go`で中間コード`zsyscall_windows.go`を生成する定義
* `mksyscall_windows.go`向けの、DLL関数をラップするGo言語関数の定義

```go:syscall_windows.go
package main

//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go

//sys messageBox(hWnd syscall.Handle, lpText string, lpCaption string, uType uint32) (dwRet uint32, err error) = User32.MessageBoxW
```

`go generate`を実行すると、以下のようなコードが生成されます。

```go:zsyscall_windows.go（抜粋）
func messageBox(hWnd syscall.Handle, lpText string, lpCaption string, uType uint32) (dwRet uint32, err error) {
	var _p0 *uint16
	_p0, err = syscall.UTF16PtrFromString(lpText)
	if err != nil {
		return
	}
	var _p1 *uint16
	_p1, err = syscall.UTF16PtrFromString(lpCaption)
	if err != nil {
		return
	}
	return _messageBox(hWnd, _p0, _p1, uType)
}

func _messageBox(hWnd syscall.Handle, lpText *uint16, lpCaption *uint16, uType uint32) (dwRet uint32, err error) {
	r0, _, e1 := syscall.Syscall6(procMessageBoxW.Addr(), 4, uintptr(hWnd), uintptr(unsafe.Pointer(lpText)), uintptr(unsafe.Pointer(lpCaption)), uintptr(uType), 0, 0)
	dwRet = uint32(r0)
	if dwRet == 0 {
		if e1 != 0 {
			err = errnoErr(e1)
		} else {
			err = syscall.EINVAL
		}
	}
	return
}
```

―★疑問★――――――
 `dwRet`（異常時は`0`）がうまいことエラーハンドリングされているように見えます。
 正常時に`0`となる関数はどうするのでしょう。


★★★2021/11/23追記★★★
Windowsのシステムコールを扱う関数なので、DWRODが返る時点で異常時が0、という扱いなのかも。
―――――――――――


あとは生成された`messageBox()`を呼び出せばOKです。

```go:main.go
package main

func main() {
	messageBox(0, "message", "title", 0)
}
```

実行するとメッセージボックスが表示されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/68277/73f59fd9-e788-4683-1a36-baa8348cfc55.png)
自分がおすすめする初学者向け勉強会4選（2019）

#はじめに
Rails勉強者でかつ実務未経験の初学者の方にお勧めする無料の勉強会です。僕自身はLINEさんとかサイバーさんとか学習初期から怖いもの知らずで色々行ってみたりもしたのですがレベルが高すぎて何言ってるかよくわからない状態（笑）になったりすることもあったのでここでは自分が行ってよかった初学者の方向けの勉強会をご紹介します。全てconnpass（https://connpass.com）
というサイトに載っている勉強会になります。

# １.【フリースタイル】もくもく会
- 主催：ポート株式会社
- 場所：新宿
- https://freestyle-mokumoku.connpass.com/event/113494/
- 毎月1回（主に土曜日　11時〜20時）


Railsで開発を勧めるポートさんが自社のビルで主催する勉強会です。住友ビルというビルでかなり広いスペースでやります。

【お勧めポイント】

- Railsのエンジニアやrailsの会社のCTO等が参加者に多い印象でRailsの情報を得やすい。
- Railsのわからない事について主催の方などに聞くと教えてもらえたりする。
- ランチ会があり、現役のエンジニアの方達とキャリアや現場のことも話せる。
- お菓子やジュースが無料で提供される。
- LT枠で求人募集などもあるので転職活動する上でも情報を収集出来る。

特に自分としてはわからない事を教えてもらえたのが一番のメリットでした。また開催時間が長いのがいいのでがっつり開発したいという方にはお勧めです。

# ２.クックパッドの勉強会
- 主催：クックパッド株式会社
- 場所：恵比寿（恵比寿ガーデンプレイス）
- https://cookpad.connpass.com/
- 開催不定期

名前の通りクックパッドさんが主催してるもくもく会というよりはクックパッドさんが使用してる技術やプロダクトに関するプレゼンです。クックパッドさんがrailsを使用している会社なのでRails関する情報だったり開発に関する秘話を聞けます。特に現場の先端ではどういう事をやっているのか知るにはとても良いです。

【お勧めポイント】

- 最先端の開発の状況を聞ける（勿論rails以外も）
- 出て来る料理が無料なのに毎回豪華（飲食目的のみNGとの事なので注意）
- 開発の仕方やチーム開発の雰囲気も知れる。LTの仕方も学べる

こちらの勉強会は人気で基本的に毎回抽選になりますが僕は初学者でgithubやtwitterなしでも抽選に当たって参加できましたのでぜひ興味があれば申し込みしてみましょう。

#3.Hacker’s Free Space
 - 主催：eLV（engineer's Learning･Vesper）
 - 場所：麹町
 - https://hfs.connpass.com/
 - 毎週火曜日（18時〜22時）


elvさんが開催してる勉強会です。ここは毎週やっているので定期的な学習に役立ちます。また無料で教えてくれるメンターさんが必ず一人はいます。（但しメンターさんはPHPやjava、Pythonの方が多いです）参加者の割合的には未経験〜駆け出しの方が他の勉強会に比べると多い印象です。

【お勧めポイント】

- 必ず熟練のメンターさんが一人はいる。またメンターさんの面倒見が非常に良いです。
- 毎週開催している。
- お菓子も出るし、交流も頻繁にあるので駆け出しの方同士でも人脈も広げやすい

またグループは違うのですがelvさんがやっている内容として下記もあります。
姉妹：eLV（https://elv.connpass.com/）
こちらはPythonチュートリアルの会（女性限定）やITコンサルの勉強会など幅広くやっています。参加するハードルも低いので初学者の方にはとてもお勧めです。

#4.WEB系自習会＠新宿
僕が主催している勉強会です。完全に広告です笑
特に言語は問わず駆け出しの方やエンジニアに興味があるという方向けにやっています。ただ参加されてる方はフリーランスの方や現役のエンジニアの方や実務未経験の方とマチマチです。カフェでやっているので会場等は借りてません。

- 場所：新宿
- https://websinjyuku.connpass.com/
- 毎週日曜日（18時30分〜21時）

自分が思うこの自習会のお勧めポイントは以下の通りです。

【お勧めポイント】

- 情報収集が捗る。（railsに関する情報/新しくできたWEBサービスの情報/他の良かった勉強会イベント情報/各校のスクールの情報/転職活動に関する情報）
- railsのエンジニアの方も頻繁に参加してるので聞きやすいし、聞くと教えてくれる。
- 2時間半ごりごり書いてもいいし、しゃべるのを中心の休みの会にしてもいい

参加ハードルは４つの中で最も低い会だと思います笑。個人的に参加者同士の交流が多いので情報取集の部分が一番メリットがあるかと感じでいます。

以上僕が個人的にお勧めする4選でした。もし他にこういう勉強会もいいですよとかここってどうですか？とかあればコメントいただければと思います！
IT企業に入社する前に分析しておくとよい事項。仮説（49）

IT企業に入社する前に分析しておくとよい事項を記録します。

# 1. 一人当たり売上
製造業と比べると、製造業のIT子会社は、一人当たりの売上が場合によっては一桁少ないことがありました。

製造業では、社員以外に、製造派遣など、社員の十倍の働き手を抱えていることがあります。

それならIT中堅企業の同じで、社員が九人の派遣の人と仕事をしていることがあります。

実際に、IT企業とそれ以外で、比較してみるとよいでしょう。

# 2. Webの構成
「紺屋の白袴」という言葉があります。IT企業だからといって、自社のWebが金儲けに使えなければ、中身はないかもしれません。

そういう場合には、顧客企業のWebを分析します。
ただ、顧客企業のWebを請け負っていなければ、Webの中身よりも、IT企業の使い方を参考にするとよいでしょう。

# 3. ソースコード（github, docker hub, Qiita）, 特許、論文、規格
会社のWebに情報がなくても、外部のWebに情報があるかもしれません。

githubにたくさんソースを展開していたり、docker hub, Qiitaの記事を集計してもいいかもしれません。

学術論文、特許、規格について、会社名だけではなく、その会社の社員名も使って検索して整理してみるとよいでしょう。

# 参考資料(reference)
参考文献駆動執筆(reference driven writing)
https://qiita.com/kaizen_nagoya/items/b27b3f58b8bf265a5cd1

作業診断(process assessment)を成功させる５つの鍵。失敗する５つの罠 
https://qiita.com/kaizen_nagoya/items/bcdc60db20e8d7081fab

# 文書履歴(document history)
ver. 0.01 初稿 20190104 午後
ver. 0.02 参考資料追記 20190104 夕方
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
ちょっとかしこいtqdm② ~ multiprocessing編 ~

# tqdm
https://github.com/tqdm/tqdm
![tqdm.gif](https://qiita-image-store.s3.amazonaws.com/0/188173/3a3bc06f-5392-9676-a279-deb53baf57a1.gif)

マルチプロセス×tqdmな記事があんましなかったので。

拙記事↓の続編(?)
[ちょっとかしこいtqdm① ~ metricsの表示 ~](https://qiita.com/namahoge/items/26c5a4e73d9c42e8d3b8)

## やりたいこと

- 各データに何かしらの処理をしたい

```python
import os
import time

start = time.time()

# 1秒待つ＆二乗を返す関数
def f(x):
    time.sleep(1)
    value = x * x
    print('{}s passed...\t{}\t(pid:{})'.format(
        int(time.time() - start), value, os.getpid()))

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for d in data:
    f(d)
```

![Screenshot from 2019-01-04 17-00-05.png](https://qiita-image-store.s3.amazonaws.com/0/188173/a07c3eb9-e39e-01fe-4066-2c8d8dee4818.png)

- 大変だ！10秒かかってしまった！

## 普通のmultiprocessing

```python
from multiprocessing import Pool
import os
import time

start = time.time()

# 1秒待つ＆二乗を返す関数
def f(x):
    time.sleep(1)
    value = x * x
    print('{}s passed...\t{}\t(pid:{})'.format(
        int(time.time() - start), value, os.getpid()))

pool = Pool(processes=10)

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

with pool as p:
    p.map(f, data)
```

![Screenshot from 2019-01-04 17-05-40.png](https://qiita-image-store.s3.amazonaws.com/0/188173/810b71c9-7f42-4938-2815-2d1fb5088f3c.png)

- 1秒！天才！
- でもこれどうやってtqdmするんすか？

## multiprocessingなtqdm

```python
from multiprocessing import Pool
import os
import time
from tqdm import tqdm

# 1秒待つ＆二乗を返す関数
def f(x):
    time.sleep(1)
    value = x * x

pool = Pool(processes=10)

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

with tqdm(total=len(data)) as t:
    for _ in pool.imap_unordered(f, data):
        t.update(1)
```

![Screenshot from 2019-01-04 17-07-48.png](https://qiita-image-store.s3.amazonaws.com/0/188173/96f6ec1c-e2d7-6120-81f1-628304e86e5d.png)

- できた

# 参考
- http://note.crohaco.net/2017/python-multiprocessing/
- https://www.kaggle.com/liangjiajun/multiprocess-download-image-with-progress-bar

# 最後に

以上っ！
Kerasでmodel学習のhistory結果をグラブ表示する方法

参考にさせてもらいました↓(書籍「PythonとKerasによるディープラーニング」より)
https://github.com/fchollet/deep-learning-with-python-notebooks/blob/master/5.3-using-a-pretrained-convnet.ipynb

表示用のメソッド

```python:compare_TV.py

    def compare_TV(history):
        import matplotlib.pyplot as plt
        
        # Setting Parameters
        acc = history.history['acc']
        val_acc = history.history['val_acc']
        loss = history.history['loss']
        val_loss = history.history['val_loss']

        epochs = range(len(acc))
        
        # 1) Accracy Plt
        plt.plot(epochs, acc, 'bo' ,label = 'training acc')
        plt.plot(epochs, val_acc, 'b' , label= 'validation acc')
        plt.title('Training and Validation acc')
        plt.legend()

        plt.figure()
        
        # 2) Loss Plt
        plt.plot(epochs, loss, 'bo' ,label = 'training loss')
        plt.plot(epochs, val_loss, 'b' , label= 'validation loss')
        plt.title('Training and Validation loss')
        plt.legend()

        plt.show()

```

実行するとき。

```python

from keras import models 
from keras import layers
from keras import optimizers

model = models.Sequential()
##################### 
# modelの詳細は省略  #
#####################
# declear History
history = model.fit(train_features, train_labels,
                    epochs=30,
                    batch_size=20,
                    validation_data=(validation_features, validation_labels)
                   )
#show Accuracy and Loss History
compare_TV(history)
```

結果はこのようになります。
![index.png](https://qiita-image-store.s3.amazonaws.com/0/139714/d26f05da-bfad-3407-f5a5-02b5f5786287.png)

![index2.png](https://qiita-image-store.s3.amazonaws.com/0/139714/1307bb8b-5d7b-4af6-31b8-ceeb1bf493e7.png)
CentOS7 に Nginx をインストールする

## 前提

- サーバOS： ContOS 7
- Root 権限が付与されている、または使用可能であること
- 外部IPアドレス（または独自ドメイン）を取得済みであること

## 手順

以降、管理者権限 (Root) で実行可能なユーザで行うこと。

### リポジトリ作成

OS のベースリポジトリには Nginx は無いため、リポジトリを新たに追加する。
下記のとおりに、nginx.repo のファイルを作成。

```bash
sudo vi /etc/yum.repos.d/nginx.repo
```

記載内容は以下

```vim:/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```

記載したら `Esc` → `:wq` で保存して終了。

### インストール実施

```bash
# nginxをインストール (質問は全て「Y」で肯定)
sudo yum install nginx

# バージョンの確認
nginx -v

# 自動起動設定 (初回の場合はシンボリックリンクが作成される)
sudo systemctl enable nginx

# 起動
sudo systemctl start nginx
```

### Web ブラウザ表示確認

`http://外部IPアドレス` または `http://独自ドメイン` にアクセスし、以下のように表示されたら成功

<img width="1431" alt="スクリーンショット 2019-01-04 16.47.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/34a8aa66-7b0e-099b-e177-435b59490d2e.png">


Nginx のインストールは以上。
MacでSpringToolSuiteを日本語化する方法

#MacでSpringToolSuite(STS)を日本語化する時につまずいた話

ジョジョ好きのプログラミング初心者です。
MacでSpringToolSuiteを日本語化するという初歩の初歩ォォォォ!! でつまずいたのでメモ 笑
同じプログラミング初心者の方の助けになれば幸いだオラァ！！


Macの仕様
v10.14.1
macOS Mojave


##手順まとめ
1.Pleiadesをダウンロードする
2.Pleiadesフォルダ内のfeaturesフォルダの中身をコピペする
3.Pleiadesフォルダ内のpluginsフォルダの中身をコピペする
4.SpringToolSuite4.iniを編集する

それでは、順に見ていきます！オラオラァァァ！！


###手順.1 Pleiadesをダウンロードする
まずはとにかく日本語化用の[Pleiadesをダウンロード](http://mergedoc.osdn.jp/)しましょう。
アクセス先の画面で少し下にスクロールすると、下に添付したようなMAC用のダウンロードボタンがあります。
クリックしてダウンロードを開始です。

<img width="298" alt="スクリーンショット 2019-01-04 16.53.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/283820/6267d6ff-1dd4-ab16-f9e4-7b133e297813.png">



###手順.2 Pleiadesフォルダ内のfeaturesフォルダの中身をコピペする

ダウンロードしたPleiadesフォルダの中には、いくつかのフォルダがあります。
featuresという名前のフォルダがあるので、中身の

jp.sourceforge.mergedoc.pleiades

というフォルダを、SpringToolSuite内のfeatures内へコピペしましょう。
featuresフォルダはSpringToolSuiteアプリケーション内のEclipseフォルダ配下にあります。

なお、SpringToolSuite内のfeaturesフォルダを確認するには、MacのApplicationsフォルダ内のSpringToolSuiteを右クリックし、

「パッケージの内容を表示」

をクリックすると確認することができます。



<img width="846" alt="パッケージ内容を表示.png" src="https://qiita-image-store.s3.amazonaws.com/0/283820/66f4d646-9567-67ec-673a-2850d4b879ea.png">

<img width="1108" alt="フォルダ構成.png" src="https://qiita-image-store.s3.amazonaws.com/0/283820/ac5f4829-c32f-f040-cdf8-406399b510f6.png">




###手順.3 Pleiadesフォルダ内のpluginsフォルダの中身をコピペする

pluginsという名前のフォルダがあるので、中身の

jp.sourceforge.mergedoc.pleiades (同じ名前だ…)

というフォルダを、SpringToolSuite内のpluginsフォルダ内へコピペしましょう。
pluginsフォルダもEclipseフォルダの配下にあります。


###手順.4 SpringToolSuite4.iniを編集する

最後に、Eclipse配下の

SpringToolSuite4.ini

というファイルを編集します。
ファイルを開いて、一番下に以下の2行を追記して保存しましょう！

-javaagent:../Eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-Xverify:none

<img width="1155" alt="スクリーンショット 2019-01-04 17.32.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/283820/c0e1acca-9153-db72-eda2-4e9c3a3ce996.png">



以上で終了です！ SpringToolSuiteを起動してみてください。
きっと美しい日本語が表示されるはず 笑
これで日本語化完了ゥゥゥゥ！！！
URYIIIIII!!!!


ちなみに、Eclipse(エクリプス)も日本語化の手順は一緒のようです。
REVOLUTION PI RevPi Core3の初期セットアップ

# REVOLUTION PI RevPi Core3とは

産業用の現場（工場等）で使用できる、Raspberry Piです。産業界で良く使われている、DINレールという金具に取り付けられるようにできています。
Compute Module 3を内蔵しており、普通のRaspberry Pi同様にRaspbian をインストールして各種ソフトウェアを使用する事ができます。

# 一般的なRaspberry Piとの違い
- キーボードレイアウトがドイツ語になっている
- 電源入力が、MicroUSBではなく、ターミナル接続
- PiBridgeという、信号入出力モジュールを拡張させるための独自コネクタを持っている
- 無線LAN / Bluetooth機能を持っていない

ドイツ語キーボードと、英語キーボードの1番大きな違いは、z/yの位置が入れ替わっているという事です。

# ハードウェアのセットアップ 
電源を外部に別途接続する必要があります。今回は、DINレールに接続するタイプの電源（[ミスミ ESP20-20-24](https://jp.misumi-ec.com/vona2/detail/110400213820/?HissuCode=ESP20-20-24)）を利用しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81274/55472673-13c6-ff68-f2c6-a865e6c78f71.png)
AC 100Vの配線は危険を伴いますので、24VのACアダプタを使用する方法もあります。その場合、[スクリュー端子台式のDCジャック](http://akizukidenshi.com/catalog/g/gC-08849/)を利用すると便利です。
![image.png](http://akizukidenshi.com/img/goods/2/C-08849.jpg)

# ソフトウェアのセットアップ
中身のモジュールは、Raspberry Pi Compute Module 3(CM3)ですので、CM3同様のセットアップができます。ただし、piアカウントの初期パスワードが、Rasbian標準の物ではなくて変更されています。筐体の脇のシールに記載がありますので、そちらを利用しましょう。

RevPiのセットアップで1番最初にやるべき事は、Localisationの変更(英語 あるいは 日本語)です。
4.Localisation Options -> I2.Change Timezone　を、Tokyo　にします。
4.Localisation Options -> I3.Keyboard Layout　を、Generic 105-key (Intl) PC　-> Japanese　にします。
Japaneseが表示されない場合は、一端"Other"を選択します。

RevPi出荷時の設定は、TimeZoneがCET、Keyboard layoutがGeneric 105-key (Intl) PC / German(eliminate dead keys)をそれぞれ設定されています。また、Localeは英語(en_GB.UTF8)が設定されています。

なお、SSHは標準状態で有効化されています。


# 参考

[Raspberry Pi 3 Compute Module 3とは](https://qiita.com/dandan001/items/4e04211869e809699d25)
[Raspberry Pi 3 Compute Module 3へのRaspbianのセットアップ](https://qiita.com/dandan001/items/6fcdb60e0f1c02a58bfc)
[ドイツ語のキー配列](http://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/german.htm)
cloud9の共有環境の導入について解説

#はじめに
cloud9というクラウドIDEがあります．
そこではワークスペースを共有し，複数人で同じ環境で同時に開発ができるのですが，
この導入に戸惑ったので，自分が解決までに至った手順を載せておきます．

#本記事の注意点
IAMを知らない人向けの記事です．
また，共有メンバーがAWSを悪用する事は想定していません．

#前提知識
まず，cloud9の共有環境は
「違うAWSアカウント(ルートアカウント)と共有するものではない」
ということを覚えておいてください．

#手順1. IAMユーザー作成
##IAMとは
AWSアカウント内でユーザーを作成したりできるものです．
作成したユーザーには，「cloud9のみ使用OK」といった権限を与えることができます．

##cloud9の共有環境について
cloud9の共有環境は，IAMユーザーと共有するものです．
IAMユーザーは，AWSアカウントに依存しています．

つまり共有環境を作るためには，
「共有メンバーそれぞれのIAMユーザーを作ること」
からスタートです．

##グループ作成
グループメンバー共通の権限を設定します．

まず，以下リンクよりグループを作成します．
https://console.aws.amazon.com/iam/home?region=us-east-2#/groups

ポリシーとは権限の事です．
・AWSCloud9Administrator
・AmazonEC2FullAccess
の2つをアタッチしておけば，権限が足りずに困る事は無いでしょう．

##ユーザー作成
以下リンクよりユーザーを作成します
https://console.aws.amazon.com/iam/home?region=us-east-2#/users$new?step=details

「AWSアクセスの種類を選択」のチェックは全部入れ，後に作成したグループにもチェックを入れます


そして，**作成時に出てくるパスワードをメモしましょう**．
csvで保存するのが無難です．

#手順2. 共有ユーザー追加

cloud9の共有したいIDEを開き，ヘッダーのshareからIAMユーザー名を入れます．
Rはreadのみ，RWはreadとwriteが使えることを表しています．

Who hass accessに追加できれば成功です．

また，共有主と同じグループに属していないIAMユーザーも追加する事ができます．

#手順3. メンバーに教える
・ユーザー名
・パスワード
・ログインページのURL
・cloud9のURL
の4つをslackなりでメンバーそれぞれに教えます．

ログインページはIAMのダッシュボード，
cloud9のURLはshareより見れます．

以上です．

#おわりに
チャットは右端のcollaborateで使えます
Raspberry Pi 3 Model B+でWiFi Access Pointを設定した話

# はじめに
やってみたいことがあって、まずはRaspberry PiでWiFi Access Pointをちゃちゃっと提供しようとしたら意外と時間がかかってしまったので備忘含めて書き残しておきたいと思います。

# 環境
Hardware: Raspberry Pi 3 Model B+
OS: Raspbian Stretch Lite

今回これを使ったのは、こいつ単体にLANとWiFiのモジュールが最初から載っていたから。
年始にわざわざ新宿のヨドバシまで行って買ってきました。

# 設定
参考にしたサイトは以下
- https://kokensha.xyz/raspberry-pi/raspberry-pi-wifi-access-point/
- https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/

1つ目のサイトのやり方を愚直にできていたらこのような記事を書くこともなく本当にやりたい検証を始められたのですが、そうも行かなかったというのが今回記事の経緯。

そして以下が最終的に行き着いたsetup scriptです。
ベースは上の2サイトですが、今回のOSに都合がいい様にちょっとだけ変更入れました。
- https://gist.github.com/khronos227/63c6f32baf218ab9563072d07977dba2

## 変更点
### /etc/network/interfacesに直接設定を書かない
```
cat <<EOF > /etc/network/interfaces.d/wlan0
allow-hotplug wlan0
iface wlan0 inet static
    address 172.24.1.1
    netmask 255.255.255.0
    network 172.24.1.0
    broadcast 172.24.1.255
EOF
```
このファイルに直接wlan0の設定を書いてしまうとその後の
`service dhcpcd restart`
で失敗してしまいます。またその際、
`/etc/init.d/networking restart`
をするまでは `wlan0`に設定がうまく反映されなかったのでこれもスクリプトに含めました。

### dnsmasqの設定にbind-interfaceを含めない
```
backup /etc/dnsmasq.conf

restore /etc/dnsmasq.conf
cat <<EOF > /etc/dnsmasq.conf
interface=wlan0
listen-address=172.24.1.1
server=8.8.8.8
dhcp-range=172.24.1.2,172.24.1.50,12h
EOF
```
ここに `bind-interface`を含めてしまうと、`dnsmasq`を起動しようとしたとき
`dnsmasq: failed to create listening socket for 172.24.1.1: Cannot assign requested address`
と言われて失敗します。ここはおとなしく削りましょう。

あとは大体他と同じでなんとかなるかと。

# let's 実行
```
sudo bash rpi-wifi-setup.sh password123456789 test-wifi
sudo reboot
```

## 注意
### Country設定
`raspi-config`
にて、Locale、Timezoneの設定を行ってください。
※これを行わなかった場合、wlan0に自動でaddressなどが割り当てられませんでした。

# おわりに
筆者の環境ではこれでWiFiの設定はできました。
これがなにかの参考にでもなれば幸いです。
離席するときに画面をロックしましょう

離席時にPCを開いたままにしていませんか？
セキュリティ的に危ういのでロックする癖をつけましょう。
Macを使っている人はスクリーンセーバーとMission Controlの組み合わせで瞬時にロックできるようになります。

# スクリーンセーバーの設定

![Screenshot 2019-01-04 15.43.45.png](https://qiita-image-store.s3.amazonaws.com/0/99505/1178e807-77c0-bbc2-2b7f-229667563dd1.png)

**パスワードの要求を `immediately` にする**
![Screenshot 2019-01-04 15.43.16.png](https://qiita-image-store.s3.amazonaws.com/0/99505/ff45c3e7-b807-9334-c2c1-cb6bc13cd706.png)

# Mission Controlの設定

![Screenshot 2019-01-04 15.43.02.png](https://qiita-image-store.s3.amazonaws.com/0/99505/4d3c4d46-1534-6b55-4519-103d73452780.png)

![Screenshot 2019-01-04 15.27.27.png](https://qiita-image-store.s3.amazonaws.com/0/99505/8d1c480c-7185-c4bc-48b5-cedeb4385e5b.png)

![Screenshot 2019-01-04 15.27.34.png](https://qiita-image-store.s3.amazonaws.com/0/99505/7162e896-c37a-1b22-eb4c-35e86050b5be.png)

# ロックする
画面の右下角にカーソルを持っていくだけでロック可能になります。
不意の離席でもトラックパッドをサッと撫でるだけでロックできるので非常に便利です。
Linux用のCisco AnyConnect Clientを入手できない時の代替手段

# はじめに
Cisco新製品の動作確認をしたり、REST APIやOn-Box Pythonを使った開発を行ったりする際、無料で利用できるCisco DevNetやdCloudのSandbox環境は非常に便利です。

DevNetの場合、2019年1月時点で、ACI、DNA、SD-WAN等のカテゴリー毎に計68のSandboxが提供されており、「Always-On(いつでもだれでも利用できる環境)」と「Reserve(予約が必要な専有環境)」のいずれかもしくは両方が提供されています。

後者の場合、Cisco AnyConnect Secure Mobility Client(AnyConnect Client)を使い、自分のPCとCisco環境の間でVPNをはってアクセスする形になります。

WindowsやMac OS XからVPN接続する場合は、以下手順通りに実施すれば、接続可能です。

- [AnyConnectのダウンロードサイト](https://developer.cisco.com/site/sandbox/anyconnect/)
- [AnyConnectのインストールガイド](https://devnetsandbox.cisco.com/Docs/VPN_Access/AnyConnect_Installation_Guide.pdf)
 
一方Linuxの場合、インストールガイドに手順は記載されているものの、肝心のAnyConnectのファイルがダウンロードサイトから消えていました。

そこで、インターネットで代替手段を検索したところ、シンプルなものから複雑なものまで、中にはどこかの大学のアカウントを持っていることが前提の手順など、様々なものが見つかりました。
その中で、おそらく一番シンプルで、自分の環境でうまく行った手順についてメモしておきたいと思います。

# セットアップ環境と必要なパッケージ

以下の環境でセットアップを行いました。

| No. | ハード/パッケージ     | バージョン         |
|:----|:-----------------|:------------------|
|  1  | CentOS | 7.5.1804 |
|  2  | epel-release | 7-11 |
|  3  | openconnect | 7.08-1.el7 |

ちなみにNo.3のOpenConnectは、以下ベンダー製品とのVPN接続をサポートするために作られたLinux用SSL VPN Clientで、ベンダー公式サポートのものではありません。

- Cisco AnyConnect SSL VPN
- Juniper SSL VPN(Pulse Connect Secure)
- Palo Alto Networks GlobalProtect SSL VPN

詳細は[OpenConnectのサイト](http://www.infradead.org/openconnect/)に記載されています。

# 接続手順

#### epel-releaseのインストール

```text:
[user@localhost ~]$ sudo yum install epel-release
```

#### openconnectのインストール

```text:
[user@localhost ~]$ sudo yum install openconnect
```


#### VPN接続
Sandboxの予約時にメールで届いたLab Network Addressを元に、openconnectコマンドを実行します。
途中サーバを信頼するか聞かれるのでyesを入力し、その後、同じくメールで届いたUsername/Passwordを入力します。
「Connected as xx.xx.xx.xx, using SSL」と表示されれば接続成功です。

```text:
[user@localhost ~]$ sudo openconnect https://(予約時にメールで届いたLab Network Address)
POST https://xxxxxxxxxx.cisco.com:xxxxx/
Connected to xx.xx.xx.xx:xxxxx
SSL negotiation with xxxxxxxxxx.cisco.com
Server certificate verify failed: signer not found

Certificate from VPN server "xxxxxxxxxx.cisco.com" failed verification.
Reason: signer not found
To trust this server in future, perhaps add this to your command line:
    --servercert sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Enter 'yes' to accept, 'no' to abort; anything else to view: (yesを選択)
Connected to HTTPS on xxxxxxxxxx.cisco.com
XML POST enabled
GROUP: [Anyconnect-pod223]:Anyconnect-pod223
POST https://xxxxxxxxxx.cisco.com:xxxxx/
XML POST enabled
Username:(予約時にメールで届いたUsername)
Password:(予約時にメールで届いたPassword)
POST https://xxxxxxxxxx.cisco.com:xxxxx/
Got CONNECT response: HTTP/1.1 200 OK
CSTP connected. DPD 60, Keepalive 300
Set up DTLS failed; using SSL instead
Connected as xx.xx.xx.xx, using SSL
```

#### 参考させて頂いたURL
[Cisco AnyConnect VPN CentOS 7 Server GUI with KDE](https://sites.google.com/site/nandydandyoracle/centos7/centos7-desktop/cisco-anyconnect-vpn-centos-7-server-gui-with-kde)
Dartで良さそうな演算子

# 本文について
めちゃくちゃ主観的に実装で使いたいなと思った演算子をピックアップしました。
自分の頭の整理と、どなたかの参考になればと思います。

# ??=
* 左辺がnullであるとき、右辺を代入します。
* 何かしら値を入れたい時に使いたいです

```dart
// 
var value = "a";
// bをnullにします
var b = null
//valueが代入されます。
b ??= value;
```

# is
* 型判定をするときに使います。
* 左辺が右辺の型と同じであるとき,trueを返します
 
```dart

var a = "value"
//Stringなのでtrueがかえります
a is String
```

# cascade
* objectをわざわざ繰り返し書かなくても、property操作を可能にする
* ~~注意しなければいけないのは、返り値がわからない場合使えない~~
* 注意しなければいけないのは**左辺**がわからない場合使えない

```dart
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
```
上記と同じことを行なっている

```dart
querySelector('#confirm') //Objectが返り値となる
  ..text = 'Confirm' // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));
``` 

# 参考
https://www.dartlang.org/guides/language/language-tour
ユニットテストの存在意義(自論)

こんにちは。

エンジニアやってるとユニットテスト書く人多いと思います。
過去の経験上だと8割くらいのプロジェクトで自分も書いてきました。
でも、なんで書かなきゃいけないんでしょうか？

#ユニットテストをやる理由
自分なりに分析したところだいたいこんな意見にまとまります。
①やれって言われた
②個人目標の指標数字に使うため
③品質向上のため

①についてはきっと上司とかに言われたのでしょう。でもなぜやるかを理解していない上司の考えもだいたい②か③に集約されます。

②は数字を作る上では手っ取り早い手段なんでしょう。
しかし、こんなコードにもテストを書かなきゃいけなかったりするので無意味な数字です。

``` java:sample.java
public int returnZero(){
   return 0;
}
```

③に関しても品質はコード以外にも性能や仕様面での品質があるのでユニットテストを書いたからといって品質向上になるわけではありません。


#なぜやるの？
こういう風にまとめてみるとやる価値はないなぁと感じますね。

では最初に戻って、なぜやるのか？

自分なりの答えは**「自分が自信と安心を得るため」**です。

ソースコードを書いていて、実行結果が期待されるものがちゃんと帰ってくるよね？という不安はよく抱くと思いますが、ユニットテストを書くことで結果を確認することができます。

また、将来的に結果は同じだが処理内容が別になる実装があった場合にもユニットテストを書いておけば結果をすぐに確認することができます。

そこまでやって得た実行結果ならば自信を持ってこうなります！って言えますね。

ということで、俺はスペシャルだからテストなんかいらないぜ！っていう人は別に書く必要はないですし、そのままの君でいてください。

そうではない人は心に余裕を持つためにユニットテストを書いてみてはどうでしょうか。
Leap Motion と VR

#Leap Motion
Leap Motionテクノロジは、手や指の動きを追跡するので、VRやARに到達して、新しい世界と対話することができます。

##資格と制限

光学追跡プラットフォームとして, Leap Motionは見ることだけを追跡することができます、一番最適には：
-　摘む, 掴むとほかの物理的な対応。
-　ユーザーが見ること界面とオブジェクトを対応しています。
-　ソーシャルVRの自己表現。

避けることのお勧め：
‐　対応のタッチスクリーンスタイル。
‐　銃と剣の対応。
‐　手をトラッキング距離に遠い過ぎ対応。

##テクノロジー
Leap Motion テクノロジー：今Leap Motionは3つソフトウェアがリリースしますた。
1．V2　：以前はOSXやLinuxで標準的な追跡を開発していましたが、今V2と関係があるアセットは古いですのでソフトウェアがもうサポートされていません
2．V3　：最初のOrion Tracking、V3もVRでアプリを開発することがでる。
3．V4　：V4は二代目のOrion Tracking, これはVRのためのリリースソフトウェアです。V4バージョンはLeap Motionがたくさんデモを開発しました。例: [Cat Explorer](https://gallery.leapmotion.com/cat-explorer/)


##Leap MotionとVR関係
VRに画期的なプロダクトの重要なことはデザインですのでLeap Motionはインタラクティブやアーゴノミックスやユーザー安全のデザインを与えるので、例えば；世界のデザイン、オブジェクトのインタラクション、ユーザーインターフェース、プレーヤーの遠近法、音声など。
Orion　Trackingで、2つ動くしかありませんですが、他のポーズも出来そうです。

VRに何が一番重要なルールですか？ユーザーを気持ちが悪いしない。
そのルールに対して、ユーザーの安全と楽のためにLeap Motionは空間的なレイアウトやポジティブなアーゴノミックスを与えてます。

##他の
今Leap Motionはモバイルのために[プラットホーム](https://developer.leapmotion.com/android#107)を作ります。

##最後に
今、一番正確な手トラッキングデバイスとしてLeap MotionはVRプロダクトのために改善しています。
Python 変数スコープについて

# 概要
Pythonの変数スコープについて、時々分からなくなるので、こちらに記載します。

# 変数スコープの種類
### グローバル変数

- グローバル変数はローカル変数内外のどの範囲からもアクセス可能  
(①、②の出力を参照)

```python
# coding: utf-8

GLOBAL = "GGG" 　# グローバル変数定義
def gfunc():       # 任意の関数を定義
    print(GLOBAL)  
gfunc()            # 関数内のprint(GLOBAL)を出力 ①
print(GLOBAL)      # グローバル変数でのprint(GLOBAL)を出力②

```
### ローカル変数

- ローカル変数は定義した関数外の箇所では使用できない。  
(③の出力を参照)

```python
# coding: utf-8

GLOBAL = "GGG"

def lfunc():      # 任意の関数を定義
    LOACL = 'LLL' # ローカル変数定義
    print(LOACL)  # lfunc関数の内容は上記のLOCAL変数内文字列(LLL)を出力する内容

lfunc()#          # lfunc関数を実行して、文字列 = LLLを出力
print(GLOBAL)     # グローバル変数でのprint(GLOBAL)を出力
print(LOACL)      # 関数外でLOCAL変数にアクセス -> エラーになる！！！③
```

- その他
  - local変数を明示的にprintする事も可能

```python
# coding: utf-8

GLOBAL = "GGG"

def lfunc():      # 任意の関数を定義
    LOACL = 'LLL' # ローカル変数定義
    print(LOACL)  # lfunc関数の内容は上記のLOCAL変数内文字列(LLL)を出力する内容
    print(locals())

lfunc()           # lfunc関数を実行して、文字列 = LLLを出力。また、print(locals())でlocal変数は何が代入されているかをprintする ※ここでは{'LOACL': 'LLL'}と出力される
print(GLOBAL)     # グローバル変数でのprint(GLOBAL)を出力
```

### 参照ドキュメント
https://www.sejuku.net/blog/58897
Djangoのデフォルトエラーページが DEBUG=Falseだと見れないのはなんでか調べた

# はじめに

この調査記事は Django2.1.4 を 2019/01/04 時点で調べてみたときのメモです。

# 流れ

```bash
$ django-admin startproject mysite
$ python mysite/manage.py runserver
```

した際に、 http://127.0.0.1:8000/ を見ると出てくるこのページ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13879/624d81cb-c652-aced-76a3-226bea2ab190.png)

が、 `mysite/settings.py` の  `DEBUG = True` ではなく、 `DEBUG = False` にしたら表示されなくなったということで、調べてみた。

## まずは

```bash
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.
```

が出るので、とりあえず

```settings.py
ALLOWED_HOSTS = ['127.0.0.1']
```

を追加しておく。

## すると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13879/a098bbf2-066b-cbfc-9f8f-a1e6b5722b1c.png)


となってしまう。

# ではこのスタートページは一体？

https://github.com/django/django/blob/master/django/views/templates/default_urlconf.html

このファイルがテンプレートして呼び出されているようだ。

どうやら `debug.py` が呼ばれている様子。

https://github.com/django/django/blob/82f286cf6f198d37850d3c5df637b5665566a66b/django/views/debug.py#L474

```debug.py
# technical_404_response
     else:

         if (not tried or (                  # empty URLconf 
             request.path == '/' and
             len(tried) == 1 and             # default URLconf
             len(tried[0]) == 1 and
             getattr(tried[0][0], 'app_name', '') == getattr(tried[0][0], 'namespace', '') == 'admin'
         )):
             return default_urlconf(request)
```

ということなので、要するに特定の条件の404（要はhttps://127.0.0.1:8000/ のような呼び出し）であればこのページを出している、ということだった。

確かにこれ以外の404は `DEBUG = True` であれば

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13879/11c5bd74-8084-1045-27f5-aca2fb8b2372.png)

こんな感じになる。

# もう少し追ってみると

https://github.com/django/django/blob/master/django/core/handlers/exception.py#L41-L46

```exception.py
def response_for_exception(request, exc):
    if isinstance(exc, Http404):
        if settings.DEBUG:
            response = debug.technical_404_response(request, exc)
        else:
            response = get_exception_response(request, get_resolver(get_urlconf()), 404, exc)
```

確かに `DEBUG = True` のときだけこのページが利用されていることがわかりました！


```mysite/urls.py
 urlpatterns = [
      path('', ここになにか),
      path('admin/', admin.site.urls),
 ]
```

って書くことでうまいことやるか、テンプレートをおいたりビューを定義すれば良さそうですね。

> because DEBUG=True is in your settings file and you have not configured any URLs

って書いてあるとおりだったというわけか。なるほど。
appium(python)でアプリ画面の特定座標をタップする

stackOverflowの[How to tap by coordinates using appium in python](https://stackoverflow.com/questions/47164297/how-to-tap-by-coordinates-using-appium-in-python)に書いてあったこと。

`TouchAction`をimportして

```
from appium.webdriver.common.touch_action import TouchAction
```

タップする

```python
#Noneはelementではなく座標をタップするときの指定
#tap_numはタップ回数
TouchAction(driver).tap(None, x, y, tap_num).perform()
```
面接での就職採用は難しい、どうやって人の本質を見抜くか？プロ野球選手の友達の話

面接での就職採用は難しい、どうやって人の本質を見抜くか？プロ野球選手の友達の話

# 就職採用は難しい

- 就職の面接、採用面接って採用する側からしても相当に難しい
- 1年がかりでも分からない人の本質を数十分で見抜かなければいけない
- そんなの本当に無理ゲーじゃないだろうかって思う

# 野球選手の友達の友達

- だけどプライベートの友達で、めちゃくちゃ人を見る目の鋭い人がいる
- プロ野球選手とも付き合いがあって、その選手は口から出てくる全ての言葉が名言レベルらしい、ものすごく超凝縮圧縮レベルらしい
- ものすごい人を見てきた人は、その振れ幅で、逆にダメなパターンも一瞬で分かる

# 人づてでアウトソージング

- 思ったのは、面接に自信がない会社は、外部の面接官とかに手伝ってもらうのも良いかもしれない
- アウトソージングをシステム化してる会社があるかどうか分からないけれど
- 普通に人づてに「人を見る目がありそうな人を知っていますか？」と質問形式で聞いていって、最後の方にたどり着いた、もしくはその途中のいい塩梅の人に協力を頼むと良いかもしれない

ってことを人に伝えたかったけれど、その前段階の下書きを残しておく

---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/233








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
箱根駅伝公式サイトの手抜き！？JavaScriptを解説する

今年も、箱根駅伝盛り上がりましたね！

ふと、[箱根駅伝の公式ウェブサイト](http://www.hakone-ekiden.jp/)を見ると、

<img width="479" alt="スクリーンショット 2019-01-04 14.28.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/18165/cc1f0302-00c9-a5a0-4851-b9757c409c45.png">

・・・！？！

第95回大会まであと363日

という表記になっていました。

これは、手抜きJavascriptの可能性があります。

エンジニアの端くれとして、これを詳しく調べたい！と思ったので、解説していきます。

### ソースを見て見る

view-source:http://www.hakone-ekiden.jp/

まずは、ソースを見てみましょう。上のアドレスをURLバーに貼り付けて見てください。または、[箱根駅伝の公式ウェブサイト](http://www.hakone-ekiden.jp/)を開いて、右クリックからページのソースを表示など。

すると。。。24行目付近に

<img width="307" alt="スクリーンショット 2019-01-04 14.32.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/18165/ecda985e-3232-8bc3-2b44-3ea0d2ccaecf.png">

早速ありました。count_downという関数を実行しています。明らかにそれっぽそうです。次は、このcount_downが定義されている場所を探っていきます。

### Javascriptを探る

ありました。15行目ですね。

<img width="407" alt="スクリーンショット 2019-01-04 14.33.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/18165/33b6d902-22b9-b385-9fa0-766b7b250204.png">

base.jsというそれっぽいファイルが読み込まれています。ファイル名をクリックするとひらけます。

### count_down発見

ありましたね・・・なんと、シンプルな構造でしょうか

```
function count_down() {
	var now = new Date();
	var nowyear = now.getFullYear();
	var nowMonth = now.getMonth()+1;
	var nowDate = now.getDate();

	if((nowMonth == 1) && ((nowDate == 2) || (nowDate == 3))) {
		document.write('<span class="now">箱根駅伝<br />開催中!!</span>');
	}else if((nowMonth == 1) && (nowDate == 1) ) {
		document.write('<span class="counter">');
		document.write(1);
		document.write('</span>');
	}else{
		var point = new Date(nowyear+1,1-1,2);
		var countdown = Math.ceil( ( point.getTime() - now.getTime() ) / (1000*60*60*24) );
		document.write('<span class="counter">');
		document.write(countdown);
		document.write('</span>');
	}
}
```

ざっと読み解くと、あの日付の表示は、3パターンにあったようですね。

1. 1月2日または3日の場合、「箱根駅伝開催中！」と表示する
2. 1月1日は、「1（日）」と表示する
3. それ以外は、現在時刻と1月2日までの差分を表示

ということです。

### プログラム評価

・箱根駅伝の性質上、毎年繰り返し使えるプログラムである
・しかし、駅伝終了後は、他の画像要素（第95回）などを差し替えないと、整合性がとれない

### 感想

最初、手抜きか！？と思ったのですが、次大会に向けた刷新を行うまでは、整合性が取れなくても仕方ないよね・・・と割り切った実装になっているような気もします。

皆さんはどう思いますか？許せますか？許せませんか？
Jenkins の 最後のビルドの API の JSON の 結果の URI の！

Jenkins job last build result json URI 

```
/job/job_name/lastBuild/api/json
```

---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/231








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Wordpressでのチーム開発時のデータベースの設定について

Wordpressのテーマをチームで開発する場合、それぞれのローカル環境でDBを用意して開発することが一般的だと思いますが、開発環境のDBを使用（共有）してローカル環境で動かすことはできますか？


開発環境(ローカル) MAMP,Mysql
開発環境(開発) CentOS 6.7, Mysql
畳み込みニューラルネットワークにおけるデータ拡張の効果を調べてみた

# 背景・目的
機械学習初心者が、畳み込みネットワークを理解するために、手書き数字画像データセット(MNIST)を用いてデータ拡張の効果を調べてみたので、備忘録として結果を保存する。

# 結果
・学習用データが十分にあるときはデータ拡張を行わなくてもそれなりの精度が出た。
・学習用データが少なすぎるとデータ拡張の効果が見られなかった。
・学習データ数210にてデータ拡張を行うと精度(Accuracy)が改善された。


※精度(Accuracy)はホールドアウトにて検証。
※学習データ数37800の精度はデータ拡張なしで 0.9912。
※赤→緑→青の順に試行錯誤しながらデータを取得したので、データ拡張以外にも学習方法等に若干の違いがある。
※学習epochはバリデーション精度がなんとなく安定するまで実施。感覚的にはデータ拡張やドロップアウトを行わない場合、epoch数を増やしても過学習をするのでバリデーション精度が頭打ちになる。データ拡張やドロップアウトをおこなう場合は過学習が防がれてepoch数をバリデーション精度が頭打ちにならない。

![訓練用サンプル数と精度.jpg](https://qiita-image-store.s3.amazonaws.com/0/111514/77636ce6-c111-677e-156e-5e85b73bc3c5.jpeg)


#データ拡張パラメータ
データ拡張はKeras.keras.preprocessing.image.ImageDataGeneratorで行った。

緑データ時のデータ拡張のパラメータ
ImageDataGenerator(rotation_range=5, width_shift_range=0.05, height_shift_range=0.05, zoom_range=0.05, shear_range=0.1)

青データ時のデータ拡張のパラメータ（緑のときよりもふり幅大）
ImageDataGenerator(rotation_range=30, width_shift_range=0.2, height_shift_range=0.2, zoom_range=0.2, shear_range=0.2)

# 実験に用いたニューラルネットワークの構造
実験には以下の構造の畳込ニューラルネットワーク ( CNN ) を使用。
![ネットワーク構造.jpg](https://qiita-image-store.s3.amazonaws.com/0/111514/d110a9d4-35c4-e65e-1d4f-da7661c22311.jpeg)

# 参考情報
> [機械学習で便利な画像データセット「MNIST」を丁寧に解説！](https://udemy.benesse.co.jp/ai/mnist.html)
> [人工知能に関する断創録 Kerasによるデータ拡張](http://aidiary.hatenablog.com/entry/20161212/1481549365)　
> [Deep Neural Network Keras way](https://www.kaggle.com/poonaml/deep-neural-network-keras-way)
エラーメッセージを読まないプログラミング初心者って本当に初心者が悪いの？ってずっと思ってる

エラーメッセージを読まないプログラミング初心者って本当に初心者が悪いの？ってずっと思ってる

![image](https://user-images.githubusercontent.com/13635059/50674559-d6cde780-102a-11e9-8b3d-9addc753badc.png)

# エラーメッセージに動物を表示してあげたら、非エンジニアでも分かりやすくなったという記事をどこかで読んだような‥

![image](https://user-images.githubusercontent.com/13635059/50674580-f9f89700-102a-11e9-85bc-88e35a91bf22.png)

# 特にコンソールの白黒の画面に、小さく、他の行に大量に埋もれつつ表示されたエラーメッセージとか、不案内にもほどがある

![image](https://user-images.githubusercontent.com/13635059/50674613-565bb680-102b-11e9-8d2f-b628fe25df7a.png)

# 意外に肉体的な特徴も影響していて、僕の場合は視力が悪くて、エラーメッセージを読み飛ばしてしまう癖がある
あとそもそも聴覚タイプ

![image](https://user-images.githubusercontent.com/13635059/50674648-9cb11580-102b-11e9-92b8-1f50ce9bfa97.png)

# 要するにエラーメッセージは開発者から僕らへのメッセージなので、その届け方に問題があるケースも多いのでは？人は不完全なり

![image](https://user-images.githubusercontent.com/13635059/50674674-be120180-102b-11e9-921e-c1af97b982ed.png)

# 多くのコミュニケーションと同じで、エラーメッセージ発信側と受信側での円集合的な歩み寄りが求められる

![image](https://user-images.githubusercontent.com/13635059/50674686-e699fb80-102b-11e9-8205-2038a895e83e.png)

---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/230








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ElasticBeanstalkのプラットフォーム(stack)とオプションを同時に変更する

AWS ElasticBeanstalkのNode.jsを利用していてasync/awaitのためにNodeのv8.x.xを利用していたが、新しいプラットフォームバージョンでは現在のプラットフォームバージョンで提供されている8系のNode.jsのバージョンが提供されておらず、両方いっぺんに変更しないとヘルスチェックに失敗しfallbackで元に戻ってしまうがコンソールではプラットフォームとその他の設定をいっぺんに変えられない。（中間のバージョンには上げた履歴がないので上げられない）

これは、CLIでアップデートするといっぺんに変えられる。
stackを4.7.1にし、同時にNodeVersionの指定を消す事で4.7.1のデフォルトのNode.js 10.14.1へと変更するコマンド例。

```bash
aws elasticbeanstalk update-environment \
  --environment-name <your-environment-name> \
  --solution-stack-name "64bit Amazon Linux 2018.03 v4.7.1 running Node.js" \
  --options-to-remove Namespace=aws:elasticbeanstalk:container:nodejs,OptionName=NodeVersion
```
AWS SAM Local で関数をローカルからデプロイする

# AWS SAM Local とは？
AWS Lambda関数をローカルで実行しテストができるツールです。
S3, Kinesis, DynamoDB, Cloudwatch Scheduled Event, Cloudtrail,API Gatewayなどの関数からの呼び出しにも対応しています。

# 事前準備
## Dokcerのインストール
Macの場合こちら:
[Install Docker for Mac \| Docker Documentation](https://docs.docker.com/docker-for-mac/install/)

## AWS CLIのインストール
Macの場合こちら:
[macOS で AWS Command Line Interface をインストールする - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html)

## SAM Localのインストール
Macの場合こちら:
`$ brew install aws-sam-cli`


# SAM LocalでHello Worldしてデプロイ
## 用意するもの
実行したいコード

```index.js
exports.handler = (event, context, callback) => {
    callback(null, "Hello " + event.body);
}
```
AWS SAM テンプレートファイル

```template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS Lambda sample.
Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
```

sam local実行時に入力するイベントファイル

```event.json
{"body": "World"}
```


## 構文チェック
`$ sam validate`
で行える。

```
/Users/hoge/sam-local-test/template.yaml is a valid SAM Template
```
など、`~ is a valid SAM Template`が出ればOK.

## 実行
`$ sam local invoke HelloWorld -e event.json`

```
2019-01-04 13:09:41 Invoking index.handler (nodejs8.10)

Fetching lambci/lambda:nodejs8.10 Docker container image......
2019-01-04 13:09:45 Mounting /Users/hoge/sam-local-test as /var/task:ro inside runtime container
START RequestId: d020b83c-acb1-163c-ecdf-f1f05b72f463 Version: $LATEST
2019-01-04T04:09:46.490Z	d020b83c-acb1-163c-ecdf-f1f05b72f463	Loading function
END RequestId: d020b83c-acb1-163c-ecdf-f1f05b72f463
REPORT RequestId: d020b83c-acb1-163c-ecdf-f1f05b72f463	Duration: 8.69 ms	Billed Duration: 100 ms	Memory Size: 128 MB	Max Memory Used: 30 MB

"Hello World"
```
実際にHello Worldが出力されました。

## デプロイ
templateを置くs3のバケットを作成する。　
注意: この際デプロイするLambdaと同一リージョンにs3のバケットを置くこと。また、s3のバケットは一意でなければならない。
`$ aws s3 mb s3://[バケット名] --region [リージョン] --profile　[プロファイル]`

パッケージングする。
`$ sam package --template-file template.yaml --s3-bucket [上で作ったバケット名] --output-template-file package.yaml --profile [プロファイル]`

`$ sam deploy --template-file package.yaml --stack-name sam-test-helloworld --capabilities CAPABILITY_IAM --profile personal --region [リージョン]`

```
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - sam-test-helloworld
```
デプロイ成功。

# 確認
コンソールから確認します。
<img width="1281" alt="スクリーンショット 2019-01-04 13.52.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/4c44b6ed-c590-048c-b07b-e5f9d1549faa.png">
できているようです。

右上の[テスト]からテストイベントを設定します。

<img width="822" alt="スクリーンショット 2019-01-04 13.38.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/c9cffaf0-19e3-db06-ad7e-cbdb37769ec9.png">

上のように設定して[保存]し、テストを実行します。

<img width="1279" alt="スクリーンショット 2019-01-04 13.57.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/83262/78162a02-11ab-d5bc-4ebd-9d4f1f9e6c5e.png">

上記のように"Hello world"が出力されていれば成功です。
rails newデフォルトの.gitignore が、 /tmp/* になっていて、ディレクトリが無視されない

`/tmp/**`としないとディレクトリが認識されない。
デフォルトの`.gitignore`だと`/tmp/*`になってるのいけてなさすぎる。。
https://qiita.com/anqooqie/items/110957797b3d5280c44f

あれやっぱり無視されてるかも