OmniAICreator/Qiita-1.07M huggingface dataset:
Macのシェル環境を整えてみた(zsh拡張編)

# はじめに...
この記事は[Macのシェル環境を整えてみた(導入編)](https://qiita.com/MonkeyWlench/private/4ce8b275114152953a23)の続きとなります。
この記事では以下の新シェル環境の構築を引き続き行います。
__▼ 新シェル環境__

```
OS: MacOS Mojava
ターミナルアプリ: iterm2
シェル: zsh
zsh用プラグインマネージャー: zplug
```

# zsh用プラグインマネージャー(zplug)のインストール
zshで利用するプラグインを効率よく管理するため`zplug`をインストールします。
zsh用のプラグインマネージャーは`oh-my-zsh, prezto`などありますが、今回はzplugを採用しました。
zplugの起動は他のプラグインマネージャーと比べて起動が遅いとの[記事](https://qiita.com/qwerty/items/92412925ac2cb9eabf4c)がありますが、
基本的に開発中はめったにターミナルアプリごと終了させることがにないので気にしないことにしました。
(差があるっていっても0.0うん秒程度だしね。)

また、zplugからoh-my-zsh、prezto本体をインストールすることもできますし、一部だけをインストールさせることも可能です。
ただし、oh-my-zsh、preztoをそのままインストールすると起動が重くなるので、あくまで必要だと思うものだけをインストールしましょう。
### インストール方法
まず、zsh同様`HomeBrew`経由でzplugをインストールします。
`brew install zplug`でOKです。
インストールした`zplug`は`/usr/local/opt/zplug`にインストールされます。
上記パスの情報をもとにユーザーディレクトリ(/Users/"ユーザー名")直下の`.zshrc`の一番上の行に追記する。
※ `/Users/"ユーザー名"/.zshrc` のファイルがなければ`touch .zshrc`で作成してください。

```zsh
# zplug setting
export ZPLUG_HOME=/usr/local/opt/zplug
source $ZPLUG_HOME/init.zsh
```
ターミナルアプリの再起動をすることで`zplug`コマンドの実行ができると思います。
`zplug --version`などを実行してみてください。

あとは`.zshrc`に以下の形でインストールしたいプラグインを記載していきます。
`zplug "プラグイン名"`
例として `zplug "zsh-users/zsh-autosuggestions"`を記載してみてください。
上記プラグインは入力補完機能を追加してくれるプラグインです。
あとは`zplug install` → `zplug load`を実行することでまだ未インストールであるプラグインを対象にインストールを実行してくれます。
都度 install → load を実行するのはめんどくさいと思うので`/Users/"ユーザー名"/.zshrc`の末端行に以下の内容を記載してください。

```zsh
if ! zplug check --verbose; then
  printf "Install? [y/N]: "
  if read -q; then
    echo; zplug install
  fi
fi
# zplugのプラグイン読み込み
zplug load
```

未インストールのプラグインがある場合は問いかけをしてくれるので__y__を入力してインストールを実行してください。
![question_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61040/0a84e279-a707-9028-7419-581c2d6b3c8e.png)

あとは、各々インストールしたいプラグインを随時.zshrcに記載してもらうことで好きなプラグインをインストールすることができます。

# 最後に...
参考までに今回自分がインストールしたプラグイン一覧を貼ります。

```zsh
zplug "zsh-users/zsh-syntax-highlighting", defer:2
zplug "zsh-users/zsh-autosuggestions"
zplug "zsh-users/zsh-completions"
zplug "zsh-users/zsh-history-substring-search"
# oh-my-zsh または fish-shellコマンドのaliasの自動登録
zplug "djui/alias-tips"
# コマンドライン上に絵文字を表示する
zplug "mrowa44/emojify", as:command

# 以下はpreztoのtheme、プラグインを使いたい場合のみ記載する
zplug "sorin-ionescu/prezto", \
  use:"init.zsh", \
  hook-build:"ln -s $ZPLUG_HOME/repos/sorin-ionescu/prezto ~/.zprezto"
zstyle ':prezto:*:*' color 'yes'
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'utility' \
  'completion' \
  'git' \
  'python' \
  'fasd' \
  'tmux' \
  'prompt'
zstyle ':prezto:module:prompt' theme 'sorin'
```

良いシェル環境を!!👍
（´-`）.｡oO(次は良さげなターミナルアプリでも探そうかしら...)

# 参考資料
> [zshフレームワークの起動速度＆設定の楽さ比較！](https://qiita.com/qwerty/items/92412925ac2cb9eabf4c)
【超初心者向け】サーバーを郵便窓口に例えてみた

サーバーに関しての知識が皆無だったので、Qiitaでのアウトプットの練習も兼ねてまとめてみた。

サーバーを郵便局の窓口に例えて説明してみることにする。

##サーバーの仕組み

郵便物（データ）を送ってくださいと郵便窓口（サーバー）に伝えて（リクエスト）お金を払うと結果的に送り先に送ってくれる。

これがシンプルなサーバーの仕組み。


##GETとPOST

郵便物（データ）の送り方の違い。

####GET（郵便物を梱包せずに丸出しのまま送る）

・梱包していないので送るときに周りの客に何送るかわかってしまう
・梱包せずに送るのでまとめて大量に送ることはできない

####POST（郵便物を梱包して送る）

・何を送るか周囲にバレないで済む
・梱包するので一度に大量の物をまとめて送ることができる


##API

電報のような仕組み。

必要な情報を用意すると送り先に文章を配達してくれる。（情報を元に理想とする形に変換して送信してくれる）
railsで画像アップロードの方法

##使用準備##
###gemインストール###
/Gemfile

```
gem 'carrierwave'
gem 'rmagick'
```

- `carrierwave`はアップロードするために必要
- `rmagick`は画像をリサイズする 

```
$ bundle install
```

**エラーが出る場合インストールする**

```
yum -y install libjpeg-devel libpng-devel
yum -y install ImageMagick ImageMagick-devel
```


###アップローダ作成###
```
$ rails g uploader image
```

###カラム追加###
```
$ rails g migration AddImageToUsers image:string
$ rails db:migrate
```
- アップロードしたファイル格納用


###Model修正###
app/models/users.rb

```rb
  mount_uploader :image, ImageUploader
```

###Controller修正###
app/controllers/users_controller.rb

```rb
params.require(:user).permit(:image)
```
- ストロングパラメータに追加

###Uploader設定変更###
app/uploader/image_uploader.rb

```rb
#リサイズ、画像形式を変更に必要
  include CarrierWave::RMagick

#上限変更
  process :resize_to_limit => [700, 700]

#JPGで保存
  process :convert => 'jpg'

#サムネイルを生成
  version :thumb do
    process :resize_to_limit => [300, 300]
  end

# jpg,jpeg,gif,pngのみ
  def extension_white_list
    %w(jpg jpeg gif png)
  end

#ファイル名を変更し拡張子を同じにする
  def filename
    super.chomp(File.extname(super)) + '.jpg' 
  end

#日付で保存
  def filename
    if original_filename.present?
      time = Time.now
      name = time.strftime('%Y%m%d%H%M%S') + '.jpg'
      name.downcase
    end
```

##View変更##
###入力フォーム###

```erb
<%= f.label :image 'iamge' %>
<%= f.file_field :image %>
```
###表示方法###
```erb
<% if @user.image? %>
  <%= image_tag @user.image.url %>
<% else %>
  <%= image_tag "noimage.gif %>
<% end %>
```
- サムネイルを表示する時は、`.image.thumb.url`とする
- `.image`はカラム名
C++でのゲーム開発に携わって感じたこと

# 前職でのゲーム開発について

## 開発の中で感じたこと

私は前職で**家庭用ゲームソフトおよびアーケードゲームの開発に携わっていた**が、**開発言語は`C/C++`を使用していた。**

未初期化変数によるバグなんかはいろいろな場所で起きていて、開発中どこにでも発生する。
そして、開発の中期から末期にかけてメモリ破壊に悩まされることが残念ながらプロジェクトの常であった。

これらは`STL`や`C++11以降の記述方法`を知ってさえいれば、**バグの発生する割合自体は減らせる。**
実際、`Effective C++`や`Modern Effective C++`、その他コーディング本などいろいろ読み漁ったところ、プロジェクトで書いた自分のコードは有償の静的解析ツールでもほとんどひっかかることはなかった。

しかし、自分がいくらC++関連の学習をしたといってもプログラムはチーム全体で書き上げるものであり、属するプログラマー全員がそれなりにC++に精通していなければ結局は未初期化やバッファオーバーランによるバグに付き合わされる。
***ゲームプログラマーはやはりゲームを作ることに主軸を置きたいのが一般的で、正直なところC++の規格を理解したいわけではない。***

**そういった意味で、C++自体がそもそもエンジニアリング(チームでのゲーム開発)に向いていない言語ではないかと感じるようになってしまっていた。**

## 苦労した点

前述の通り、メモリ破壊の調査にしばしば付き合わされていた。
メモリ破壊に関するバグは、そもそも最初からメモリ破壊が原因とすぐに判明するものではない。
はっきりいってだいたいそもそも未定義動作なのである…。  

なので、「貴方の担当箇所にバグが起こったため調査してくれ」と報告が来てから調査することになるのだが、私の書いたコードではなく、***他人が書いたコードによってメモリが破壊されていた場合、心当たりがないところからその人が書いたコードまで探り当てないとならない。***

これはもちろんかなりの時間を要する。また、ネットワークの同期が絡むとさらに大変なことになる。  

### 解決方法

バグフィックスには基本的に**メモリが破壊されている箇所を発見** -> **メモリを破壊している箇所を発見**というプロセスが必要になる。

#### メモリが破壊されている箇所を発見するまでの手順

まずはバグが再現するまで実際にアプリを動かしてみる、もしくは**ダンプファイル**を確認することになる。  
このとき、通信の周りで起きているとわかった場合にはその前後に多く**ログ**を仕込んでおく。  
基本的にはそれによりクラッシュ箇所がわかるのでクラッシュするよりも前のステップにてメモリ検査を**二分探索**していく。  

#### メモリを破壊している箇所を発見するまでの手順

メモリが破壊されている箇所を発見次第、**ハードウェアブレークポイント**を置いたり、デバッガを用いて近くでバッファオーバーランを行っている場所はないか確認していく。

最適化されている場合はデバッガなどはほぼ使えないので**アセンブリ**コードを読み、検討をつけていくことがしばしばあった。

通信を行う場合もタイムアウトの問題などがあり、デバッガやブレークポイントが使えないことがあるが、この場合は**ログ**を確認していくことになる。

確認にはやはり**二分探索**を基本的に用いることになるが、運が良ければメモリを破壊している箇所はメモリが破壊されている箇所の近くに配置されている。

また、メモリを破壊している箇所は**静的解析ツール**を用いて検討をつけることも可能なので積極的に使用していた。  

## 反省点

**仕事上で発生した問題を解決したことを長々と述べさせてもらったが、そんなことより失敗を予防するアプローチを取れたほうがいい。**

今回は、メモリ破壊についての解決方法を記述したが、予防法としてはおそらく、

>これらはSTLやC++11以降の記述方法を知ってさえいれば、バグの発生する割合自体は減らせる。
>実際、Effective C++やModern Effective C++、その他コーディング本などいろいろ読み漁ったところ、プロジェクトで書いた自分のコードは有償の静的解析ツールでもほとんどひっかかることはなかった。

上のように私が行ったことを**プロジェクト全体で**実践し、静的解析ツールを継続的インテグレーションで動かすのがよいだろう。

# さいごに

転職活動のために前職で行っていた開発について振り返ってみたが、Qiitaにも投稿しておけたらなと感じ、投稿することにした。

ゲームプログラマーの中でもC++の言語仕様に詳しくなる苦労をしてでもバグを少なくしたい人と、
そんなのどうでもよく、いいゲームができればそれでいいと感じる人(おそらく大半を占める)の意識の乖離は残念ながらこれからも埋まることはないだろう。

ゲームエンジンはこの問題を**根本的な意味**で解決するものではないだろうが、この乖離をある程度覆い隠せるものとして流行って当然だと考えられる。

似たような問題はおそらくゲーム業界以外でもあるだろうが、ゲーム業界においてはもしかしたらゲームエンジンがこれを解決するものになりうるかもしれません。

すごいハイエンドなゲームを作りたいんだ！というならばまた同じ道を辿らざるえないかもしれませんが…。
さくらサーバーにHomebrewを導入する


| |シリーズ：さくらサーバーで遊ぶ|
|:--|:--|
|設定等のメモ|http://qiita.com/cielavenir/items/67a7c631713b4c816b6d|
|SSL化|http://qiita.com/cielavenir/items/aad29b2348fc4d3f9155|
|(さくらサーバー導入の主目的)<br>メールをフックする|http://qiita.com/cielavenir/items/5ce4568fc405329d421a|
|Linuxbrewを導入する(旧)|http://qiita.com/cielavenir/items/741921fcecb281555f77|
|Homebrewを導入する|https://qiita.com/cielavenir/items/67ce0ec9cd8d43ed00f1|
|さくらサーバーでgccへの依存が発生しない理由<br>(HOMEBREW_BUILD_FROM_SOURCE=1は不要)|https://qiita.com/cielavenir/items/410ded536d9b520989c4|

方法の概略は以前説明していますが、自動化が不完全なのと、ベースが古くなったのと。

- add these in .profile

```sh
export LD_LIBRARY_PATH=$HOME/.linuxbrew/lib
export GIT_EXECUTABLE=/usr/local/bin/git
export HOMEBREW_MAKE=/usr/local/bin/gmake
export HOMEBREW_NO_ENV_FILTERING=1
export HOMEBREW_TEMP=$HOME/tmp
```

- initial

```sh
mkdir -p $HOME/tmp
wget https://raw.githubusercontent.com/Linuxbrew/install/master/install
sed -i.bak '-es/\/bin\/chown/\/usr\/sbin\/chown/' '-es/\/bin\/chgrp/\/usr\/bin\/chgrp/' install
rm install.bak
yes | ruby install
rm install

git -C $HOME/.linuxbrew/Homebrew remote add ciel https://github.com/cielavenir/brew
git -C $HOME/.linuxbrew/Homebrew fetch ciel
git -C $HOME/.linuxbrew/Homebrew checkout ciel/sakura # sakura is 2.1.2+patch
brew update --force

ln -s /usr/lib/libc.so $HOME/.linuxbrew/lib/libdl.so
ln -s $HOME/.linuxbrew/bin/patch $HOME/.linuxbrew/Homebrew/Library/Homebrew/shims/linux/super/patch
ln -s $HOME/.linuxbrew/bin/m4 $HOME/.linuxbrew/Homebrew/Library/Homebrew/shims/linux/super/m4
ln -s $HOME/.linuxbrew/bin/bison $HOME/.linuxbrew/Homebrew/Library/Homebrew/shims/linux/super/bison
brew install gpatch
brew install m4
brew install bison

brew tap cielavenir/ciel
brew install $HOME/.linuxbrew/Homebrew/Library/Taps/cielavenir/homebrew-ciel/sakura/libiconv.rb
brew install $HOME/.linuxbrew/Homebrew/Library/Taps/cielavenir/homebrew-ciel/sakura/autoconf.rb
brew install automake
brew install pkg-config
brew install libtool
```

## 190807追記

[export HOMEBREW_BUILD_FROM_SOURCE=1 は2.0以降では不要でした](https://qiita.com/cielavenir/items/410ded536d9b520989c4)

## 220824追記

当方が使っているさくらサーバーがFreeBSD 13に移行しました。

- gccが/usr/local/bin/gccに移動したらしく、gccのパスを検出できなくなっていたので修正しました(sakuraブランチを再pullしてください)
- /usr/local/lib/gcc9/libstdc++.so.6にLD_LIBRARY_PATHを通す必要がありました
Magic Leap MagicScript Landscape Application. UiDropDownList

**Prepare**
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.1.1
https://www.npmjs.com/package/magic-script-polyfills

**Create Project**

```
magic-script init my-drop-down org.magicscript.dd "Drop Down List"
cd my-drop-down
```


**Code**
Change app.js

```javascript
import { LandscapeApp, ui } from 'lumin';
const {
    UiText
  , UiLinearLayout
  , UiDropDownList
  , DropDownListItem
  , EclipseLabelType
  , Alignment
  , HorizontalTextAlignment } = ui;

export class App extends LandscapeApp {
  onAppStart () {

    const prism = this.requestNewPrism([1.5, 1.0, 0.5]);

    const layout = UiLinearLayout.Create(prism);
    layout.setAlignment(Alignment.CENTER_CENTER);

    // Create a nice text label using UIKit.
    const text = UiText.CreateEclipseLabel(
      prism,
      "",
      EclipseLabelType.kT7
    );
    text.setAlignment(Alignment.CENTER_CENTER);
    text.setTextAlignment(HorizontalTextAlignment.kCenter);    
    layout.addItem(text, [0.005, 0.005, 0.005, 0.005]);
    
    // Create a drop down list using UIKit.
    const list = UiDropDownList.Create(prism, "Company");
    list.onSelectionChangedSub(function(event)
    {
      const items = list.getSelectedItems();
      if (items.length === 0)
      {
        return;
      }
      text.setText(items[0].label);     
    });
    
    // Magic Leap
    const sub_ml_item_1 = new DropDownListItem(
                                  "Rony Abovitz", [], 10);
    const sub_ml_item_2 = new DropDownListItem(
                                  "Rio Caraeff", [], 11);
    const item_ml = 
      new DropDownListItem("Magic Leap", [
                              sub_ml_item_1, sub_ml_item_2], 1);
    
    // Weta Digital
    const sub_weta_item_1 = new DropDownListItem(
                                   "Jamie Selkirk", [], 20);
    const sub_weta_item_2 = new DropDownListItem(
                                   "Peter Edward Jackson", [], 21);
    const sub_weta_item_3 = new DropDownListItem(
                                   "Joe Letteri", [], 22);
    const item_weta = 
      new DropDownListItem("Weta Digital", 
        [sub_weta_item_1, sub_weta_item_2, sub_weta_item_3], 2);      
    
    // None
    const item_none = new DropDownListItem("None", [], 0);
    
    list.setList([item_ml, item_weta, item_none]);
    list.setAlignment(Alignment.CENTER_CENTER);
    layout.addItem(list, [0.005, 0.005, 0.005, 0.005]);
    prism.getRootNode().addChild(layout);
  }
}

```

**Build**

```
magic-script build -i
```

**Run**

```
magic-script run --port=10000
```

**Reference**
UiDropDownList (MagicScript API)
https://docs.magicscript.org/lumin.ui.UiDropDownList.html

DropDownListItem (MagicScript API)
https://docs.magicscript.org/lumin.ui.DropDownListItem.html

magicscript
https://www.magicscript.org/

Thanks!
yahooトップページ作成①　hidefocusとspanタグについて

2週間で約80時間働き、今日は5連勤後の夜勤で完全に免疫力低下してます。
体温37度で喉ガラガラですが、明日もバイトがんばりまふー( ;∀;)

そんな私ですが、現在はある事情によって、HTMLを使って、ヤフーのトップページを作成しています。

ヤフーのトップページを作成する中で、自分が初めて見たコード(属性や値などの細かな部分も含めて）を調べて、実際に書いたものを簡単にまとめていこうと思います。

今回は、li(ul)クラスの中にあった値について



実際のヤフーのトップページはこうで、![2019-05-12 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373038/ed898ad4-372f-835a-7309-28825490877c.png)


この部分です!
![2019-05-12 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373038/ff2b4bf9-5403-6512-35ac-71d0087ec74a.png)

VScodeで、「動画タブ」を入力します。(urlは長いので空白)
![2019-05-12 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373038/e8c29251-7d01-022e-e160-3466ae1d2548.png)

ここで、progateを終えたばかりの私は、ある疑問をもちました。

【疑問点】
・「動画」の後ろにある「LIVE」はなぜspanタブなのか？
・hidefocus="true"とは？


さっそく調べてみました。

【調べた結果】
・hidefocusとは、通常は、ボタンやリンクにフォーカスが当たると点線で囲まれるが、hidefocus=trueにすることで、点線が消えるらしい。
・spanタブ自体に意味は無いが、スタイルシートで書いた内容が適用されるとのこと。インライン要素であり、ブロック要素であるdivタグだと、改行が入ってしまう。


ってことらしい。そういえばprogateでもインライン要素とブロック要素って習ったな…

ブロック要素→縦並び、横幅や高さは指定できる、余白(padding,margin)が指定できる
インライン要素→横並び、横幅や高さは指定できない、上下余白が指定できない(img,input,selectなどは可)

だったな。
なるほど、だから「LIVE」はspanタグにしたのか。

ということで、タブ全部書いてみよう！
![2019-05-13 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373038/91a53a38-59c6-8fa8-ebc5-bd20bb387009.png)

全部で10個ありました。
HTMLのコードだけだとこんな感じです。
![2019-05-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373038/a762d618-4ffc-f26e-2bb2-52546da10fbb.png)


ぱぱっとHTML書いて、CSSのスタイルシートも作らないと！！


今日はここまで！
PHPアプリをHerokuにデプロイする【Windows】

以下のような方で、主にPHPを使用している人向けに書きました


* 無料でWebサーバーを利用したい方
* 自作のWebアプリやサイトを公開したい方

# インストールなど
Git,Composerのインストール、Herokuのアカウント作成については終わらせているものとします

# Gitの設定
### パス
コマンドプロンプトを開き、`cd`コマンドでGitがインストールされているフォルダに移動
`C:\ProgramData\Git`まで移動する

### 設定変数の設定
まずはこの二つを実行する

```
git config --global user.name "任意の名前" 
git config --global user.email "任意のemailアドレス"
```

コミットして変更内容を記述する時などに使うエディタを指定する

```
git config --global core.editor notepad
```

# heroku上にアプリを作成する

以下のコマンドを任意のディレクトリで実行する

```
 heroku login
 heroku create (アプリ名※省略可)
```

`https://(アプリ名).herokuapp.com/ | https://git.heroku.com/(アプリ名).git`
のようにURLが取得できる。
createコマンドでアプリ名を指定した場合には、(アプリ名)の箇所に指定したものが入る。
指定しなかった場合は自動で割り当てられたものが入る。

次にアプリのルートディレクトリに`cd`コマンドで移動し、以下のコマンドを実行する
(以下、アプリのルートディレクトリを**$**とする)

```
$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add heroku https://git.heroku.com/(アプリ名).git
```

作成されたことを確認する

```
$ git remote
heroku
```

### デプロイを行う
以下のコマンドでデプロイを行う

```
$ git push heroku master
```

### エラーの対処

※pushに失敗した場合のメッセージ

```
：
remote: Verifying deploy...
remote:
remote: !       Push rejected to (アプリ名).
```

エラーの内容を確認してみる

```
：
remote:  !     No default language could be detected for this app.
remote:                         HINT: This occurs when Heroku cannot detect the buildpack to use for this application a
：
```

このように言語を特定できないというエラーがでた場合、以下のコマンドを実行する

```
$ composer init
```

途中選択する箇所がでてくるが、とりあえずEnter押下で初期値を選択していく

アプリのルートディレクトリに`composer.json`ファイルが作成されていることを確認する

### ファイル作成などをGitで管理する
ファイルを追加、変更した際は、そのファイルが置かれているフォルダのパスで以下を実行する

```
(フォルダまでのパス) git add (追加、変更したファイル名)
$ git commit 
```

ファイルを削除した場合は、ルートディレクトリで`git commit`するだけでいい
そのほか、commit可能な状態(staged)かどうか確認するコマンドとして`$ git status`,　`$ git diff`
などが役に立つ

再度、`git push`を実行する

```
$ git push heroku master
remote: Verifying deploy... done.
To https://git.heroku.com/(アプリ名).git
   190a832..eb17420  master -> master
```

これでアプリがデプロイされた

# アプリをWeb上でアクセス可能にする

コマンドプロンプトで`heroku open`を実行するか、URL`http://(アプリ名)/herokuapp.com`を打ち込むとアプリにアクセスできる。

アプリのページが表示されない場合、ファイルパスの指定を行う必要がある。


### Procfile作成の手順
アプリのルートディレクトリにProcfile(拡張子なし)のファイルを作成する
中身に以下のコードを記述する
`web: vendor/bin/heroku-php-apache2 web/`
最後の`web/`の部分がルートディレクトリから.jsや.cssなどのファイルがある場所へのパスとなるように記述する

以下のコマンドを実行する

```
$ git add Procfile
$ git commit
$ git push heroku master
```
これでアプリへのアクセスができたらおわりです。

### 参考にした記事

* [【herokuコマンド】createからdestroyまで](https://qiita.com/chihiro/items/5c3ff400f6cb99deb945)
* [Gitの公式サイト]
(https://git-scm.com/book/en/v2)

GitもHerokuも初心者なので、たいへん参考になりました。
誤っている箇所の指摘などありましたら、コメントいただけたら嬉しいです。
便利なサイト・ツール

便利なサイトやツールをまとめていく(web系がメイン)
ほぼ備忘録みたいなとこある
気が向いたら追加する
##RGB↔カラーコード
http://iroempitsu.net/zukan/tl-hexdec.htm
##UIの名称
https://qiita.com/shiraishiwataru/items/7728ffbc4dc390c92b06
##CSS整形
http://www.codebeautifier.com/#skip
https://www.10bestdesign.com/dirtymarkup/
##変数命名
https://codic.jp/engine
##PNG透過
https://www.peko-step.com/tool/alphachannel.html
JSONviewer
http://jsonviewer.stack.hu/
ARの関連情報

ARの勉強している中で情報が散らばって来たのでメモ用に記述

## ハードウェア

### スマートグラス

* Apple Glass (Apple)
* [dynaEdge](https://us.dynabook.com/smartglasses/) (Toshiba)
* [Google Glass](https://glass.google.com/) (Google)
* [HoloLens](https://www.microsoft.com/en-us/hololens) (Microsoft)
* [MAD GAZE](http://madgaze.com/)(Dragon Creative)
* [Magic Leap](https://www.magicleap.com/)(Magic Leap)
* [Meta](https://www.metavision.com/) (Meta Company)
* [MOVERIO BT-300](https://www.epson.jp/products/moverio/bt300/) (EPSON)
* [R8, R9](https://vrinside.jp/news/odg-ar-glasses-ces-2017/) (ODG(Osterhout Design Group))
* [Raptor](https://everysight.com/) (EverySight)
* [Solos](https://solos-wearables.com/) (Kopin)
* [Vuzix](https://www.vuzix.com/)(Vuzix)
* [X2](https://www.thirdeyegen.com/) (ThirdEye)

### スマートフォン

* [ARKit対応デバイス](https://www.apple.com/jp/ios/augmented-reality/) (ページ下部に記述。2019/05 時点
  
* [ARCore対応デバイス](https://developers.google.com/ar/discover/supported-devices)

## ソフトウェア

* [ARKit](https://developer.apple.com/jp/documentation/arkit/)
  * iOSデバイスのカメラ機能とモーション機能を統合し、Appやゲームの中で拡張現実体験を生み出します。

* [ARCore](https://developers.google.com/ar/)
> ARCore is Google’s platform for building augmented reality experiences.
Using different APIs, ARCore enables your phone to sense its environment, understand the world and interact with information. 
Some of the APIs are available across Android and iOS to enable shared AR experiences.

* [Vuforia](https://developer.vuforia.com/)
  * マルチプラットフォーム、マルチデバイスに対応しているAR開発用ライブラリ
  * [Unityでの利用紹介](https://unity3d.com/jp/partners/vuforia)
* [Spark AR Studio](https://sparkar.facebook.com/ar-studio/)
  * Facebookが開発しているARコンテンツ制作ツール
* [Amazon Sumerian](https://aws.amazon.com/jp/sumerian/)
  * VR/AR/3Dアプリケーションの開発ツール
  
## ネイティブアプリ

有名なアプリを抜粋

* [ポケモンGO](https://www.pokemongo.jp/)
* [SNOW](https://itunes.apple.com/jp/app/id1022267439?mt=8)
* [テクテクテクテク](https://itunes.apple.com/jp/app/id1364980095?mt=8)
* Measureアプリ（Apple公式アプリ
* [ペチャバト](https://itunes.apple.com/jp/app/id1444974380?mt=8)
* [Apple公式ページで紹介されているアプリ](https://www.apple.com/jp/ios/augmented-reality/)
* [Google Map](https://youtu.be/14wedZy90Tw)（リンク先はYoutube
  
## その他

### 書籍

※実際に購入 or 読んだことのある本のみ記述

* [実践ARKit](https://booth.pm/ja/items/1038241) ([shu223](https://twitter.com/shu223)さんがBOOTHにて出版)
  * サンプルコード: https://github.com/shu223/ARKit-Sampler

### カンファレンス・イベント

* [AWE(Augmented World Expo)](https://www.awexr.com/): 世界で最も重要なAR+VRのカンファレンス、博覧会。開催時期は毎回異なる。
* [AWE Nite Tokyo](https://awenitetokyo.connpass.com/): 世界最大のARコミュニティAWE Niteの東京支部

## 参考記事

* [【AR Talk①前編】ハードウェアスタートアップから見るスマートグラスのこれまでとこれから](https://note.mu/ar_ojisan/n/n31adb49a1dc1)
* [THE 10 BEST AUGMENTED REALITY SMARTGLASSES IN 2019](https://www.aniwaa.com/best-of/vr-ar/best-augmented-reality-smartglasses/)


## 調べられていない内容、今後

* Android系のARアプリ、WebARについて
* ARのiOSアプリを作る
    * ARアプリ特有のデザインやインタラクション方法について学ぶなどする
AWS DeepRacerのはじめかた（7）Virtual Circuit

## 目次（投稿一覧）
1. [DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)
2. [DeepRacerのはじめかた（2）サービスの利用開始と参考費用](https://qiita.com/tagucchan/items/7c80d7e3f872b51e218e)
3. [DeepRacerのはじめかた（3）最初のエンジンを作成](https://qiita.com/tagucchan/items/b3e4a03455ee74becd0e)
4. [DeepRacerのはじめかた（4）Evaluation（作成したエンジンを評価）](https://qiita.com/tagucchan/items/1fd99f35061c7a21839f)
5. [DeepRacerのはじめかた（5）ログの場所](https://qiita.com/tagucchan/items/4f69306cf3c552bfcbdd)
6. [DeepRacerのはじめかた（6）モデルのダウンロード方法](https://qiita.com/tagucchan/items/a228cb4d529716bddab9)
7. [DeepRacerのはじめかた（7）Virtual Circuit](https://qiita.com/tagucchan/items/0281d8f99b0386cbbd78)　**← 表示中**
8. [DeepRacerのはじめかた（8）参考情報 モデルのトレーニングと評価](https://qiita.com/tagucchan/items/14ce383d2a5775aa3f49)

## 概要
Virtual Circuit はAWS DeepRacer League Virtual Circuitのことで、実機のロボットではありませんが、仮想のサーキットで世界の参加者とのレースができます。
***[Virtual Circuit](https://console.aws.amazon.com/deepracer/home?region=us-east-1#leaderboards)***
![WS20190513000518_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/4a163c30-0dbc-c0fa-f7ea-b2c8952df59a.jpeg)

## 注意
Virtual Circuitは開催時期（国）により、コースが異なります。
そのため、そのコースに合わせたエンジン（モデル）を作成することも必要になってきます。

## Virtual Circuitに参加
### 注意：Regionを**米国東部 (バージニア北部)**に変更  
![WS2019051217_0001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/7e4f91d4-a0c9-7720-b880-00afc1d6b5d5.jpeg)

または、こちらのリンクにアクセス　[AWS DeepRacer](https://console.aws.amazon.com/deepracer/home?region=us-east-1#welcome)　

### AWS DeepRacer　を開始
![WS20190512190500_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/b69d8244-2719-9ada-6d57-502645ee0c52.jpeg)

### Reinforcement learning　を表示
左側のメニューから　Reinforcement learning　をクリックします。
![WS20190512210511_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/f6d53167-c4b8-cc34-24e2-fbb4f98d6e7b.jpeg)

### 作成したエンジンを選択します
Models　が表示されますので、作成したエンジンを選択します。
初期状態で、サンプルのエンジンが３つほどありますので、間違えないようにしてください。
強化学習が完了していれば、Status　が　Ready になっているはずです。
名前の場所がリンクになっていますので、クリックするとそのモデルの画面になります。
![WS20190512210543_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/32aa7806-f611-f4b7-3c56-48bf9f31a3dc.jpeg)

### 作成したモデル（エンジン）でVirtual Circuitへ参加
「Submit to Virtual race」ボタンを押すとVirtual Circuitに参加することができます。
![WS20190512230504_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/8feb8d6e-91c1-b757-6884-b83c9b7e64df.jpeg)

以降は案内に従ってください。

## 移動
**次の記事**
[DeepRacerのはじめかた（8）参考情報 モデルのトレーニングと評価](https://qiita.com/tagucchan/items/14ce383d2a5775aa3f49)

**前の記事**
 [DeepRacerのはじめかた（6）モデルのダウンロード方法](https://qiita.com/tagucchan/items/a228cb4d529716bddab9)

**Top 概要と目次　に戻る**
[DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)
AWS DeepRacerのはじめかた（6）モデルのダウンロード方法

## 目次（投稿一覧）
1. [DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)
2. [DeepRacerのはじめかた（2）サービスの利用開始と参考費用](https://qiita.com/tagucchan/items/7c80d7e3f872b51e218e)
3. [DeepRacerのはじめかた（3）最初のエンジンを作成](https://qiita.com/tagucchan/items/b3e4a03455ee74becd0e)
4. [DeepRacerのはじめかた（4）Evaluation（作成したエンジンを評価）](https://qiita.com/tagucchan/items/1fd99f35061c7a21839f)
5. [DeepRacerのはじめかた（5）ログの場所](https://qiita.com/tagucchan/items/4f69306cf3c552bfcbdd)
6. [DeepRacerのはじめかた（6）モデルのダウンロード方法](https://qiita.com/tagucchan/items/a228cb4d529716bddab9)　**← 表示中**
7. [DeepRacerのはじめかた（7）Virtual Circuit](https://qiita.com/tagucchan/items/0281d8f99b0386cbbd78)
8. [DeepRacerのはじめかた（8）参考情報 モデルのトレーニングと評価](https://qiita.com/tagucchan/items/14ce383d2a5775aa3f49)

## 概要
**もくもく会に参加される方向け**
作成したモデル（エンジン）のダウンロード方法について。
***[AWS Deep Racer](https://aws.amazon.com/jp/deepracer/)***サイト

## 最初のエンジン（モデル）を作成開始
### 注意：Regionを**米国東部 (バージニア北部)**に変更  
![WS2019051217_0001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/7e4f91d4-a0c9-7720-b880-00afc1d6b5d5.jpeg)

または、こちらのリンクにアクセス　[AWS DeepRacer](https://console.aws.amazon.com/deepracer/home?region=us-east-1#welcome)　

### AWS DeepRacer　を開始
![WS20190512190500_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/b69d8244-2719-9ada-6d57-502645ee0c52.jpeg)

### Reinforcement learning　を表示
左側のメニューから　Reinforcement learning　をクリックします。
![WS20190512210511_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/f6d53167-c4b8-cc34-24e2-fbb4f98d6e7b.jpeg)

### 作成したエンジンを選択します
Models　が表示されますので、作成したエンジンを選択します。
初期状態で、サンプルのエンジンが３つほどありますので、間違えないようにしてください。
強化学習が完了していれば、Status　が　Ready になっているはずです。
名前の場所がリンクになっていますので、クリックするとそのモデルの画面になります。
![WS20190512210543_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/32aa7806-f611-f4b7-3c56-48bf9f31a3dc.jpeg)

### 作成したモデルのダウンロード方法
「Download model」ボタンを押すと、作成したモデルをダウンロードすることができます。
ファイルの拡張子は**.tar.gz**です。

**もくもく会で取り組まれる方へ**
作成できたモデルは、ダウンロードし各自で保管しておいてください。
![WS20190512230555_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/a42d3bd9-96fd-6a09-2113-68f8566a1afc.jpeg)

## 移動
**次の記事**
[DeepRacerのはじめかた（7）Virtual Circuit](https://qiita.com/tagucchan/items/0281d8f99b0386cbbd78)

**前の記事**
[DeepRacerのはじめかた（5）ログの場所](https://qiita.com/tagucchan/items/4f69306cf3c552bfcbdd)

**Top 概要と目次　に戻る**
[DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)
AWS DeepRacerのはじめかた（5）ログの場所

## 目次（投稿一覧）
1. [DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)
2. [DeepRacerのはじめかた（2）サービスの利用開始と参考費用](https://qiita.com/tagucchan/items/7c80d7e3f872b51e218e)
3. [DeepRacerのはじめかた（3）最初のエンジンを作成](https://qiita.com/tagucchan/items/b3e4a03455ee74becd0e)
4. [DeepRacerのはじめかた（4）Evaluation（作成したエンジンを評価）](https://qiita.com/tagucchan/items/1fd99f35061c7a21839f)
5. [DeepRacerのはじめかた（5）ログの場所](https://qiita.com/tagucchan/items/4f69306cf3c552bfcbdd)　**← 表示中**
6. [DeepRacerのはじめかた（6）モデルのダウンロード方法](https://qiita.com/tagucchan/items/a228cb4d529716bddab9)
7. [DeepRacerのはじめかた（7）Virtual Circuit](https://qiita.com/tagucchan/items/0281d8f99b0386cbbd78)
8. [DeepRacerのはじめかた（8）参考情報 モデルのトレーニングと評価](https://qiita.com/tagucchan/items/14ce383d2a5775aa3f49)

## 概要
DeepRacerのログについては、強化学習の成果や方針を検討するのに見たくなる時が来ます（多分）。
CloudWatchというAWSのサービスになりますので、触ったことが無い方は試してみてください。
***[Amazon CloudWatch](https://aws.amazon.com/jp/cloudwatch/)***サイト

## ログの場所
### 注意：Regionを**米国東部 (バージニア北部)**に変更  
![WS2019051217_0001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/7e4f91d4-a0c9-7720-b880-00afc1d6b5d5.jpeg)
）
### CloudWatchの画面を開く
[CloudWatch us-east-1](https://console.aws.amazon.com/cloudwatch/home?region=us-east-1)

### 「ログ」を開く
左側のメニューから「ログ」をクリックします。
![WS20190512230559_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/211245c6-f576-f474-8837-c32b3c2d276f.jpeg)

### DeepRacerのログ
DeepRacer関連の標準的なロググループ。
これ以外にも、reward_functionからログ出力することもできます。
/aws/lambda/AWS-DeepRacer-Test-Reward-Function
/aws/robomaker/SimulationJobs
/aws/sagemaker/TrainingJobs
/aws/deepracer/leaderboard/SimulationJobs　（leaderboardに参加しないと無い）
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/370cb544-1490-e419-333b-12a3f9f44103.jpeg)

### トレーニングのRewardグラフから飛ぶこともできる
グラフのメニュー　> ログの表示　からCloudWatchに飛ぶこともできます。
![WS20190513130512_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/01570007-b423-691f-cc29-ad6625d703b4.jpeg)

**次の記事**
[DeepRacerのはじめかた（6）モデルのダウンロード方法](https://qiita.com/tagucchan/items/a228cb4d529716bddab9)

**前の記事**
[DeepRacerのはじめかた（4）Evaluation（作成したエンジンを評価）](https://qiita.com/tagucchan/items/1fd99f35061c7a21839f)

**Top 概要と目次　に戻る**
[DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)
AWS DeepRacerのはじめかた（4）Evaluation（作成したエンジンを評価）

## 目次（投稿一覧）
1. [DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)
2. [DeepRacerのはじめかた（2）サービスの利用開始と参考費用](https://qiita.com/tagucchan/items/7c80d7e3f872b51e218e)
3. [DeepRacerのはじめかた（3）最初のエンジンを作成](https://qiita.com/tagucchan/items/b3e4a03455ee74becd0e)
4. [DeepRacerのはじめかた（4）Evaluation（作成したエンジンを評価）](https://qiita.com/tagucchan/items/1fd99f35061c7a21839f)　**← 表示中**
5. [DeepRacerのはじめかた（5）ログの場所](https://qiita.com/tagucchan/items/4f69306cf3c552bfcbdd)
6. [DeepRacerのはじめかた（6）モデルのダウンロード方法](https://qiita.com/tagucchan/items/a228cb4d529716bddab9)
7. [DeepRacerのはじめかた（7）Virtual Circuit](https://qiita.com/tagucchan/items/0281d8f99b0386cbbd78)
8. [DeepRacerのはじめかた（8）参考情報 モデルのトレーニングと評価](https://qiita.com/tagucchan/items/14ce383d2a5775aa3f49)

## 概要
***[AWS Deep Racer](https://aws.amazon.com/jp/deepracer/)***サイト

## Evaluation（作成したエンジンを評価）
### 注意：Regionを**米国東部 (バージニア北部)**に変更  
![WS2019051217_0001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/7e4f91d4-a0c9-7720-b880-00afc1d6b5d5.jpeg)

または、こちらのリンクにアクセス　[AWS DeepRacer](https://console.aws.amazon.com/deepracer/home?region=us-east-1#welcome)　

### AWS DeepRacer　を開始
![WS20190512190500_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/b69d8244-2719-9ada-6d57-502645ee0c52.jpeg)

### Reinforcement learning　を表示
左側のメニューから　Reinforcement learning　をクリックします。
![WS20190512210511_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/f6d53167-c4b8-cc34-24e2-fbb4f98d6e7b.jpeg)

### 作成したエンジンを選択します
Models　が表示されますので、作成したエンジンを選択します。
初期状態で、サンプルのエンジンが３つほどありますので、間違えないようにしてください。
強化学習が完了していれば、Status　が　Ready になっているはずです。
名前の場所がリンクになっていますので、クリックするとそのモデルの画面になります。
![WS20190512210543_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/32aa7806-f611-f4b7-3c56-48bf9f31a3dc.jpeg)

### Start Evaluation（作成したエンジンを評価）の開始
対象のモデルの画面を開いたら、「Start Evaluation」ボタンを押して評価を開始します。
![WS20190512210505_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/523b51ba-3ac2-4c5f-9ed3-7ecd4d880bb9.jpeg)

### Start Evaluation（作成したエンジンを評価）の開始
**AWSの課金料金がかかります**
もくもく会で取り組みされる方は**re:Invent 2018** **3回（周）**を選択してください。
評価に使うコースを選択し、「Start Evaluation」ボタンで開始します。
**コースの下に、何回（周）するかや、利用料金の詳細について記載があります!**
必ずスクロールして確認してください。
![WS20190512210535_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/dceddbd0-32ff-3098-1e93-5a06e619c082.jpeg)

### Evaluation（作成したエンジンを評価）
画面が変わり、Evaluation（作成したエンジンを評価）が開始されます。
4分程ほど待つと、始まります。
もくもく会で取り組みされる方へ
・この結果をキャプチャし共有してください。
・Evaluationは少し費用はかかるものの、何度でも実施できます。
　人数が集まれば、発表でデモ走行をしていただくことも考えています。
![WS20190512220528_0000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/3ad8b465-c64a-2365-051e-40e3df23655a.jpeg)

## 移動
**次の記事**
[DeepRacerのはじめかた（5）ログの場所](https://qiita.com/tagucchan/items/4f69306cf3c552bfcbdd)

**前の記事**
[DeepRacerのはじめかた（3）最初のエンジンを作成](https://qiita.com/tagucchan/items/b3e4a03455ee74becd0e)

**Top 概要と目次　に戻る**
[DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)
AWS DeepRacerのはじめかた（1）概要と目次

## 目次（投稿一覧）
1. [DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)　**← 表示中**
2. [DeepRacerのはじめかた（2）サービスの利用開始と参考費用](https://qiita.com/tagucchan/items/7c80d7e3f872b51e218e)
3. [DeepRacerのはじめかた（3）最初のエンジンを作成](https://qiita.com/tagucchan/items/b3e4a03455ee74becd0e)
4. [DeepRacerのはじめかた（4）Evaluation（作成したエンジンを評価）](https://qiita.com/tagucchan/items/1fd99f35061c7a21839f)
5. [DeepRacerのはじめかた（5）ログの場所](https://qiita.com/tagucchan/items/4f69306cf3c552bfcbdd)
6. [DeepRacerのはじめかた（6）モデルのダウンロード方法](https://qiita.com/tagucchan/items/a228cb4d529716bddab9)
7. [DeepRacerのはじめかた（7）Virtual Circuit](https://qiita.com/tagucchan/items/0281d8f99b0386cbbd78)
8. [DeepRacerのはじめかた（8）参考情報 モデルのトレーニングと評価](https://qiita.com/tagucchan/items/14ce383d2a5775aa3f49)

## ご注意
### 本資料は私が主催する　AI・データ解析　もくもく会　の参加者（初心者）向け資料です。
不備等も多々あると思いますが、ご容赦下さい。
###私はデータサイエンティストやAWSのプロではありません。
いろいろな技術を試してみるのが面白く、データ分析やAIの勉強を続けている者です。
###AWSのサイトにちゃんと情報があります
***情報は[AWS Deep Racerのサイト](https://aws.amazon.com/jp/deepracer/)にすべて記載されています！***
主催している初心者向け AI・データ分析**もくもく会**で、推奨課題の１つとしてAWS Deep Racerを紹介することにしました。
そのため、もくもく会の参加者である**「これからAIを勉強する」「AWSに触ったことがない」「英語が苦手」**の方を対象に、AWS Deep Racerのはじめかたを説明する内容になっています。
### AWSの契約等については割愛します
AWS自体の契約や、初期の環境整備等の説明は割愛します。

## AWS Deep Racerとは
***[AWS Deep Racer](https://aws.amazon.com/jp/deepracer/)***サイトより引用
> AWS DeepRacer は、文字どおり機械学習を自由自在に操る最速の手段です。強化学習により駆動する 1/18 スケールの完全自走型レーシングカー、3D レーシングシミュレーター、そしてレースの世界大会をご用意しています。

**推奨課題に選んだ理由：**
1. パラメータを修正することから開始でき、プログラミング初心者でも取り組める
2. 結果として、分析や予測のデータが見えるのではなく、実際に***走る***ので楽しい

## 移動
**次の記事**
[DeepRacerのはじめかた（2）サービスの利用開始と参考費用](https://qiita.com/tagucchan/items/7c80d7e3f872b51e218e)

**前の記事**
なし

**Top 概要と目次に戻る**
[DeepRacerのはじめかた（1）概要と目次](https://qiita.com/tagucchan/items/06cb3c5c81de766ebe59)
v-modeの双方向  データバインディングをv-bindとv-onで実装する


# v-modeを使った場合

v-modelを使う場合は以下。inputタグ内でv-modelをしているするだけ。

```vuejs

<body>
  <div id="app">
    v-model使う : {{ message }}
    <div>
      <input type="text" v-model="message">
    </div>
```

> form の input 要素 や textarea 要素、 select 要素に双方向 (two-way) データバインディングを作成するには、v-model ディレクティブを使用することができます。それは、自動的に入力要素のタイプに基づいて要素を更新するための正しい方法を選択します。ちょっと魔法のようですが、v-model はユーザーの入力イベントにおいてデータを更新するための基本的な糖衣構文 (syntax sugar) で、それに加えて、いくつかのエッジケースに対しては特別な配慮をしてくれます。
https://jp.vuejs.org/v2/guide/forms.html


# v-bindとv-onを使った場合

フォームに入力された時に( `v-on:input` ) フォームの値でmessage1を上書きする。( ` message1 = $event.target.value` )

```vuejs
    v-on使う : {{message1}}
    <div>
      <input type="text" v-bind:value="message1" v-on:input="message1 = $event.target.value">
    </div>
  </div>


</body>
```

# 全文
```vuejs

<body>
  <div id="app">
    v-model使う : {{ message }}
    <div>
      <input type="text" v-model="message">
    </div>
    v-on使う : {{message1}}
    <div>
      <input type="text" v-bind:value="message1" v-on:input="message1 = $event.target.value">
    </div>
  </div>

  <script>
    var app = new Vue({
      el: '#app',
      data: {
        message: "",
        message1: ""
      }
    })
  </script>
</body>
```
Apache設定 ファイル権限問題がないのに 403 Permission denied  file permissions deny server access の対策


SELinux有効かを確認する（Enforcing=有効）

```
# getenforce
Enforcing
```

有効の場合は下記のコマンドでhttpdプロセスがファイルにアクセスできるようにする


```bash
chcon -R -h -t httpd_sys_content_t /var/www/html
```

`This recursively sets your content directory to the proper context for Apache.`

`chcon` コマンドは、ファイルの SELinux コンテキストを変更します。ただし、chcon コマンドによる変更は、ファイルシステムの再ラベル付けや restorecon コマンドが実行されると維持されません。SELinux ポリシーは、特定のファイルの SELinux コンテキストをユーザーが修正できるかどうかを制御します。chcon を使うと、ユーザーは変更する SELinux コンテキストの一部または全部を提供します。SELinux がアクセスを拒否する一般的な原因は、ファイルタイプが間違っているためです。

`httpd_sys_content_t` ラベルが、httpdプロセスがこのファイルにアクセスできることを表す.

ちなみに

**SELinuxって？**
- Linuxのセキュリティを強化する仕組みで、カーネルに追加される
- 米国国家安全保障局 (National Security Agency) が開発した

**SELinuxのセキュリティの仕組み**
- プロセスとファイルの全てに、タイプでラベル付けを行う。
- タイプはプロセスのドメインを定義しており、プロセスはドメイン毎に互いに分離している。
- SELinuxポリシールールは、タイプに基づきプロセスがファイルと対話する方法とプロセス同士が対話する方法を定義する。
- プロセスは、アクセスを許可するポリシールールが定義されている場合のみ、当該ファイル又はプロセスへアクセスできる。
DockerでシンプルなシングルバイナリのDockerfileをつくるまで 

> C++の自作常駐デーモンをDockerでポータブルにしたくて、なんか調べた時のメモ

いきなりDockerFileに書きはじめるのは不毛（必要なパッケージなんて完璧に把握してるわけないし）なので、プレーンなAlpineをコンテナで用意して試行錯誤したのちに、最低限のコマンドをDockerFileに落としこむ。

実行環境を最小にしたいなら、二系統作っておくとよい。考え方としては、クロスコンパイル環境に近い。     

### 参考

- [Alpine Linux使ってみた](https://qiita.com/tukiyo3/items/247f853c81bf00e82c11) 
- [Dockerでホストとコンテナ間でのファイルコピー](https://qiita.com/gologo13/items/7e4e404af80377b48fd5)     
- [Alpine Linux で適当なバイナリを持ってきて動かす備忘録](https://www.labohyt.net/blog/server/post-3272/)
C++ の辞書とハッシュ（例題）


[Count Triplets](https://www.hackerrank.com/challenges/count-triplets-1)

## 問題
数列中から次の条件を満たす3つ組の数を数える. 比率 r が与えられていて [1, r, r^2] . 数列はソートされていると仮定する. 

### 入力
数列の長さ n 比率 r
数列 arr

### 出力
可能な3つ組の数

### 入力例

```
6 3
1 3 9 9 27 81
```

### 出力例

```
6
```

3つ組を数える基礎として、まず2つ組を数えます。

数列の値 arr[i] を大きい値から順番にハッシュ mp1 に入れて数えます（mp1[arr[i]]++）。それと同時に arr[i] * r の値が mp1 に入っていたら, その値を mp2 に加えます（mp2[arr[i]] += mp1[arr[i] * r]）。こうすると arr[i], arr[i]*r の組が数えられます。

ハッシュ (unordered_map) は定義されていないときの初期値は 0 になります。

3つ組も同じように arr[i] * r の値が mp2 に入っていたら、その値を mp3 に加えます（mp3[arr[i]] += mp2[arr[i] * r])。

数列の値をすべてチェックしたあとに mp3 の値の総和を求めれば、答えになります。ハッシュのループはイテレータを使います。

```
long countTriplets(vector<long> arr, long r) {
    unordered_map<long, long> mp1, mp2, mp3;
    int l = arr.size();
    for (int i = l - 1; i >= 0; i--) {
      mp3[arr[i]] += mp2[arr[i]*r];
      mp2[arr[i]] += mp1[arr[i]*r];
      mp1[arr[i]]++;
    }
    long res = 0;
    for (unordered_map<long, long>::iterator itr = mp3.begin(); itr != mp3.end(); itr++) {
        res += itr->second;
    }
    return res;
}
```
凄いよGCP

# ぱぱぱのぱ（古い）
- GCPでGCEを構築（デプロイっていうのがカッコいいのかな？）本当あっという間（当たり前だけど）
- かなり昔にやった事なので色々忘れている。というか思い出せない（汗
- 検索したら同じQiita内に記事があったので、その中でももっとも簡単にssh出来る方法で繋ぐ
    - [sshで繋ぐ@NewGyu](https://qiita.com/NewGyu/items/c34bcddd13d96c740d82#ssh%E3%81%A7%E3%81%A4%E3%81%AA%E3%81%90)　//参考文献ありがとうございます

# 一先ず繋いでみる
- SSHボタンを押す

![スクリーンショット 2019-05-12 21.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/12bcc371-9097-0cd8-898b-374e24345278.png)

- SSHボタンを押す
- 繋がる（早い！）

![スクリーンショット 2019-05-12 21.44.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/90ca6b41-bca9-ea92-9648-b4684113fa36.png)

# んでもってインスコ

- `sudo snap install go --classic`でインストール完了
- 先に作成した`hello.go`ファイルを移植し`go run hello.go`を実行

```
******@******:~$ go run ./go/hello.go
hi.this is small step,but will be big one for me.
```
- 当たり前だけど動いた。ここまでは今までのやり直しなので先に進もう、ってか進まないとね❤️

# 補足：簡単キャプチャ
- osx（10.14.4）だからなのかもしれないけど、調べると簡単にキャプチャが取れるらしい
- shift + command + 4　で範囲選択でキャプチャ！
- shift + command + 3　で画面全体をキャプチャ！
- う〜ん、便利だねosx😁
はてブのChrome拡張を入れとおくと情報収集が便利な件

## はてブのChrome拡張を入れとおくと便利な件
まずは以下のGoogle検索画面をみて下さい。
<img width="639" alt="Screen Shot 2019-05-12 at 23.50.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250231/74764276-dd3f-9e6c-ba38-9d2c7d8a060a.png">

はてブのChrome拡張をダウンロードしておくと、このようにそのページのはてブの数が表示されます。

Googleの検索アルゴリズムはとても賢いですが、求めていた情報が一番上に来るとは限りません。

このChrome拡張があると目的の情報にたどり着ける可能性が高くなります。

ぜひ試してみて下さい。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
hairless-midiserial で Mac の IACドライバを使う

#### この記事はなに？

Mac で Serial で Midi を使うには [hairless-midiserial](https://projectgus.github.io/hairless-midiserial/) がいい、と聞いた。DAWからは Mac の Audio-MIDI 設定で IAC を有効にすれば使える、と聞いた。
IACを有効にしたらDAWからは見えたんだけど、hairless-midiserial から見えなかった。エラーログもなにもなく、原因を追えない。

### TL;DR
Audio-MIDIで作成するときのIACドライバの「装置名」「ポート名」をアルファベットだけで構成すれば hairless-midiserial から見えるようになる。

# ビルドして原因究明しよう

#### hairless-midi 側の準備

```
git clone --recursive https://github.com/projectgus/hairless-midiserial.git
git submodule foreach --recursive git pull origin master
```
Qt4でなくQt5でビルドするので、[パッチ#31](https://github.com/projectgus/hairless-midiserial/pull/31/files)を当てる。

#### QT 5 ビルド環境の準備

QT Open Source をダウンロード＆インストール：
https://www.qt.io/download-qt-installer

- インストール中、サインアップを求められる。必要かどうか不明だがサインアップしてログインする。
- [XCode](https://developer.apple.com) が必要。と言われた。とりあえずXCodeを入れずに、既定値で Qt Creator だけインストールしてみる。
- ライブラリが見つからない。Qt 5.12.3 の Sources と MacOS をインストールしてみる。

#### ビルド
- QT Creator から hairless-midiserial.pro を開く
- すんなりビルドできた！！
- すんなりIACも見えた！！ なんだったんだ！！ ビルド済バイナリ、どこに置いておけばいいかな？

#### 原因を探る

[パッチ#31](https://github.com/projectgus/hairless-midiserial/pull/31/files)で　`QtString::fromASCII` を `QtString::FromLatin1` に書き換えている。これ気になるなぁ。選択肢に日本語が含まれるとダメ？？
→ 試しに機器名とポート名をASCII文字だけにしてみたら → hairless-serialmidiの配布イメージでもIACが見えるようになった！ 解決だね。
PHPのfinally

以下のときの`finally`句の挙動

```php
function test($argument)
{
    try
    {
        echo "try\n";
        return $argument;
    }
    finally
    {
        $argument++;
        unset($argument);
        echo "finally\n";
    }
}

$counter = 2;
$result = test($counter);
var_dump($result);
```

```:7.1.25-7.3.5
try
finally
int(2)
```

```:5.5.0-
try
finally

Notice: Undefined variable: argument in /in/0oTE9 on line 8
NULL
```

https://3v4l.org/0oTE9

---

**メモ**


`try`句の`return`文でファイルを使用して`finally`句でファイルを`unlink`するとfile busyになりました。
php-master-changes 2019-05-11

今日は typo の修正、不要コードの削除、config.guess、config.sub の更新、テストで使われていた *.jpeg の *.jpg へのリネーム、テストの並列実行対策、不要なドキュメントの削除、テストのコメント内に maintainer zts とあったのを単に zts とする修正があった！

# 2019-05-11
## cmb69: Fix typo
- https://github.com/php/php-src/commit/3759c6316dc7756bef7aa7bdcb7e9ae631c195a8
- [7.2~]
- AppVeyor の設定にあった typo の修正

## petk: Remove unused variables
- https://github.com/php/php-src/commit/313930a36a3a3d73836e860a54311f4b5742cba5
- [7.4~]
- 不要な変数の削除

## petk: Bump config.guess and config.sub
- https://github.com/php/php-src/commit/e586d3f447e35fa0ddb7fc831dea36bcf5739104
- [7.4~]
- config.guess、config.sub の更新

## petk: Rename *.jpeg files to *.jpg
- https://github.com/php/php-src/commit/a68e0767b349360344fcdfa0f853bf577c37adbd
- [7.4~]
- テストで使われていた *.jpeg の *.jpg へのリネーム

## cmb69: Prevent race condition
- https://github.com/php/php-src/commit/330d773b3c891642c255cadc515637cfe6647459
- [7.4~]
- テストの並列実行対策

## petk: Remove ffi README in favour of docs
- https://github.com/php/php-src/commit/4bfb86cdcab4451cef184d3770420bb9cf7ca121
- [7.4~]
- ext/ffi で、README ファイルの削除
- ソースコード内のドキュメントはある程度 PHP マニュアルに一本化していくノリ

## petk: Fix comment to match the future zts configuration option
- https://github.com/php/php-src/commit/8ef2121ee10b9741fb306cf5eb2b12c427c7ee07
- [7.4~]
- テストのコメント内に maintainer zts とあったのを単に zts と修正
nuxt docker

```Dockerifle:Dockerfile
FROM node:latest # version指定 docker inspect => "NODE_VERSION=11.14.0"
EXPOSE 7000      # port 7000 を開ける
ENV HOST 0.0.0.0 # container に どのipaddressでも接続できる<=これ無しだと、接続できない。ipaddressが違う？
```

```yml:docker-compose.yml
version: "3"  
services:
  web:
    build: .      #<= ./　でも同じ
    volumes:
      - ".:/app"  #<= ./:/app　でも同じ <= host:container
    ports:
      - 7000:3000 #<= ホストで7000を開くとコンテナの3000につながる。バインディング。Dockerfileと揃える
    container_name: "nuxt-sandbox"
    tty: true     #<= 入力を受け付ける
```

上の二つを同じフォルダに置いて、

```
docker-compose up -d
// -d　ありだと、バックグラウンド起動、無しだと、ターミナル上で起動します
```

```
docker exec -itnuxt-sandbox bash
```

```
yarn create nuxt-app <project-name>
```
scheduleライブラリで定期的にTwitterの検索andいいね

# はじめに
今回はscheduleモジュールを使用して, Twitterにて定期的な処理を自動的に実行できるようにしていきます. 

#scheduleモジュール
まずは, インストールしましょう. 

```python
pip install schedule
```

[公式ドキュメント](https://schedule.readthedocs.io/en/stable/)を参考にして使い方を確認しましょう. 

```python
import schedule
import time

# 実行したい処理
def job():
    print("I'm working...")

# 10分ごと
schedule.every(10).minutes.do(job)
# 1時間ごと
schedule.every().hour.do(job)
# 毎日10:30
schedule.every().day.at("10:30").do(job)
# 毎週月曜日
schedule.every().monday.do(job)
# 毎週水曜13:15
schedule.every().wednesday.at("13:15").do(job)
# 毎時17分
schedule.every().minute.at(":17").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)
```

まずはjob()関数の中で実行したい処理を設定します. 

```python
def job():
    print("I'm working...")
```

そしてschedule.every()で実行したいjobをライブラリに登録します. 
様々な時間単位で登録できるようですね. 

```python
# 10分ごと
schedule.every(10).minutes.do(job)
# 1時間ごと
schedule.every().hour.do(job)
# 毎日10:30
schedule.every().day.at("10:30").do(job)
# 毎週月曜日
schedule.every().monday.do(job)
# 毎週水曜13:15
schedule.every().wednesday.at("13:15").do(job)
# 毎時17分
schedule.every().minute.at(":17").do(job)
```
最後にschedule.run_pending()で登録したjobを実行しています. 1度の呼び出しで1度実行するので, while分でループさせて呼び出しています. 

```python
while True:
    schedule.run_pending()
    time.sleep(1)
```

#Twitterで定期的に検索andいいね
それではscheduleモジュールを用いて, Twitterの定期的な検索といいねを実装しましょう. 
今回は6時間ごとに「大谷翔平」と検索して, いいねをするという仕様にしています. 
Twitterの検索といいねに関しては, [こちら](https://qiita.com/pontyo4/items/4ef6c9cb8e15a01a3129)を参照してください. 

```python
# coding: utf-8
import tweepy
import time
import schedule

# 先ほど取得した各種キーを代入する
CK="Consumer Key"
CS="Consumer Secret"
AT="Access Token"
AS="Access Token Secret"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)

# 処理関数
def job():
    # 1ツイートずつループ
    for status in api.search(q='大谷翔平', count=50):
        tweet_id = status.id
        # 例外処理をする
        try:
            # いいね実行
            api.create_favorite(tweet_id)
        except:
            print('error')

def main():
    # 6時間ごと
    schedule.every(6).hours.do(job)


    while True:
        schedule.run_pending()
        time.sleep(1)

main()
```

#参考サイト
[【Python】scheduleライブラリで定期実行を実装してみよう](https://dev-aoyagi.hatenablog.com/entry/20190312/1552325273)
【視聴メモ】 Build Fast and Smooth Web Apps from Feature Phone to Desktop (Google I/O ’19)

この記事は Google I/O '19 のセッションの視聴メモです。
想定読者は自分なので正確性や網羅率には問題があるかもしれません。

---

## References

https://www.youtube.com/watch?v=w8P5HLxcIO4

Speaker(s): Mariko Kosaka

## Abstract

"レスポンシブデザイン"というものが何であれ近頃のほとんどのWebアプリケーションは小さい画面でタッチパネルも持たないフィーチャーフォンで使い物になりません。このセッションでは計算資源に乏しいそういった端末でも素早くスムーズに動くWebアプリケーションを実装するための懸念事項とチップスを紹介します。

## Contents

* 2019年から2021年の間に3億7000万台ものスマートフィーチャーフォンが販売されると見込まれている
* スマートフィーチャーフォンとは？
    * New Operation System - such as KaiOS
    * 最新のブラウザ
    * スクリーンは240px x 320 px
    * D-padで操作
* Proxx.app
    * 2019年のマインスイーパ
    * あらゆるデバイスで動くよ
    * マウス・キーボード・タッチ・d-pad・スクリーンリーダーで操作できる
    * 3Gでも5秒以下で表示され、60fpsのアニメーション
* コードは次の3つに分かれる → Game Logic / UI & State Services / Rendering
    * Game Logic は Web Worker で動いてる
    * 通信は Comlink で行っている
* ロードを早くするためにPuppeteerを用いて Build time Pre-render を行っている
   * 普通に Puppeteer でレンダリングした結果をindex.htmlにまとめてサーブしているっぽい
   * 結構簡単そう（下記のコード）

```js:build-time-pre-render
const browser = puppeteer.launch();
ocnst page = browser.newPage();
await page.got(`http://localhost:${port}/?prerender`);

const markup = page.evaluate(() => document.documentElement.outerHTML);

fs.writeFileSync("index.html", `<!doctype html>${markup}`);
```

### Graphics

* はじめはDOMですべて解決しようとした
  * テーブルにボタンを並べれば終わりでしょ？
  * CSSアニメーションを入れまくったら一つのセルをアップデートするだけでテーブル全体が再描画されてしまいパフォーマンス上の問題が発生した
* セルごとにレイヤーを分けた
  * レイヤーが多くなりすぎてそれはそれで問題になった
* Canvasで描画するようにした
  * 2つのCanvasを使用し、1つはバックグラウンドアニメーションでもう1つはゲームのアニメーションを表示した
  * `requestAnimationFrame` でブラウザの準備が整ったときに次のJSの処理を呼ぶ
* 詳しくはブログで
  * https://developers.google.com/web/updates/2018/09/inside-browser-part1
* アニメーションはSpriteイメージだが、生成はフロントで行っている
    * 生成されたイメージはIndexed DBに保存されている
* 実はDOMは残っている
    * ユーザーからの入力は見えないテーブルとボタンが取得している
    * opacity=0だがフォーカスはできる
    * ネイティブアクセシビリティをそのまま使えるので便利
    * ボイスオーバー機能すらほぼそのままブラウザのものを使える
* アクセシビリティに関しての詳細はこちら
    * https://web.dev/accessible
* デバイスがアニメーションに対応しているかどうかを見てWebGLアニメーションを使うかCanvasの静的な描画を使うかを分けている

### Input devices

* 主な操作は次の2つ → Open or Add Flag
* ダブルクリックはシングルクリックに遅れを生じさせるので採用しなかった
* フィーチャーフォンでアクセスした場合は数字キーで操作できるようにした

### Code splitting

* index.html は 20KB しかない
    * アニメーションは別ファイルで80KBほどある
    * すべて読み込まれたらアニメーションが再生されるが、その前からユーザーは入力できる
* Rollup を使ってファイルを分けている
* Webpackを使った場合、comlink.jsが2つに分かれてしまう
* index.htmlを小さくしたPR
    * https://github.com/GoogleChromeLabs/proxx/pull/337
* TravisCIでビルド後のファイルサイズを監視していた
* とにかく、はじめにいらない情報以外はすべてなくすことが重要

## Memo

* Puppeteer で build time Pre-render を行うという発想はなかった
* 実はDOMを残していてAccesibilityはブラウザ標準のものをそのまま使える → すごい
* 全体的にAccesibilityに対する努力がすごい
* なにげに19分30秒あたりのソースコードの行ハイライトするスライドのアニメーションがわかりやすい
docker-compose.ymlとDockerコンテナのPHPで環境変数を使用する

# はじめに

これは個人的な備忘録になります。

# docker-compose.ymlで環境変数を使用する

docker-compose.ymlがあるディレクトリ直下に、「.env」 を用意する。そのファイル内で定義した値を使用できる。

例えば、以下のように定義をした場合

```:.env
# REDIS関係
REDIS_PORT=6379
REDIS_PASSWORD=password
```
docker-compose.ymlでは、以下のように使用できる

```:docker-compose.yml
  redis:
    image: redis:alpine3.9
    command: redis-server --requirepass ${REDIS_PASSWORD}
    ports:
      - "${REDIS_PORT}:${REDIS_PORT}"
```

# dockerコンテナで環境変数を使用する

dockerコンテナ内で環境変数を使用する場合は、docker-compose.ymlで定義する。

環境変数を1個〜２個指定する場合は、「environment」で定義をする。
以下のファイルでは、DATABASE_HOST/REDIS_HOSTを定義している。

```:docker-compose.yml
  app:
    build: ./app
    env_file: .env
    environment:
      DATABASE_HOST: db
      REDIS_HOST: redis
    depends_on:
      - db
      - redis
    volumes:
      - ./data/html:/var/www/html
```

また、複数指定したい場合は、「env_file」として、環境変数を記載しているファイルを指定する。

この時に、「.env」ファイルを使い回すことで、環境変数を「.env」ファイルに集約ができる。

# PHPのコンテナでPHP.iniで注意点

PHP.iniでは、環境変数を使う、使わない、または有効にする変数の優先順位設定があります。

それが「variables_order」になります。デフォルトでは、「GPCS」となっていますので、環境変数は使えないです。

Dockerの環境変数が読み込めなくてハマりました。
「EGPCS」にすると、環境変数を優先して使ってくれます。

```:php.ini
; This directive determines which super global arrays are registered when PHP
; starts up. G,P,C,E & S are abbreviations for the following respective super
; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty
; paid for the registration of these arrays and because ENV is not as commonly
; used as the others, ENV is not recommended on productions servers. You
; can still get access to the environment variables through getenv() should you
; need to.
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
variables_order = "GPCS"
```

これでPHPのコード内で環境変数を使えるようになります。

```php
$redis = new Redis();
$redis->connect($_ENV['REDIS_HOST'], $_ENV['REDIS_PORT']);
```

コードだけではなくて、PHP.iniの中でも環境変数は使えるようです。

```:php.ini
memory_limit=${PHP_MEMORY_LIMIT}
```


# 参考文献

* [Environment variables in Compose](https://docs.docker.com/compose/environment-variables/)
* [Docker-Compose の変数定義について](https://qiita.com/kimullaa/items/f556431b8103e686f356)
* [参考文献:Use Environment Variables for php.ini Settings in Docker](https://dracoblue.net/dev/use-environment-variables-for-php-ini-settings-in-docker/)