OmniAICreator/Qiita-1.07M huggingface dataset:
WebVR とは何か？

##WebVRとは

WebVRは、Webブラウザ上で、VRヘッドセットを扱うためのAPIです。

基本的には、使えるVRデバイスの情報を取得するためのもので、実質的にVRの画面を作成するものは含まれていません。画面を構成するのは、今の所WebGL一択なので、WebGLと組み合わせて使うことになります。

WebVRのAPIの機能としては、

 - 利用できるHMDの情報の取得
 - VRモードへの切り替え
 - 描画対象のcanvasの取得
 - ヘッドセットの回転、移動の行列の取得

というようなAPIが用意されています。

WebVRの仕様についてはこの辺りから
https://developers.google.com/web/fundamentals/vr/?hl=ja


##動作環境 

Chrome,Firefoxが基本的にデフォルトでWebVRをサポートしますが、PC-VRの場合は、ブラウザと機器の組み合わせで相性があるようです。

スタンドアロンのVR機器では、OculusGoの標準ブラウザであるChromeベースのOculusBrowser,FirefoxベースのFirefoxRealityなどが対応しています。

スタンドアロンVR機器では、通常ブラウザを使っている状態から、機器の用意なくシームレスにVRモードに移行できるので、WebVR環境としてはもっとも手軽です。

 
##開発環境

WebVR対応コンテンツは、前述のようにWebGLで3Dシーンを作成することになるので、three.jsを始めWebGLのフレームワークで対応している物が多くあります。

WebGLをhtmlのようなタグで記述できるA-Frameは、WebVRページを手軽に作ってみることのできるフレームワークです。

https://aframe.io/

A-Fameベースで、さらにノベルゲーム的なものを作る環境として、ティラノVRが発表されています。こちらは独自のタグスクリプトで記述しますが、javascriptも埋め込む事ができるので応用範囲は広いでしょう。

https://vr.tyrano.jp/

有名なReactがベースになっているReactVRはサーバサイド含めた本格的な開発が可能です。

https://html5experts.jp/karad5/23543/


##WebVR対応サービス

WebGLを使って3D表示を行なっているサイトで、WebVRにも対応している物が出てきています。3Dウインドウの右下あたりに、VRゴーグルのアイコンが付いていて、そこからVRモードに移行できるようになっていたりします。

3DデータのSNSであるSketchfabでは、アップしたデータをVRモード用に調整して、VRモードでみたときに適切なサイズでになるようにする事ができます。小さなフィギュアを目の前に置いたり、建物の中に入って歩き回ったりということもできます。ただ、投稿者が意識していないので適切に設定されていないデータもまだ多いようです。

https://sketchfab.com/feed


##その他リソース

Oculusの開発者サイトにもWebVRについてのドキュメントがあります。簡潔にまとまっていて参考になります。

https://developer.oculus.com/documentation/vrweb/latest/concepts/carmel-intro/

3年前のアドベントカレンダー

https://qiita.com/advent-calendar/2015/webvr

この頃よりは盛り上がると思ったんだけど・・・・・
【Rails】「heroku run rake db:migrate」を実行しようとすると発生するエラーについて

エラーコード

```
rake aborted!
PG::ConnectionBad: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
```



database.ymlをいろいろいじったり、Gemfileを触ってみてもうまく行かない、、、。

と、こんな質問を見つける。


https://stackoverflow.com/questions/45336844/error-when-run-migrations-on-heroku-postgresql-with-rails-5


どうやらアドオンを入れなければいけない、、、？

とりあえず実行してみるよ。



```
$ heroku addons:create heroku-postgresql

Creating heroku-postgresql on ⬢ polar-retreat-48576... free
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
Created postgresql-graceful-23460 as DATABASE_URL
Use heroku addons:docs heroku-postgresql to view documentation

```

からの

```
$ heroku run rails db:migrate
```


なぜか成功！

 ~~理由はよくわからないけど、おそらくdatabase.ymlのproductionのをこうやって書いているからだと思う？~~

ただ単に、herokuでpostgresを使う際にアドオンが必要なだけですね、これ。



```database.yml
production:
  url: <%= ENV['DATABASE_URL'] %>
```



と思ったら、heroku上でうまく動いていない、、、（サインアップしようとするとエラー発生）。

```
$ heroku[router]: at=info method=POST path="/users" host=polar-retreat-48576.herokuapp.com request_id=41dae68e-9bc7-44f3-b0de-198bb81f4c6d fwd="180.235.55.101" dyno=web.1 connect=0ms service=228ms status=500 bytes=1827 protocol=https
```


エラーコードはこれですね。


<img width="1440" alt="スクリーンショット 2018-12-02 18.00.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/272200/ae8bdd98-65ef-19b2-e680-bb7de10918d3.png">

調べたところ、ログインに使っている”devise”というgemでメールを送るのに設定が必要だった。


ということで、以下の記事を読んで設定をする。

https://qiita.com/rasenn/items/70e05a3097138bdb2720

これでやっと動きました。お疲れ様でした！！


ちなみに、エラーは、”rails_12factor”というgemを入れて特定しました。以下の記事で紹介されています。

https://qiita.com/mm36/items/f92fe3b2484ced37a3fd
これだけ覚えとけばもう怖くないAnsibleの（動的）変数

# 概要

　Ansibleで必ず使うことになる変数ですが、プレイブック内で動的にセットする変数（`set_fact`）で思うように値を作ることができないことありませんか？私もAnsibleを使い始めた頃は、こういう変数がほしいけどどうやってつくるんだろう・・・っと悩んだ末、冗長化しまくりのイケてないコードをズラズラ書いていました。しかし、**ブロックスタイル** ＋ **Jinja Template**で自由自在に変数を作ることができますのでもう悩むことはない！

# ブロックスタイル

　ヒアドキュメント（Here Document）に似たような感じで一つの変数や処理に対して複数行の値を入力することができる。可読性を高める効果もある（例↓）

```shell:sample-heredocument
> cat << EOF
The Ansible Advent Calendar !!!
Enjoy Ansible ♪
EOF

------------------
出力結果
------------------
The Ansible Advent Calendar !!!
Enjoy Ansible ♪
```

Ansibleでは以下のようになります
正確に言うとBlock Scalar Styleというらしいですが、[YAMLのリファレンス](http://yaml.org/spec/1.2/spec.html#id2795688)で定義されています

```yaml
- set_fact:
    example: >
      The Ansible Advent Calendar !!!
      Enjoy Ansible ♪

------------------
出力結果
------------------
ok: [localhost] => {
    "example": "The Ansible Advent Calendar !!! Enjoy Ansible ?\n"
}
```

上記の例では`> （folded style）`を使用しましたが、結果からわかるように途中の改行コード(\n)が取り除かれています
改行が必要な場合は`|（literal style）`を使用しましょう。また、最終行に改行の有無の指定もできますので、[こちらのわかりやすい解説サイト](https://yaml-multiline.info/)で違いを確認しましょう！


# Jinja Template

　Ansibleでお馴染みのJinja Templateですが、前述のブロックスタイルの中でフル活用することで自由自在に変数を操れるようになります！

## 基礎編

```yaml

# monthが12の場合は、"The Ansible xxxx...(省略)"と表示
# そうではない場合は、"Coming soon..."と表示
- set_fact:
    example: >-
      {%- set month = 12 -%}
      {%- if month == 12 -%}
        The Ansible Advent Calendar !!!
        Enjoy Ansible ♪
      {%- else -%}
        Coming soon...
      {%- endif -%}

------------------
出力結果
------------------
ok: [localhost] => {
    "example": "The Ansible Advent Calendar !!! Enjoy Ansible ?\n"
}

```

### ポイント

`{%-`と`-%}`内にJinjaテンプレートで使える各種ステートメントが利用できるので、その中で条件分岐、ループ、変数の生成が可能

## 応用編

```yaml

# キーaの値が3のdictにnew_dictを追加する
- set_fact:
    my_list_dict: [{'a': 1, 'b': 2},{'a': 3, 'd': 2}]
    new_dict: {'c': 4}

- set_fact:
    example2: >-
      {%- set _my_list_dict = my_list_dict -%}
      {%- for _dict in _my_list_dict -%}
        {%- if _dict['a'] == 3 -%}
          {%- set dummy = _dict.update(new_dict) -%}
        {%- endif -%}
      {%- endfor -%}
      {%- set dummy = _my_list_dict.append({'a': 5, 'z': 0}) -%}
      {{ _my_list_dict }}

------------------
出力結果
------------------
ok: [localhost] => {
    "example2": [
        {
            "a": 1,
            "b": 2
        },
        {
            "a": 3,
            "c": 4,
            "d": 2
        },
        {
            "a": 5,
            "z": 0
        }
    ]
}
```

### ポイント1

　すでにset_factで定義されている変数はテンプレート内で扱えますが、テンプレート内で定義されている変数のスコープはテンプレート内だけになります。set_factの変数(`my_list_dict`)に代入したい場合は`{{ _my_list_dict  }}`のように出力する必要があります。変数の型（list、dictとか）も保証されて出力されます。ただし、複数回出力した場合は文字列扱いになる

### ポイント2

  `{%- set dummy = _dict.update(new_dict) -%}`のように`_dict`に新たに`new_dict`を追加するように既存の変数を更新する処理では、必ず`set 変数名 = 値`でなければならないため、dummyという変数を使っています

@fumiyas よりアドバイスで

```config:ansible.cfg
[defaults]
jinja2_extensions=jinja2.ext.do
```

にすることで、`set dummy = _dict.update(new_dict)` でなく `do _dict.update(new_dict) `と記述できるそうです


### ポイント3

　list型はappendで要素を追加、dict型はupdateで要素の更新ができます
DockerでJupyter Notebookを使う

# はじめに
本記事は、DockerでJupyter Notebookを使う場合の手順について記載しています。

DockerでJupyter Notebookを使う場合、既存のコンテナにJupyter Notebookをインストールするか、Jupyter Notebook用のイメージを利用するなどの方法があります。

手っ取り早くJupyter Notebookを使う場合は、Jupyter Notebook用のイメージを利用する方法が楽です。

## 構築手順

- イメージのダウンロード  
`docker pull jupyter/datascience-notebook`

イメージのダウンロードは少し時間がかかり、約6GB程度のディスク容量を消費します。

- ハッシュパスワードの生成   
`python3 -c 'from notebook.auth import passwd;print(passwd())'`

ハッシュパスワードの生成は、ダウンロードしたjupyter用のイメージから、一度コンテナを起動して実行します。

- コンテナ起動   
`docker run -d --name notebook -p 8888:8888 jupyter/datascience-notebook start-notebook.sh --NotebookApp.password='sha1:生成したハッシュパスワード'`

なお、上記の場合一般ユーザで起動するため、apt-get等でパッケージのインストールができません。
なので、rootユーザでJupyter用のコンテナを起動する場合は-u rootオプションを付与します。

`docker run -d --name notebook -p 8888:8888 -u root jupyter/datascience-notebook start-notebook.sh --NotebookApp.password='sha1:生成したハッシュパスワード'`

## 実行例
- コンテナ起動

```console
docker run -d --name notebook -p 8888:8888 -u root jupyter/datascience-notebook start-notebook.sh --NotebookApp.password='sha1:bc0db3f093fd:04a36c7759b0c4e8feb1f316b310964be303c8bd'
```

- Jupyter Notebookにログイン   
http://localhost:8888にアクセスする。ハッシュパスワードを入力して、Loginを押下。

![スクリーンショット 2018-12-02 20.03.54.png](https://qiita-image-store.s3.amazonaws.com/0/221759/0474689d-3861-4633-d344-66a124ba623c.png)

Jupyter NotebookのFiles画面が表示される。

![スクリーンショット 2018-12-02 20.04.06.png](https://qiita-image-store.s3.amazonaws.com/0/221759/1af53996-c6d9-4371-58ee-35f3d6ac4585.png)


## 参考
[Running a notebook server](https://jupyter-notebook.readthedocs.io/en/stable/public_server.html)
pythonパッケージ

1. import ＜モジュール名＞
モジュールがmodule型のオブジェクトとしてインポートされる。
print()で出力するとどのファイルを読み込んでいるかが確認できる。

2. モジュールの関数や変数を直接使えるようにインポートしたい場合はfromを使う。import <モジュール名>.<関数名>などとするとエラーとなるので注意。

3. モジュールをインポートする順番：
①標準ライブラリ
②サードパーティライブラリ
③ローカルライブラリ（自作のライブラリ）

4. from ＜モジュール名＞ import <オブジェクト名:変数名,クラス名,関数名>

5. from ＜モジュール名＞ import *(全てのオブジェクト)

6. モジュールに別名をつけてインポートする場合：
 import <モジュール名> as <別名>

7. オブジェクトに別名をつけてインポートする場合：
 from <モジュール名> import <オブジェクト名> as <別名>

7.1 NumPyやpandasなど、省略名でインポートするのが慣例となっているライブラリもある。
import numpy as np
import pandas as pd

8. パッケージのモジュールをインポートする場合：
import <パッケージ名>.<モジュール名>
from<パッケージ名> import<モジュール名>

8.1 オブジェクトをインポートする場合：
from <パッケージ名>.<モジュール名> import <オブジェクト名>
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

1. メソッドを呼び出すと、何らかの値を返す
2. from モジュール名　import クラス名（もしくは関数名や変数名）
こういうのが無い所に転職したい＠転職活動中

#はじめに
//2019/10/07 いろいろ省略、削除

##１．開発環境が悪い
*エンジニアは、待ち時間が発生するのは我慢できない。*

##２．業界の平均収入が低い
*エンジニアは、専門職だ。*

##３．技術が評価されない
*時間ではなく、コードで評価されるべきだ。*

##４．残業が多い
*残業で得た額だけ、人生を失っている。*

##５．雑務がある
*エンジニアは、エンジニアにしか出来ないことをやりたい。*

##６．レベルを下のラインで合わせないといけない
*エンジニアは、学習し続ける必要がある。*

##７．会議が多い
*会議のための会議はもうこりごりだ。*

##８．こういうの
```VB:hoge.vb
'*************************************
' hoge() 
' 機能      ：ほげほげする。
' 引数      ：a As Integer : ...
'             b As String : ...
' 作成      : 2008/01/23
' 作成者    ： ○○
' 修正      : 2009/06/23 ... ：△△
'**************************************
Public Sub hoge(a As Integer, b As String)
    'ほげほげ
End Sub
```

---

遅ればせながらご報告。
2020/2　コロナが流行る直前に転職しました。
今はc#,ASP.net,javascript(とjQuerry)を書いてます。色々工夫できて面白いですね。
【備忘録】VSCodeでerbファイルをコードフォーマットの際、ドキュメント フォーマッター存在なしエラーの対応

今更ながらVSCode使ってRailsのView(.erb)を整形する方法。

デフォルト状態では
>インストールされた 'erb'ファイル用のドキュメント フォーマッターが存在しません。

とエラーが出るのでその対応

(コードフォーマットのショートカットキー
デフォルトでは
windows:　Shift + Alt + F
mac:　Shift + Option + F)

Beautify導入
---
VS Codeに[Beautify](https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify)をインストールする

設定
---
インストール後、VS Codeの
「Code」→「基本設定」→「設定」を辿り、User Settingsを開く

User Setting内、"beautify.language"の"html"に対して"erb"を追加

![スクリーンショット 2018-12-02 19.29.01.png](https://qiita-image-store.s3.amazonaws.com/0/238856/b4a41f96-126f-cb2a-d6b9-60d7fca6f8e7.png)

ユーザ設定にerb追加

```
"beautify.language": {
・・・
        "html": [
            "htm",
            "html",
            "erb"
        ]
    }
```

あとはerb開いてコードフォーマット

参考
---
[VS Codeにおける.erbの自動整形](https://teratail.com/questions/131962)
VBAとPDFCreatorによるPDF出力について

#はじめに
仕事上いろいろあったので試行錯誤したので備忘録として残します。（日本語リファレンスとかないので）
おそらく、このようなことを使うことはほとんどないかと思われますが、もし誰かのお役に立てればと思いこのエントリを作成しました。

今回のお話は、Excelでのお話とさせていただきますが、おそらく他のWordなどでも同じように使えるかと思います。

ちなみに、ここでは紹介しませんが、Windows 10から搭載されている仮想プリンター「Microsoft Print to PDF」やOfficeソフト内にはPDFで保存する機能がありますので、そちらで問題なければそちらを使ったほうが賢明です。

#こういう人におすすめ
* 現在のOfficeのPDF保存機能がいまいちで別なものを探している人
* PDF保存時、きれいに写真出なくて困っている人
* 仮想プリンター経由でPDF出力できるようにしたい人

#前提条件
始める前に以下のソフトのインストールと参照設定が必要です。

* PDFCreator　（ https://www.pdfforge.org/ ）の内のPDFCreator（FreeでOK）をインストール
* インストール後、参照設定で「PDFCreator_COM」をチェック（よく分からなかったら調べてね）

こんな感じでチェックを入れてもらえれば動きます。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/321941/10b012ee-33eb-4f90-8eab-5e601053d9f1.png)

* Excelなどを開いた後プリンターをPDFCreatorに変更する。（変更しないと動かないはおろか、普通のプリンターから出力されてしまいます。）

#PDFの出力方法
ここまで来たらあっという間です。
これをコピペして

```vb

Sub PDF_Output()
    Const JobTimeout As Integer = 15
    Const PDF_DPI As Integer = 300
    Const PDF_CompLevel As String = "JpegMedium"
    Const DistPath As String = "C:\Tmp\TestPDF.pdf"
    Dim PDFCreatorQueue As Queue
    Dim PrintJob As PrintJob
    
    Set PDFCreatorQueue = CreateObject("PDFCreator.JobQueue")

    'ここでPDFCreatorを選択する
    Application.Dialogs(xlDialogPrinterSetup).Show
        
    PDFCreatorQueue.Initialize
    
    ActiveWindow.SelectedSheets.PrintOut _
      Copies:=1, _
      Collate:=True
    
    If Not PDFCreatorQueue.WaitForJob(JobTimeout) Then
      MsgBox ("印刷ジョブが見つからない為、PDF出力されません。")
    Else
      Set PrintJob = PDFCreatorQueue.NextJob
      PrintJob.SetProfileByGuid ("DefaultGuid")
      
      'Compressionなどについて
      'ここで画像の圧縮率を変更…JpegMaximum（高圧縮）→JpegMinimum（低圧縮）

      '写真圧縮の明示
      Call PrintJob.SetProfileSetting("PdfSettings.CompressColorAndGray.Enabled", "True")
      
      '写真リサンプリングの明示
      Call PrintJob.SetProfileSetting("PdfSettings.CompressColorAndGray.Resampling", "True")

      '写真のリサンプリング設定（DPI　300）
      Call PrintJob.SetProfileSetting("PdfSettings.CompressColorAndGray.Dpi", PDF_DPI)

      '写真の圧縮は中圧縮設定
      Call PrintJob.SetProfileSetting("PdfSettings.CompressColorAndGray.Compression", PDF_CompLevel)
      
      PrintJob.ConvertTo (DistPath)
      
      If (Not PrintJob.IsFinished Or Not PrintJob.IsSuccessful) Then
          MsgBox ("次のファイルがPDF出力できませんでした。: " & DistPath)
      End If
    End If
    
    MsgBox ("オブジェクトをリリースします。")

    PDFCreatorQueue.ReleaseCom

End Sub

```

こんな感じです。

いろいろ書いていますが、以下だけが必要です。

* CreateObjectでオブジェクトを作成する。
* オブジェクトをInitializeする。
* なにかPDFCreatorで印刷をする。（そうするとキューに溜まる）
* WaitForJobでジョブ待ちする。（引数はintでタイムアウト時間）
* ジョブがあったらNextJobでジョブをセットする
* SetProfileByGuidでプロファイルを指定する。（ここでPDFやJPEGとしてプロファイルを設定する）
* ConvertToで出力パスに出力する。
* ReleaseComでCOMを手放す

簡単ですね。
ちなみに、いろいろ調べるとMergeなどもできるみたいですね。便利です。

#参考
参考できるサイトも少ないですが、公式のリファレンスだけ見れば何となくできるかと思います。
あと、インストールしたフォルダ内に他のサンプルもあるのでそれを参考にするのもよいかと思います。

* http://docs.pdfforge.org/pdfcreator/latest/en/pdfcreator/com-interface/
* http://docs.pdfforge.org/pdfcreator/latest/en/pdfcreator/com-interface/reference/settings/
カスタムバリデートでバリデーション後編　初心者→中級者へのSTEP4/25

#カスタムバリデートでバリデーション後編
**はじめに**
はい、後編です。前回は[こちら](https://qiita.com/kamohicokamo/private/6b89246de2d1f116041e)。
自己満で書いてたら、意外と見てくれている人がいて恐縮です。頑張ります。ンゴンゴ！
では今回は、レコードの複数の属性をバリデートするカスタムバリデーションを説明。

##レコードの複数属性に対するカスタムバリデーション##
前回は個別ということで`EachValidator`を継承しましたが、今回は`Validator`を継承する方法をご説明。

##ケース説明##
今回は例として、プレミアム会員と、通常会員の場合でかけるべきバリデーションが違う時を考えます。
プレミアム会員様は100文字まで自己紹介文をかけますが、通常会員の財布の紐が硬い方は10文字でしか自己紹介ができないようにします。

##Userモデル##

```User.rb
class User < ApplicationRecord
  enum status: {
    normal:  0, #通常会員
    premium: 1, #プレミアム会員
  }
  include ActiveModel::Validations
  validates_with UserValidator
end
```
enumで会員の状態を把握してます。`status`が`normal`か`premium`かでかけるバリデーションを分岐させます。もちろんこれは`User.rb`に書いても機能します。ですが、その様な条件がどんどん増えてくと`User.rb`がおデブちゃんになってしまいます。痩せさせたいですよね？では、結果にコミットしましょう。

てな訳でバリデーションルールは上述コードを見る通り、`UserValidator`に書きます。
validates_withによって呼び出されてます。（validates_withはActiveModel::Validationsをインクルードせんと使えないですのでインクルードしてください。）

```app/validators/user_validator.rb
class UserValidator < ActiveModel::Validator

  def validate(record)
    if record.status == 'normal' && record.description.length > 10
      record.errors[:description] << '通常会員は10文字以内で自己紹介してください。'
    elsif record.status == 'premium' && record.description.length > 100
      record.errors[:description] << 'プレミアム会員は100文字以内で自己紹介してください。'
    end
  end

end
```
if文が汚い...
ですが、これでモデルはスッキリのままバリデーションがかけました。
[前回](https://qiita.com/kamohicokamo/private/6b89246de2d1f116041e)の記事では個別の属性にバリデーションをかける時のカスタムバリデートを説明しましたが、今回も属性１つじゃねえか！！という方、はい。少しケースがわかりづらかったカモです。ごめんなさい。今回の方法はレコードの複数属性にかけるバリデーションを記述するということを意識してください。全ての属性に`validate_each`書いて検証するのはめんどくさいですよね？ですからまとまったバリデーションはここに書いてmodelはスッキリさせましょうということです。

##まとめ
具体例のしょぼさが経験のなさを物語ってますね。頑張ります。明日は今回登場した`enum`についてご説明します。
便利です。頑張ります。

##参考にしたの
Active Record バリデーション
https://railsguides.jp/active_record_validations.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF

【パーフェクトRails】バリデーションをクラスに分離する
https://waterlow2013.hatenablog.com/entry/2016/10/11/011312
グルメアプリ『グルポケ』のUXは、こうして生まれた！

# はじめに
弊社の @yoshixj が珍しくノリノリで「アドベントカレンダーやりたい！！！」といっていたので、
二番手として、社長の僕が文章が苦手ながらも書いていきます。

今回は、弊社アプリ「グルポケ」のUXを考える上で
私自身が大きく影響をうけているもの、
参考にしているものについて書いていきたいと思います。

弊社アプリ「グルポケ」は、行ったお店や行きたいお店を簡単にためることができるアプリです。
今後、ダイナミッククーポン機能を実装し、ユーザーさんごとに、リワードを最適化して
出し分ける仕組みを提供していきます。

## 対象としている人
- プロダクトづくりの猛者というよりは、これからプロダクトを作りたいという人
- 今のプロダクトを更に磨きたいなと思っている人
に向けた記事です。

# プロダクトづくりで特に参考にしたモノたち！
実際、多くのUXに関する書籍やweb記事を読んでいるのですが、
その中でも特に印象に残っているものをピックアップして紹介します！

## その1 『MOTHER』
Nintendo スマッシュブラザーズをプレイしたことがある人は
だれでも知っているネスが主人公のRPGです。
このゲームはコピーライターでほぼ日の社長である
糸井重里さんがつくったゲームでもあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/84779/03b05dcd-2d38-ccda-ff3f-a93cd3081603.png)

日常に染み出してくる違和感や異物を、一人のこどもであるネスが解決していく物語です。
すごく癖の強いゲームなのですが、街を歩いている人のひとりひとりが、
どこか含みのある話をしてくれて、細部まですごくこだわりのあるゲームになっています。

MOTHERは、ゲーム内の音楽や、街の人達との会話、の細部まですごくこだわり抜かれていて、
その音楽や会話が、感情にダイレクトに響いてきます。

僕らのアプリでも、アニメーションの際の音声や、文言にこだわることで、
より深みのあるUXを作れるのではないかなと思っています。

## その2 『新ゲームデザイン』
ポケットモンスターを生み出した、田尻智さんのゲームを作る上での考えや、
田尻さんが作ってきたゲームをどのような思考で生み出したのかが書かれた本です。

この本の巻末に、ポケットモンスターを作る際に考えたことを
2,3ページでまとめてあるのですが、そこの2,3ページが金言の嵐。
着想として、昔のメンコ遊びを参考にしているらしいです。
- メンコを集め
- 友達とあつまってメンコを交換する
このプリミティブというか、昔から遊びの中で当たり前にあった「ギャザリング」という概念に
ポケモンという肉付けをしていったそうです。

ポケモンを交換して、学校の友だちと会話がはじまったり、
「おい、おれのポケモン返せよ！」的なコミュニケーションが
起こるところまで想定しており、
弊社アプリでも、ある機能をつけたときに、
ユーザーさんの生活がどのように変わり、
どのようなコミュニケーションが起こるのかまで
想定した上で機能を追加するようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/84779/cf371c16-47c4-f1cb-cd76-917e0e49804d.png)
http://amzn.asia/d/fHFHz2y

## その3 Appstoreに出ている知らないアプリたち全て

NiCOLAでは現在アプリ開発を行っているのですが、
世の中に実際にリリースされているアプリが、どんなUXに関する書籍よりも勉強になると言っても過言ではないです。

ランキング入りしているアプリ、トレンドに載っているアプリ、新着アプリ、ソシャゲアプリ、
様々なアプリを触ってみること、良いと思った体験、悪いと思った体験をつぶさに、
メモして、その時の感情を言語化していくことで必ず、アプリ開発に役立ちます。
というより、これが最低条件だと個人的には思っています。


# 最後に
サービスを作る上で、常に僕たちのチームが考えているのは
このプロダクト、この機能、ひいてはこの文言が、
ユーザーさんの生活をポジティブに変えることができるのか、ユーザーさんのリアルな場でのコミュニケーションが変わるのかというところに、フォーカスしてサービスづくりをしています。
まだまだ小さなチームではありますが、
ここからの僕らの新しいプロダクトが楽しみで仕方がないです。

実は、はじめてのアドベントカレンダーの参加でしたが、
普段まったくブログを書かない私でも、日時、期限を区切られていることで
書くためのモチベーションが湧くので、かなり良かったです。
来年もやりたい！まずはサイゼでの打ち上げを、首を長くして待っていますmm
golangでも二酸化炭素濃度をCO2-miniで測りたい

# 概要
少し前、授業で生徒が寝てしまうのは換気が不十分だからだという[ツイート](https://twitter.com/greatpunkin/status/989632261912850432)が話題になりました。
換気が不十分だと二酸化炭素濃度が上がり、思考が鈍くなったり、眠気に襲われるそうです。
これからの寒い時期、換気も不十分になりやすいです。
気づかないうちに生産性が下がるのはエンジニアとして避けたいことです。
このため、いい感じに二酸化炭素濃度を測りたいと思いました。

実はこれをやろうとしたのは一年前くらいなのですが、挫折していました…。
ですが、つい先日なんとかLT発表という締切を自分に課してかろうじて達成できました。
そんな記録です。

# 先行事例の調査
[こちら](http://r-kurain.hatenablog.com/entry/2016/01/26/164648)の方の記事が参考になりました。
どうやらAmazonで一万円ぐらいで買えるCO2-miniが良さそうです。

CO2-miniの値を取得するライブラリは ruby, python, perl, C, Node.js...
いろいろありました。
しかしながら、Golang版はどうやら見当たらない様子。
せっかくなら作りたいと思いました。

# ライブラリ選定
先述の記事にある通り、このCO2-miniというデバイスを扱うにはHIDAPIを利用したほうが良いようです。

Golangでそれに該当する簡単に扱えるものとして
https://github.com/zserge/hid
を選択しました。選定の理由としては
> Simple HID driver for Go (pure golang, no dependencies, no cgo) 

という説明書きが良さそうだったからです。
USB周りは各言語様々なライブラリが必要だったりとハマりやすいと思います。
そういった点をGolangで解決できたらいいなという目論見もありました。

# できあがったもの
[こちら](https://github.com/kotomiya/co2mini)です。
ライブラリのサンプルコードと参考にした記事をほぼそのまま流用しています。

# 感想
出来上がったものが存外シンプルになって少し驚きました。
他の言語のものを移植したことはなかったのですが、ちゃんとできてよかったです。

一方でちょっと反省点もあります。
元の参考にさせていただいたrubyのコードがこんな感じなのですが

```ruby
result = (0..7).map{|i| (0x100 + phase3[i] - ctmp[i]) & 0xff }
```

Golangでそのまま0x100で計算すると怒られてしまうので誤魔化しています。

```golang
res[i] = (0xFF + b[i] - ctmp[i] + 0x01) & 0xFF
```

とりあえずやってみる、完璧ではないけれど完成させるという目標は達成できたかなと思います。

# 今後の予定
現在Mackerelに値を通知してグラフ化するコードを書いています。
またGoogle Homeにもいい感じに通知したいなと考えています。
[Google Homeへの通知にはGolang版があります。](https://qiita.com/ikasamah/items/48ca06c5a4e0421b8756)
そちらを使って全部Golangで通すということができれば面白いかなと思っています。
【プログラマのためのSQL 3章】スキーマレベルのオブジェクト

## はじめに
第3章は「スキーマオブジェクト」について。
データベースはただのテーブルの集まりではなく、他にも様々な概念がある。

どうしてもテーブルに目が行きがちだが、
各オブジェクトを包括する「スキーマ」や、
それらに付与できる「制約」といった概念は重要である。

## SCHEMA(スキーマ)
「スキーマ」という言葉はとても抽象的でイメージしづらいが、
データベースをOS、テーブルをファイルと例えるなら、
ディレクトリに該当するものというイメージ。

- テーブルなどの全てのオブジェクトは、必ず何かしらのスキーマに属する
- スキーマ内には同名の同じオブジェクトを作成できない
- スキーマには所有者、書き込み権限などの概念があり、それらのルールに従ってオブジェクトが作られる。

実際にはCREATE SCHEMA文でスキーマを作成する際は、
以下のようなことを定義する。

- スキーマ名
- ドメイン
- ユーザのアクセス制限(grant)
- スキーマ全体の制約(assertion)
- ASCIIやUnicordなどのキャラクタセット(character set)
- 文字列比較時の判定方法の指定(collection)
- 異なるキャラクタセット間のマッピング設定(translation)
- 物理ストレージの割り当など(各DB製品のオプション)


## DOMAIN(ドメイン)
日本語で定義域と呼ぶ。
これも抽象的な言葉なので個人的に好きではない。
どうやら、データベースにおけるドメインは、
「ユーザが独自に定義するデータ型のこと」らしい。
ドメインは列に対するデータ型の宣言の代わりに使うことができる。

注意点として、ドメインを定義するときは基本的なデータ型を使って定義しないといけないため、ドメインの上にドメインを定義することはできない。

#### CHECK句

ドメインを始め、いくつかのオブジェクトに対して制約を儲けることができる。
例えば、米国の州コードを表すドメインを作成すると以下のようになる。

```sql
CREATE DOMAIN StateCode AS CHAR(2)
DEFAULT '??'
CONSTRAINT valid_state_code
CHECK (VALUE IN ('AL','AK','AZ',......));
```
もしドメインという概念がなかったら、
各テーブル定義にこのCHECK制約をコピーしなければならない。

## SEQUENCE(シーケンス)

シーケンスは、呼び出されるたびに連続した値を生み出すジェネレータであり、関数のように使うことができる。

シーケンス機能は、現在では多くのDB製品で実装されているが、順序が付与されるということは集合指向ではなくなる非リレーショナルな拡張なので極力使うべきではない、とのこと。

## ASSERTION(アサーション、表明)
「表明」とも呼ばれ、スキーマ内の複数のテーブルに対して制約を適用する。

この表明を使うことで、単一テーブルに付与するCHECK制約にはできないことが可能になる。

例えば、テーブルAの件数は、テーブルBとCの件数の合計に等しい、という論理的な制約を表現したい場合に表明が使える

```sql

CREATE ASSERTION assert_total_count
CHECK (SELECT COUNT(*) FROM TableA) = 
(SELECT COUNT(*) FROM TableB) + (SELECT COUNT(*) FROM TableB);
```

テーブルに対するCHECK制約は「テーブルが空の時にTRUEになる」という挙動のため、表明を使わないとこの制約を実装するのは難しい。

#### スキーマレベルの制約の実装

ASSERTIONはとても便利そうに見えるが、
スキーマレベルの制約を実装する注意点としては以下の通りである。

- ASSERTIONはまだ多くのDB製品で実装されていない。
- MySQL等ではCHECK制約も実装されていない。
- 代替としてはプロシージャやトリガーを使う必要がある。
- トリガーはベンダー独自の手続きコードを書くことになるので注意。
- テーブルの整合性を保つためにトリガーを使うと、INSERTやUPDATEの度にトリガーが実行される。
- 制約に違反する場合、トリガーが自動的にデータを調整してくれるわけではない。

本書では、いくつか実装例が載っているのでぜひ確認して欲しい。

- スキーマレベルの制約をトリガーを使って実現する方法
- スキーマレベルの制約をテーブル分割(ビュー)とストアドプロシージャで実現する方法
- 表明を使って実現する方法

が載っている。
盛り上がっているQiita記事を見つけるサイト「🔥-qiita.tk」を作りました。

この記事は[個人開発 #2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/private-developmen2)の2日目です。

昨日は @mikkame さんの　「[Qiitaにコメントを投稿する前にHRTを確認出来るChrome拡張機能をつくった](https://qiita.com/mikkame/items/80bbbe0f401471e9168c)」 でした。

なんでZIPアップロードできないねん・・・

# なぜ作ったのか

Qiitaではトレンド、タイムライン、タグフィード、マイルストーンで新しい記事への出会いを提供してくれています。
しかし盛り上がっている記事（いい意味でも悪い意味でも）についての導線がありません。
（トレンドがひょっとしたらそうかもしれませんが直接的ではありません）
これは、最近のコメント一覧を表示する画面やAPIがないためです。
これを解決するために[https://🔥-qiita.tk](https://🔥-qiita.tk) を作りました。

# 使ったもの

- Laravel (PHP 7.2)
  - いつもつかってる
  - 適当なレンタルサーバで動くのでなかなかPHPからRubyに移動できない
- cloudatcost
  - サーバ費用を安くすませるために使用（月額ではなく払いきりっぽい）
  - 念のためプリペイドカードで支払っている
- vestacp
  - 無料のサーバ管理ソフト
  - セットアップが手間なのでこれで対応
  - 簡単にlamp作れる
- cloudflare
  - SSL適用のため
  - サーバのIPを隠蔽するため（セキュリティアップ） 
- freenom
  - 無料ドメイン
- bulma css
  - UI構築のため
- Vue
  - ほぼ何もしていないけど一応つかった。
  - 今後pusher とかでリアルタイム通知作った時にでも活用したいと思う。 

# 運用費用について

サーバ代は初期で払ってあるので0円（年に$9請求される噂もある。それでも月100円以下）。
ドメインもSSLも無料だ。


# ドメイン名について

絵文字ドメインを使って見たかった。（chromeで表示できないのなんで・・・？廃止された？、もしかして.comとかじゃないとダメ？)
cloudflareの管理画面では絵文字反映されているのだけど・・・。
盛り上がっている記事に炎上系が多いので🔥にしました。



# 最後に

構想1時間、実装3時間、デプロイ1時間ぐらいな超手抜きアプリです。
新幹線の移動時間でできそうですね（今日は一歩も外に出ませんでしたが。）

あしたは @mikkame さんの投稿です！
JavaScript で文字列を最大 n 文字までの長さに分割した配列に変換する

この記事は [ShoTime Advent Calendar 2018](https://qiita.com/advent-calendar/2018/shotime) の 2 日目の記事です。

文字列を画面上に表示させる時に、１行あたりの最大表示数を、`n` 文字までにしたい。というような状況があり、どのようにすれば良いか悩んだことがあり、そのときの解決策です。

具体的には、例えば次のような感じで、 `text` という文字列リテラルを `textArray` のような配列に変換させることができないか考えました。

```js
const text = 'ShoTime1,000人'
const textArray = ['ShoTime', '1,000人']
```

`text` をそのまま表示させようとすると、表示領域からはみ出てしまいます。 

![608836c810f63fc9ef26e1c5b5cec150.png](https://qiita-image-store.s3.amazonaws.com/0/62259/714df563-4f58-05ce-ef6d-52876bbb4a3a.png)

`textArray` のように配列として適切に分割された文字列であれば次のように領域内に表示できます。

![f162e2ef6bd2fb7ef66ed71ca1a9dcad.png](https://qiita-image-store.s3.amazonaws.com/0/62259/6fcd35dd-6089-34f6-00d2-b4c3b3e31fdd.png)

[ShoTime](https://shotime.now.sh/) では、Canvas を利用して文字列を表示させたかったので、その表示させる部分を含む全体のコードを載せておきます。（簡易的に書き換えています）

[jsfiddle にコード置いています](https://jsfiddle.net/akifo/xetgns2d/19/)

```html
<div id="app"></div>
```

```js
const WIDTH = 200
const HEIGHT = 100
const TEXTS = 'ShoTime1,000人'

canvas = document.createElement('canvas')
canvas.width = WIDTH
canvas.height = HEIGHT
ctx = canvas.getContext('2d')

// background
ctx.fillStyle = '#4fc08d'
ctx.fillRect(0, 0, WIDTH, HEIGHT)

// texts
let textArray = toArrayFromText(TEXTS, 7)
ctx.font = `700 30px "Roboto Mono"`
ctx.fillStyle = '#fff'
textArray.forEach((t, index) => {
  ctx.fillText(t, 10, 40 + (index * 40))
})

// Render
const app = document.getElementById('app')
app.innerHTML = ''
app.appendChild(canvas)

function toArrayFromText (text, maxLength) {
  if (typeof text !== 'string') return
  else if (typeof maxLength !== 'number') maxLength = 10
  return text.match(new RegExp('.{1,' + maxLength + '}', 'g'))
}
```

このコードの `toArrayFromText` によって、適切な変換ができるようにしています。
変換ができてしまえば、あとはループさせて表示させるだけとなります。

toArrayFromText 関数は、実運用時には、他にも改行コードへの対応や、サロゲートペアの考慮など課題があります。ですが、簡易的にするためここでは紹介しておりません。

## さいごに
限られた領域にユーザーが入力した文字列を表示させるという課題は [ShoTime（目標達成シート）](https://shotime.now.sh/) で実際に利用しています。ぜひ触ってみてください！
PhpSpreadsheet で発見されたXXE脆弱性について

Fusic Advent Calendar ２日目です。
昨日は、 @kozo による、 [開発効率を上げるGitHub Apps + hadolintのすゝめ](https://tech.fusic.co.jp/github-apps/%E9%96%8B%E7%99%BA%E5%8A%B9%E7%8E%87%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8Bgithub-apps%E3%81%AE%E3%81%99%E3%82%9D%E3%82%81/) でした。
Github Apps を作ってみようという気持ちになりました。  

さて、本日は、先日 PhpSpreadsheetで発見された脆弱性について書いてみようと思います。

対象のissue はこちらです。 
https://github.com/PHPOffice/PhpSpreadsheet/issues/771


## この問題を知った経緯
ずっとgithubを追っていたわけではありません。
そして、特に毎日流れてくる大量の脆弱性情報をウォッチし続けてるわけでもありません。
そんな私がこの脆弱性を知ったのは、Scrutinizer のおかげでした。  
Scrutinizerがセキュリティのissue 上がってるよ！と教えてくれたのです。
(正確には、Scrutinizerでセキュリティissueが上がってるよと先輩が教えてくれました)
ありがとう！Scrutinizer！

# 起こった問題
## XXE 脆弱性
XXE脆弱性という言葉を初めて聞きました。
XXE は、 XML eXternal Entity という言葉の略語みたいです。
https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)
https://blog.ohgaki.net/xxe-xml-external-entity

こちらの記事がとても参考になります。
https://www.mbsd.jp/blog/20171130.html
https://www.mbsd.jp/blog/20171213.html

詳しくは上の記事を読んでほしいのですが、簡単に、ごくごく簡単に説明すると、
XMLの外部ファイルを読み込む機能を悪用し、
悪意のあるコードを実行することができるという脆弱性です。
怖いですね。  

## 発生条件
アップロードされたXMLファイルがUTF-8以外の文字コードであった場合に起こる問題だったようです。
Issueは、UTF-7 の場合に起こると起票されていますが、ディスカッションの中で、UTF-16 でも起こるという追加情報が書いてあります。  

## 原因と対策
XXEの問題を防ぐために、 PhpSpreadsheetには、`SecurityScan()` というメソッドが準備されています。
今回の問題は、上述の発生条件下で、`SecurityScan()`がスキップされてしまうというものでした。  
こちらの[Pull Request](https://github.com/PHPOffice/PhpSpreadsheet/pull/780) で対策されています。

直接的な解決策は、 [libxml_disable_entity_loader(true)](http://php.net/manual/ja/function.libxml-disable-entity-loader.php) を利用して外部エンティティの読み込み機能を無効にするというものです。
興味深いのは、[当該issueの議論の中](https://github.com/PHPOffice/PhpSpreadsheet/issues/771#issuecomment-439470657)でlibxml_disable_entity_loader自体のバグについても考察がされていることです。この議論に、OSS開発の奥深さを感じました。
また、UTF-8 以外の文字コードでエンコードされているファイルは UTF-8にエンコードしてから処理をするなど、異なる文字コードへの対策が強化されています。  
更に、UTF-7 でエンコードされたファイルに対するテストも行われ、今回の対策の有効性が検証されています。  

## アップデート
すでに、脆弱性対策を行ったバージョンがリリースされています。  

||PhpSpreadSheet|
|:-:|:-:|
|バージョン|>=1.5.1|

にアップデートしましょう。

## 脆弱性をGithub の Issue で報告するということ

Issue 内でも言われていますが、もし脆弱性を発見した場合、
Github のIssue にその内容を記述するのは適切ではありません。
ゼロデイ攻撃が行われる可能性があるからです。
もしも脆弱性を発見したら、メンテナーの方にこっそりとメールしましょう。  

# 感想  
今まで脆弱性についてしっかり調査したことはありませんでしたが、
調べてみるととても奥が深いことが分かりました。
特に、libxml_disable_entity_loaderのバグについて議論しているところは感動しました。
これからも、時間があったら調査してみようと思います。


明日は、 @leedohyung-dba による`VUI設計及び開発の話 Amazon Alexa版` です。
お楽しみに！
UXエンジニアの定義

UXと一言でいっても、非常に意味が広く、UXエンジニアと自称しても
実際に何ができるのか曖昧で誤解を与えかねないと思っています。
そこで、主観と偏見を含むことは承知の上で、UXエンジニアの定義について考えてみました。

# UXの定義
はじめにUXの定義について軽く触れておきます。
UXでググると説明としてよく使われているのが以下のUXハニカムです。
ご存知の通り、UXは単に使いやすさだけでなく、信頼性といった要素も含みます。

![alt](https://semanticstudios.com/wp-content/uploads/2004/06/honeycomb.jpg)
(画像の引用元: http://semanticstudios.com/user_experience_design/)

# UXエンジニアの一般的な定義
世の中的にはUXエンジニアはフロントエンドエンジニアの延長という意味合いが大きいように思います。
UXエンジニアの募集要項を検索してみますと、「UI/UXエンジニア」と一括りにされていることが多いですし、
求められるスキルもフロントエンドのものです。

[UX Engineers: What we are] (https://uxplanet.org/ux-engineers-what-we-are-2b0c4d10b3a6)の中では、デザインとフロントエンドスキルを持つ者だと定義されています。
![alt](https://cdn-images-1.medium.com/max/800/1*duIOGzfyXZX0ivgyLswrtQ.png)
(画像の引用元: https://uxplanet.org/ux-engineers-what-we-are-2b0c4d10b3a6)

# 〇〇のUXエンジニア
冒頭でも述べたようにUXの意味は非常に広いため、「私はUXエンジニアです」というのは、「私はITコンサル
タントです」というようなものではないかと個人的に思います。
一言にITコンサルと言っても広いため、どの業界に詳しいといった絞り込みをする必要があります。

同じように考えると、現状広く言われているUXエンジニアは、「WebフロントエンドのUXエンジニア」と分野を
限定して伝える方が誤解が生じないのではないかと思います。
同様に、「ハードウェアのUXエンジニア」「組込みアプリのUXエンジニア」などもあると思います。
これらの場合、必要なスキルセットは、それぞれにおいて異なります。

# さいごに
まとまりの無い文章になってしまいました。自身はGUI専門ではありませんが、UXについてはこだわって開発を
してきましたので、現状の「UI/UXエンジニア」という風潮に疑問を感じ、記事を書いてみました。
WindowsへのGo言語環境のインストール方法

#ダウンロード
##公式ページ
Goをダウンロードするには[Goの公式サイト](https://golang.org/)へアクセスし、[Download Go](https://golang.org/dl/)をクリックしてダウンロードページに飛びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266855/c231456c-e6b5-239c-4171-d67a13caf3cc.png)
ここから、各OS環境向けのバイナリファイルをだうんろーどすることができます。又、各バイナリファイルの名称は次のようなルールに基づいています。
```
go[Go's version].[OS].[-(Option)OS-version].[Extension of a compressed format]
```
使用している環境にあったバイナリファイルをダウンロードしてください。

#インストール
##MSIインストーラを使用する
Winsowsへインストールする場合は手軽にインストールが可能であるMSIインストーラが提供されています。ダウンロードページから拡張子が[.msi]になっているファイルをダウンロードしてください。
ダウンロードしたMSIインストーラを起動します。ここではWindows10の場合での画面です。
1.起動したら[Next]ボタンをクリックして進めます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266855/614760d0-a2ab-eaa1-00c5-4159c4f3cb39.png)
2.ライセンスの内容を確認し、同意するなら「I accept the terms in the Agreement」にチェックを入れ、[Next]ボタンをクリックして進めます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266855/7c23d1af-8f30-3d70-6366-5e3128695435.png)
3.インストールする先のホルダを指定する画面が表示される。標準ではC:\Go\が指定されています。[Change]ボタンをクリックし、任意の場所に変更することも可能です。
良ければ[Next]ボタンをクリックし、次に進めます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266855/1d7c7178-e73c-ca3d-ab2f-441af83be59a.png)
4.ここまでに問題がなければ[Install]ボタンをクリックし、インストールを始めてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266855/03fd7dd3-0168-7f5d-8e1a-9b89130091d7.png)

##環境変数の設定
Goにはコマンドプロンプト上で実行されることを前提にしたツールが含まれているため、Windows上でこれらを実行するためには、環境変数の設定が必要です。

###Path
環境変数Pathの設定を行います。環境変数Pathは、コマンドプロンプトから入力されたコマンドに対応する実行ファイルが格納され阿多フォルダー群を指定するためのものです。この設定を済ませないとコマンドプロンプトからツールを使用することができません。
Windowsの検索ボックスなどから環境変数と検索すると、該当する機能が表示されます。ここでは「環境変数を編集」を選択してください。
環境変数の設定画面が開いたら、まず「システム環境変数」の中にPathという環境変数があらかじめ定義されていることを確認し、選択してから[編集]ボタンをクリックしてください。
最初の設定どおりに進んだ場合は、[C:\Go\bin]を追加してください。
編集が完了したら、[完了]ボタンをクリックして、終了してください。

###GOPATH
Goは外部のライブラリが格納されているフォルダーの場所を知るために環境変数GOPATHを利用します。この環境変数が未設定であると、一部のGoのツールが起動しません。
環境変数GOPATHに設定するフォルダは任意で構いませんが、ホームフォルダの下に作成するのが無難です。まずはログインユーザのホームフォルダーに新規フォルダーgoを作成してください。そのフォルダーの場所を環境変数GOPATHに設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266855/d1a64e26-ebe9-e6d0-a9b6-7cf1122f9ab5.png)
%HOME%はWindows特有の環境変数の埋め込み方で、環境変数HOMEの値に展開されます。例えば[C:\Users\sort]。
Windows環境へのGoのインストール作業はこれで終了です。
Python でFPGA/シミュレーションをしてみよう

#シミュレーションを実行してみる
実行に先立ってシミュレーション用のソフトをインストールしておきます。わたしは　iverlog(Icuros Verilog) を使っています。Windows では"iverilog windows"のキーワードでインストール方法などが出てくるのでインストールしておきましょう

試してないけどここが有益そう → http://bleyer.org/icarus/

## Linux なら簡単に simu.py を使える
polyphony のソースをダウンロード(git で clone して)、そこにある simu.py を使えば簡単にシミュレーションできます。simu.py は iverlog を呼ぶようにできているので iverlog はあらかじめインストールしておきましょう。

### simu.py を実行してみる

```
shell$ ~1/simu.py blink.py
Compiling: [=========================] 100% ... printresouces
(38, 98, 3)
loop: 0
loop: 1
loop: 2
loop: 3
finished
350300:finish
```

Python で実行した時と同じ(ような)結果が出ます。

### エラーです

polyphony がインストールされていないか PYTHONPATH が polyphony の clone に設定されていないと次のエラーがでます。

```
> ./simu.py blink.py
[COMPILE PYTHON] FAILED:blink.py
Traceback (most recent call last):
  File "./simu.py", line 60, in exec_compile
    compile_main(casefile_path, options)
  File "/cygdrive/i/Works/Polyphony-Works/venv/devel-test/polyphony/polyphony/compiler/__main__.py", line 789, in compile_main
    setup(src_file, options)
  File "/cygdrive/i/Works/Polyphony-Works/venv/devel-test/polyphony/polyphony/compiler/__main__.py", line 725, in setup
    if options.config:
AttributeError: 'types.SimpleNamespace' object has no attribute 'config'
'types.SimpleNamespace' object has no attribute 'config'
```

git clone して PYTHONPATH を設定すれば問題解決(するはず)。

```
$ git clone https://github.com/ktok07b6/polyphony
$ PYTOHNPATH=`pwd`/polyphony
$ polyphony/simu.py blink.py
```

## Windows なら、、、
Polyphony がインストールされているはずなのでそのまま simu.py ”だけ"を git ハブからダウンロードします。(github から raw でダウンロード)

https://github.com/ktok07b6/polyphony/raw/master/simu.py

iverilog をインストールしていなかったのでエラー(FAILED)が出ましたが、cmd から実行できそうです(下の実行結果を参照)。

```text:Windowsでsimu.py実行
>.\simu.py -h
usage: simu [-h] [-vd] [-vm] source

positional arguments:
  source                Python source file

optional arguments:
  -h, --help            show this help message and exit
  -vd, --verilog_dump   output vcd file in testbench
  -vm, --verilog_monitor
                        enable $monitor in testbench
>.\simu.py blink.py
Compiling: [=========================] 100% ... printresouces
(37, 98, 3)
[COMPILE HDL] FAILED:blink.py
```
Rubyでプログラム実行後のディレクトリを変更する方法．

# 前書き
日本語のサイトでは方法を見つけることができなかったので，今回は海外のサイトを参考にしました．詳しい動作部分については理解しきれていないので**詳しい方がいればコメントしていただきたいです**．

＊本記事はMacユーザが書いています．

# やりたい事
Rubyで書いたプログラムを実行した後に実行前と実行後でディレクトリを移動している状態にしたいです．以下の例ではchdir_test.rbが目的のファイルです．

```terminal
$ ~; pwd
~
$ ~; ruby chdir_test.rb
$ ~/test; pwd
~/test
```

# 試した事
1. プログラム内でシェルスクリプトを実行してみれば良いんじゃないの？
2. プログラム内でosascriptを実行したら良いんじゃないの？

どちらも上手くいかない...:frowning2::neutral_face::expressionless::unamused:
以下はその詳細です．

< 1 >
シェルスクリプトでなら期待される振る舞いをしてくれますが，それをRubyのプログラム内で行うと期待外れの結果に終わった．

```sample.sh
#!/bin/sh
cd ~/test
```

```chdir_test.rb
system(". chdir_workshop.sh") #もしくは.ではなくsourceでも同じ
```

これだと実行前のディレクトリと実行後のディレクトリは同じでした．

< 2 >
osascriptとはAppleScriptを実行するためのコマンドです．例えば音を再生したりターミナルを新規で立ち上げるときに使っています．

しかしこれについて，僕は全く詳しくありません．なんとか辿り着いた方法としてターミナルを新規に立ち上げてディレクトリを移動することはできました．

```chdir_test.rb
system("osascript -e 'tell application \"Terminal\" to do script \"cd test \" '")
```
![スクリーンショット 2018-12-02 18.30.42.png](https://qiita-image-store.s3.amazonaws.com/0/241421/256a3bc9-94d0-46a1-b0b1-96ae55613f4c.png)

するとこんな感じで新規にターミナルが立ち上がり，指定のディレクトリに行ってくれます．
しかし今回の目的はターミナルの新規立ち上げはして欲しくありません．

# 上手く行った方法
結果からかくと以下のコードで期待される振る舞いの実現ができました．

```chdir_test.rb
Dir.chdir 'test'
exec 'fish' #僕はシェルでfishを使っているので，bashの人はbashに変えてください．
```

要はプログラム内で起こった変化のまま新規シェルの立ち上げることで，新しいシェルではディレクトリの移動が完了していることになってるのかな？（この辺を詳しく理解できていません:sob:）

# 最後に
冒頭にも記載させていただいていますが，この記事の作者である僕自身の理解が浅いため良い記事ではありません．ご協力いただける方は，ご指摘お願いいたします．
2018年、読んでよかった本

# 今年、読んで良かった本
本からの学びのまとめ

## エンジニアリング組織論への招待
* 不確実なことを減らすことがエンジニアリング
* 不確実性を減らすには？
  - コントロールできるかできないか、と、観測可能か否かで分けて考える
* システム全体と関係性を捉える
* 個人のメンタリングをし、思考を整理する
* アジャイルでチームをメンタリングし、学習するチームへ
* 目標管理と透明性

## How Google Works
* Googleの考え方
* 徹底的にデータに基づいて意思決定する
* 市場調査よりも技術的アイデアを重視
* 情報はデフォルトでオープンに
* 採用は一番大切な仕事、決して妥協してはいけない
* ユーザーに焦点を絞れ
* 目標は高く、失敗から学ぶ

## Work Rules!
* How Google Worksをよりマネジメント寄りに詳しく
* 採用が最も大切
* 社員を信じる、信じられない人を決して雇ってはいけない
* 直感を信じて採用しない、必ずバイアスがかかっている
* 個人の成長のための業績管理
* 組織として学習する、一番優秀な人は社内にいる
* nudge
* 控えめな目標で成功するより、壮大な挑戦で失敗したほうが多くのことを達成できる
* 常識外れの野心的目標で失敗したとしても、きっと何か素晴らしいことをやりとげたことになる

## ELASTIC LEADERSHIP
* リーダーの役割と覚悟
* チームのフェーズ（サバイバル、学習、自己組織化）
* リーダーシップスタイル（指揮統制、コーチ、ファシリテーター）
* リーダーはチームを継続的に成長させること、よりよくなるために挑戦すること
* チームを集中させるためにできること
* 目標を明確に、フィードバックを迅速にすること
* 安全地帯でとどまらせてはいけない

## 「学習する組織」入門
* 組織を継続的に成長させるための技術
* 目標に向けて効果的に行動するために、集団としての意識と能力を、継続的に高め、伸ばし続ける
* 学習モデル、メンタルモデル、あり方
* 目的、存在理由、ビジョン
* 場と関係性の質
* 話し方と聞き方のレベル
* 組織の使命
* 実践方法
micro:bitの無線(BLE)機能で簡単相互通信

#内容
micro:bit無線(BLE)機能を利用して簡単に相互通信が実現できます。

#必要なもの
micro:bit
転送＆電源供給用ケーブル

#利用方法

-MakeCodeサイトにアクセスする
https://makecode.microbit.org/#editor
![make.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/9f7b160d-2ba4-a729-86d0-1aacd948b1b0.jpeg)

-無線関連のブロックを配置する
![ble.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/f36d5a1b-0a98-5e53-44a2-9b84267946e5.jpeg)

-変数関連のブロックを配置する(無線関連のブロックを配置すると変数が自動的に増えます)
![hensu.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/31af4d46-da71-8510-27c3-375a020aef8d.jpeg)

-制御ブロックのmore中から"固有ID"のブロックを配置する
![koyuu.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/802f4191-246f-967f-5ebf-4862ca25afc0.jpeg)


#サンプルコード
各micro:bitには固有の名前(5文字)がアサインされています
Aボタンを押すと近くのmicro:bitすべてに自分の固有の名前を送信して相手側に表示されます。
自分のIDはBボタンを押すと表示されます
![musencode.JPG](https://qiita-image-store.s3.amazonaws.com/0/71746/e27f0259-b22c-cc00-8b7a-af913188c368.jpeg)
Python で FPGA/テストベンチ ってなんでしょう？

#テストベンチって何でしょう？
Polyphony ではテストプログラムを FPGA の世界の伝統に従ってテストベンチと表現してます。Lチカの例で実際のプログラムとテストベンチを図示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/66ef0b14-54da-5ef4-bed1-72fad457e901.png)

## テストプログラムを眺める

```python:テストベンチ
@testbench
def test(dut):
    for i in range(4):
        wait_value(1, dut.led)
        wait_value(0, dut.led)

device_under_test = Blink(10000)
test(device_under_test)
```

## `@testbench` と test 関数
`@testbench` というデコレータで修飾された関数がテスト用の関数です。ここでは test という名称にしていますが、別の名前でも構いません。

test 関数内では引数 dut に対象となるテストのオブジェクトが入ってきます。dut は実は Lチカ プログラムです。Lチカだけに dut の led のポートは 1 (点灯) 0 (消灯) を繰り返します。Polyphony が用意する wait_value 関数でその変化を待つようになってします。それを 4 回繰り返すと終了です。

## オブジェクトの生成とテストベンチの実行
Blink クラス(Lチカでした)のオブジェクトを生成し、グローバル変数 device_under_test に入れ、テスト関数を呼びます。

```python:オブジェクトの生成
device_under_test = Blink(10000)
test(device_under_test)
```

## Python で実行する
Python (バージョン 3です)で実行してみましょう。うまくいけば何事もなかったように終了します。

```text:pythonで実行
shell$ python blink.py
```
あるいはWindows なら

```text:Windowsのcmdで実行
> py -3.6 blink.py
```

なお、上の -3.6 という引数はWindowsで複数の Python がインストールされている場合に指定する Python のバージョンです。もし１つしかインストールしていないのなら必要ありません。

### エラーです
Polyphony がインストールされていない場合は次のエラーが出ます。私の環境では　Python の 3.5 にはインストールしていなかったのでエラーになりました。

```text:エラーです
>py -3.5 blink.py
  File "blink.py", line 14
    led_bit:bit = 1
           ^
SyntaxError: invalid syntax
```

### print の追加
うまくいってもなんの表示もしないので print を追加してみます。

```python:test
@testbench
def test(dut):
    v = 0
    for i in range(4):
        print("loop:", i)
        wait_value(1, dut.led)
        wait_value(0, dut.led)
    print("finished")
```

実行すると

```text:実行と表示
> python blink.py
loop: 0
loop: 1
loop: 2
loop: 3
finished
```

地味な感じですが表示されました。
Batfishを使ったインターフェース設定情報の抽出と妥当性確認

# はじめに
Advent Calendar 3日目に続き、Batfishを使ったネットワーク機器の設定の妥当性確認を行います。

参考：[Advent Calendar 3日目 - Batfishを使ったネットワーク設定情報の抽出と妥当性確認](https://qiita.com/tech_kitara/private/5bca73ee40124d6eabab)

今回は、`interfaceProperties`クラスでインターフェース設定を抽出し、コンプライアンスポリシー「使用中のインターフェースでDescriptionが設定されていること」が守られているかチェックしてみたいと思います。


# チェック対象のConfigファイル

ノード`hqborder2`(Cisco1812J)のRunning Configファイルを対象にチェックを行います。
ご参考までに、インターフェース関連の設定を抜き出したものをアップしておきます。

```text:show_running-config(snip)
interface Tunnel1
 description << To brborder2 >>
 bandwidth 100
 ip address 10.1.1.9 255.255.255.252
 delay 10
 tunnel source Loopback0
 tunnel destination 1.1.1.2
!
interface Loopback0
 ip address 1.1.1.1 255.255.255.255
!
interface FastEthernet0
 description << To PE Router >>
 ip address 10.1.1.5 255.255.255.252
 duplex auto
 speed auto
!
interface FastEthernet1
 description << border2 - dist1 Segment >>
 ip address 192.168.200.9 255.255.255.252
 speed 100
 full-duplex
!
interface BRI0
 no ip address
 encapsulation hdlc
 shutdown
!
interface FastEthernet2
 description << To hqdist2 Fa0/2 >>
 switchport access vlan 203
 duplex full
 speed 100
!
interface FastEthernet3
 shutdown
!
interface FastEthernet4
 shutdown
!
interface FastEthernet5
 shutdown
!
interface FastEthernet6
 shutdown
!
interface FastEthernet7
 shutdown
!
interface FastEthernet8
 shutdown
!
interface FastEthernet9
 shutdown
!
interface Vlan1
 no ip address
 shutdown
!
interface Vlan203
 description << border2 - dist2 Segment >>
 ip address 192.168.200.13 255.255.255.252
```


# コンプライアンスチェック(1/2) - インターフェース設定情報の抽出
まず、前回同様Pybatfishのインポート、チェック対象Configの格納先指定と読み込みを行います。


![3-1.png](https://qiita-image-store.s3.amazonaws.com/0/310082/d1fa899e-edfd-89c6-0764-e678c963b7a3.png)


ここで、`interfaceProperties`クラスを使い、試しにノード`hqborder2`(Cisco1812J)のインターフェース`Tunnel1`の設定情報を抽出してみます。
出力内容を見ると、例えば`Active`プロパティで開放(True)/閉塞(False)、`Description`プロパティでDescriptionの内容、`Primary_Address`プロパティでIPアドレス設定が表示されています。VLAN、EtherChannel、HSRP、VRRP、OSPF、ACL関連もあります。また、設定されていないプロパティはNoneやFalseといった形で表示されています。
ちなみに、他のインターフェースでも表示されるプロパティ一覧は同じです。


![2-2.png](https://qiita-image-store.s3.amazonaws.com/0/310082/b4133add-7886-8f68-62bb-813351a0ecfa.png)


# コンプライアンスチェック(2/2) - インターフェースDescription設定の妥当性確認

ノード`hqborder2`のインターフェースを一つづつ取り出し、以下2段階の条件分岐で、コンプライアンス判定を行います。

　① `Active`プロパティが`True`(開放状態)か
　② `Description`プロパティが`None`ではないか

問題があるのは、①が`True`で②が`False`のパターンなので、この時"NG"が出力されるようにします。それ以外はもともと閉塞状態か、設定が入っている状態ですので"OK"と表示されるようにします。


![2-3.png](https://qiita-image-store.s3.amazonaws.com/0/310082/5f3496a9-ca08-dadd-34a4-cc7d40053d01.png)


出力結果を見ると、1番目のインターフェース`Loopback0`がNG判定となっています。
上記のRunning Configを見ると、確かにDescriptionが抜けています。そのため以下の通りConfig修正を行います。

```text:修正Config
interface Loopback0
 description << Loopback >>
```

Configファイルを変更した場合、再度読み込みを行う必要があります。
チェックを実行すると、今度はすべてOKとなりました。めでたしめでたし:grin:

![2-4.png](https://qiita-image-store.s3.amazonaws.com/0/310082/d6fcc31a-4348-c7a6-fc93-af9df4d6f0e6.png)

今回作成したコードはGistにも置いています。
https://gist.github.com/Tachashi/b4018363b8b66173119a215b84af38b6
ザコ・コーダーと秘密の追い出し部屋〜闇の世界を七色に彩るたった一つの言語〜

2日目は発起人[**oumugaiさんの記事**](https://qiita.com/oumugai/items/0eda38a041c6a9788b20)！

# コーディングは基本闇の世界

取締役「やめ太郎くん」
ワイ「はい」
取締役「コーディングってのは**闇の世界**だと思わんかね」
ワイ「はぁ」
取締役「はぁ、じゃないんだよ」
取締役「一日中テキストエディタやIDEの**暗い画面**と向き合って」
取締役「我々は闇の世界の住人なんだよ」
ワイ「なるほど、分かります（あんたが**ダーク系のテーマ**使うてるからや・・・）」
取締役「おぉ、わかるかね！？」
ワイ「痛いほど分かりまっせ（残業だらけの**弊社が一番の闇の世界**やで）」
取締役「ほな、HTMLのタグに色つけてくれ」
ワイ「ファッ！？」
取締役「この闇の世界を**七色に彩ってくれ**」
ワイ「（あかん、この人残業し過ぎや。**壊れてもうたわ**）」
取締役「今週中に頼むで」
ワイ「テキストエディタの拡張機能いうことですか？それは無ｒ」
取締役「飯食うてくるわ！！！」

# 作るも闇、作らぬも闇

ワイ「はぁ・・・」
ワイ「エディタの拡張機能なんて、どうやって作んねん・・・」
ワイ「会社やめよかな・・・」
ワイ「ワイ、やめ太郎やし・・・」
ワイ「っていうかワイが**ザコーダー**やから、**追い出すために**やらせとんな・・・？」
ワイ「こうやってみんな追い出されていくんか・・・！」
ワイ「コーディングが闇の世界とかやなくて」
ワイ「あいつのやり方が**闇の魔術**やで・・・！」
ワイ「負けへんで・・・！」
ワイ「給料もらい続けたる・・・！」

# とりあえずググってみる
ワイ「拡張機能、作り方、と・・・」
ワイ「ほお、最近のエディタは、それ自体がHTML、CSS、JavaScriptで出来てんのかいな」
ワイ「拡張機能もJavaScriptで作れるらしいで」
ワイ「ワイの書ける**たった一つ言語**、JavaScriptやないか！」
ワイ「これは運命や！拡張機能作ってみるで！」

# というわけで作ってみました

<img width="1280" alt="scr.png" src="https://qiita-image-store.s3.amazonaws.com/0/295452/8e398e1e-0076-ccde-71b9-9e70b2316657.png">

ワイ「会社やめ太郎の作った、その名も・・・」
ワイ「**タグに色つけ太郎**や！」
ワイ「Brackets、Atom、VSCode版があるで！」
ワイ「Bracketsでは**邦題**もつけれたから**タグに色つけ太郎**にしたけど」
ワイ「VSCode、Atom版は**Color The Tag Name**いう名前や」

# さっそく見せてみる
ワイ「タグに色、つけましたで！」
ワイ「どうでっか！？」
取締役「おお！」
ワイ「**a**タグは**若草色**に、**p**タグは**山吹色**に、**section**タグは**さくら色**に！」
取締役「う〜ん・・・」
ワイ「この闇の世界がこんなにも」
取締役「**カラフル過ぎて頭おかしなるわ**」
取締役「次は色を自分でカスタマイズできるようにしてくれへんｋ」
ワイ「辞めさせてもらうわ！」

バタン！

取締役「（**漫才の終わりみたいに会社やめて行ったで**・・・）」

# まとめ
JavaScriptって色んなとこで使えて便利ですね。
よかったら**タグに色つけ太郎（Color The Tag Name）**使うてみてください。
HoloLensのキャプチャ周り

HoloLensアドベントカレンダー2018 1日目の記事です。
HoloLensのキャプチャ周り」について書いていきます。

# カメラを使ったアプリのキャプチャについて
[HoloLensのRS4では、ARマーカーなどカメラを使ったアプリの場合、キャプチャができませんでした。](https://www.facebook.com/groups/149608962203470/permalink/480996385731391/)
> Cognitiveなど、結局カメラを使ったアプリのレコーディング/ストリーミングは出来ない？（Spectator View 系を除く）
【追記】
 宮浦さんのコメントにあったようにアプリで試してみたらできるケースが有りました。接続前にアプリを起動してカメラを使うところまでやっておくのがポイントですね。アプリがカメラ機能をローディングしたあとであればうまくいくようです。
なので頻繁にカメラ機能をON/OFFする場合は、OFFされたあとでONになるたびに、ストリーミングやレコーディングが切断もしくは終了されてしまうようです。

マーカーを使う場合に撮影が必要になったときには、下記のようにしていました。([HoloLensArucoTracking](https://github.com/KeyMaster-/HoloLensArucoTracking/)を用いた場合)
1. WebCamTextureをスタート
2. マーカー検出など
3. WebCamTextureをストップ
4. デバイスポータルから撮影スタート
5. デバイスポータルから撮影ストップ

WebCamTextureをスタート中にデバイスポータルから撮影しようとすると失敗し、そのあとWebCamTextureをストップしてから再度撮影しようとするとできず、一度HoloLensの再起動が必要になったりと厄介です。

RS5では、アプリ中にブルームするとメニューが出てきて撮影できます。RS4と違ってWebCamTextureをスタート中でも録画開始でき、WebCamTextureをストップしても録画は継続します。再度WebCamTextureをスタートにしたときに録画が強制終了されます。

# アプリ内での撮影
RS5では撮影できるのですが、当時RS4だったときにデバイスポータルを使わずにアプリ内でキャプチャしたかったので作りました。ソースは[こちら](https://github.com/SatoshiRobatoFujimoto/MRPhotoCapture)から。
![MRPhotoCapture01.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/1f34a210-2dda-0a31-9740-bb9414b81ae9.png)

アプリの流れは以下のようになります。
1. Camera/Videoボタンを押すとキャプチャモードになる
![MRPhotoCapture02.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/b80d76ca-4b23-ee62-a74c-03950f65935b.png)
2. タップすると撮影
3. Videoモードの場合、Videoボタンを押すと録画終了
4. 撮影したものを表示
![MRPhotoCapture03.PNG](https://qiita-image-store.s3.amazonaws.com/0/63863/44ffb025-718e-6b2d-8d90-bd354d8fad60.png)

HoloLensでの実行動画はあとで載せます。

# 開発環境
- Visual Studio Community 2017 (15.9.2)
- Unity 2017.4.11f1
- HoloToolkit 2017.4.2.0

## 参考文献
[HoloLens＋Arucoを触ってみた](http://littlewing.hatenablog.com/entry/2017/12/18/215247)
[MRキャプチャでオブジェクトが映らない人へ](https://qiita.com/AtsushiYamashita/items/8b00b396e5193c810a1e)

次回は[t-sho](https://qiita.com/t-sho)さんによる「C#もUnityも未経験だけどガチラボでアプリを作れるようになった話」です。
お楽しみに！
ubuntu16.04で動作しているapacheサーバーをhttp2に変更して爆速化

昔firefoxのTIPSみたいなサイトを開くとfirefox高速化としてabout:configでpipelineをサーバー負荷を顧みずにいっぱいたてろ的な記事が決まってあった。
今はそれがそのような裏技を使わなくても標準である。それがhttp2らしい。
入れるとhttp のheaderのhttp1.1というレスポンスがhttp2に変わって早くなる。
中身はpipelineをいっぱいにすることで実現してるらしいです。

で、この記事では、実作業として、ubuntu16.04で動作しているHTTP(apache)サーバーがあるのですが、それをhttp1.1から2に変えた。そのログを書きます。

まずhttp2が動作してるかどうかの確認方法ですが
firefoxだと
https://addons.mozilla.org/ja/firefox/addon/http2-indicator/
でできます。
動作してるHPだとURLのお尻に青い稲妻が出ます。
一応真面目な確認方法も書きます。
開発ツールー＞インスペクターー＞ネットワークで出るリストを右クリックでカラムにプロトコルを追加
ただhttp2の確認はhttps://でないとFirefox,chromeで確認できない。
http://wiki.bit-hive.com/tomizoo/pg/Apache%E3%81%A7%E3%81%AEHTTP%2F2%E8%A8%AD%E5%AE%9A
http://で確認したいというマニアックな場合(たとえば19.168.??.??で試しにやったとか）
curlでできる。
curl -v --http2 http://www.google.com
とかする。
出力を載せておく
$ curl -v --http2 http://192.168.1.7
* Rebuilt URL to: http://192.168.1.7/
*   Trying 192.168.1.7...
* TCP_NODELAY set
* Connected to 192.168.1.7 (192.168.1.7) port 80 (#0)
> GET / HTTP/1.1
> Host: 192.168.1.7
> User-Agent: curl/7.58.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
> 
< HTTP/1.1 101 Switching Protocols
< Upgrade: h2c
< Connection: Upgrade
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200 
< date: Sun, 00 Jan 1900 00:00:00 GMT
< server: Apache/2.4.37 (Ubuntu)
< expires: Thu, 19 Nov 1981 08:52:00 GMT
< cache-control: no-store, no-cache, must-revalidate
< pragma: no-cache
< set-cookie: PHPSESSID=egcn0u7lg1bomhc80vuf36gv44; expires=Mon, 03-Dec-2018 08:44:35 GMT; Max-Age=86400; path=/
< set-cookie: pageredir=http%3A%2F%2F192.168.1.7%2F; expires=Sun, 02-Dec-2018 10:44:35 GMT; Max-Age=7200; path=/
< vary: Accept-Encoding
< content-type: text/html; charset=UTF-8

ただ16.04のaptのcurlでこれをすると、
curl: (1) Unsupported protocol
になる。
これを回避するにはCURLのアップデートを行う。
https://askubuntu.com/questions/884899/how-do-i-install-curl-with-http2-support
なおcurlがhttpsをサポートするかは
curl -V
の出力でも確認可能（出力にhttpsがでる）
$ curl -V
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.0.2g zlib/1.2.8 nghttp2/1.7.1 librtmp/2.3
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy
こんな感じ。

最後になったが
セットアップの仕方はこの通り
https://techwombat.com/enable-http2-apache-ubuntu-16-04/

ただVirtualHost の書き方だけ曖昧なので再記述
ファイルは
/etc/apache2/sites-enabled/????-le-ssl.conf 
でOKだと思うが私は念のためすべてに記述した。

```apache
<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName ほげ
        DocumentRoot ほげほげ
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile ほげ
SSLCertificateKeyFile ほげ
Protocols h2 h2c http/1.1
</VirtualHost>
</IfModule>
```
こんな感じ
このh2がhttp2らしい。
GitHubからaws Cloud9にcloneする

「Clone or download」をクリックするとURLが表示されるので、そのURLをコピー。

https://github.com/Ryuichi-watanuki


aws Cloud9　新しいプロジェクト作成
ディレクトリはenvironmentでおｋ　　
$　git clone "URL"

$　cd cd Attendance-system-intern-B（新しくできたディレクトリ）

$ bundle install --without production
$ rails db:migrate
$ rails db:seed
$ rails server