OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeのフォントVer1.40対応（2019/11/09暫定版）

(2019/11/14追記)
コメントより、今回の原因を記載


###そーす
先駆者様のほぼコピペになりますm(_ _)mｱﾘｶﾞﾀﾔｰ

VSCodeのver1.40アップデートで、フォント設定が効かなくなる問題と回避方法メモ(2019/11/08時点)
https://qiita.com/Amagawa/items/32117bd202d8f53f71fe


##フォント設定

~~日本語が薄っぺらくなったので違和感を持ったら1.40のバージョンでの不具合？だったので、自分の設定を載せておく。~~
monospaceで適応されるフォントがメイリオからMS ゴシック変わったのが原因との事。

```settings.json
//解１
"editor.fontFamily": "Consolas,'Courier New'"

//解２
"editor.fontFamily": "Consolas, Meiryo, 'Courier New', monospace"
```

解１は以前のようにフォールバックする方法。
解２はMeiryoを優先させて記載する方法。

解２の場合はConsolasを先頭に入れておくと日本語は未対応なので、次に記載してあるMeiryoが適用され、英文はConsolas、日本語はMeiryo表示になる。らしい。


なので、これで1.40前とほぼ同じ感覚で出来るﾊｽﾞ。
が、Gitの方でも賛否両論らしいので当分はこのままにしておこうかなと思います。

~~VSCodeは神格化してただけに今回の件はちょっと残念だった。南無三！~~
BINGO「Webツール」の抽選機のみ(デザインなし)を作成する。

-- 目次はこちら。[PythonでBINGOの「Webツール」をつくる](https://qiita.com/wacky3/items/ab684c40c80de08b1c50)
-- 記事作成：2019年12月、訂正：2020年6月

## BINGO抽選機の作成
インターネット上で検索すると、PythonでBINGO抽選機を作るというお題はPython初心者にとって分かりやすいようで、各種方法は検索してください。

### BINGO「Webツール」の抽選機ロジック概要
今回の方法は次の通りです。
1. 抽選結果を入れるリスト変数を定義。初期値に0を入れておきます。
2. 抽選はnumpyライブラリのrandom.rand()*75 で 0〜74 の一様乱数を取得し、１追加します。標準のrandomでも良かったのですが見本が使ってたので使ってみました。
3. 抽選した数字が、抽選結果のリスト変数にあれば、再抽選します。
4. 抽選した数字が終戦結果のリスト変数になければ最後尾に追加します。
5. 抽選結果のリスト変数の項目数が76になれば抽選はしません。

### BINGO「Webツール」の結果表示について
最新の抽選結果は、抽選結果リスト変数の最後尾を表示する。
全抽選結果はそのまま抽選結果リスト変数を表示する。

### BINGO「Webツール」のソースコード（基本）
BINGO「Webツール」のソースコードはWeb側のデザインを全く配慮していません。
仕上げの段階で、jinja2の使用方法も合わせて修正したいと思っています。

```python:main.py
from flask import Flask
import numpy as np

app = Flask(__name__)

bingo_num = [0]
max_bingo_ball = 75


@app.route('/')
def index_page():
    name = "Hello BINGO World!!"
    return name

@app.route('/ball')
def ball():
    new_ball_num = bingo_num[-1]
    name = str(new_ball_num)
    return name

@app.route('/list_ball')
def list_ball():
    list_ball_num = bingo_num[:]
    name = str(list_ball_num)
    return name

@app.route('/get_ball')
def get_ball():
    global bingo_num
    if len(bingo_num) == max_bingo_ball + 1:
        name = "MAX"
        return name
        
    while True:
        get_bingo_ball = int(np.random.rand()*75)+1
        if get_bingo_ball in bingo_num:
            continue
        else:
            bingo_num.append(get_bingo_ball)
            break
    name = '<head><meta name="refresh" content="0;/ball"></head>'
    return name


## おまじない
if __name__ == "__main__":
    app.run(debug=True)
```
### 動作確認

今回、numpyを使用するようにしたため、このままではエラーがでます。
`pip install numpy`で追加インストールをしています。

・ main.pyの実行
windowsのコマンドプロンプトを開き、BINGOのソースを保存してるフォルダまで移動します。
その後、`python main.py`で実行します。ソースに入力ミスやインデントミスなどがあるとエラーで終了します。

エラーなく実行できると、Webブラウザから動作確認が可能になります。
今回は、/ball, /ball_list, /get_ball が想定通り動作するかを確認します。

・ 実行後のソースの修正
編集の初期値を修正するなどしてソースファイルを保存すると、Flaskは自動でリフレッシュして内容を反映してくれます。

修正ミスでエラー停止する場合は、再度コマンドプロンプトから実行をします。
その場合、途中で生成した抽選結果は残っていないため最初から実施します。
（今後ビンゴカードのプログラムを作成するときには、結果を保存しておかないと大変なことになりそうです）

次回は、[ビンゴカードの作成します。](https://qiita.com/wacky3/items/0523f5e749e1dde8de6d)
その後、ビンゴカードの入力、判定、作成についてです。

-- 目次はこちら。[PythonでBINGOの「Webツール」をつくる](https://qiita.com/wacky3/items/ab684c40c80de08b1c50)
コーディングなしで誰でも機械学習できるTeachable Machine！

#コーディングなしで誰でも機械学習ができるTeachable Machine！
2019年11月7日にTeachable Machineというものがアップデートされたという記事を見つけました。
>https://thenextweb.com/artificial-intelligence/2019/11/07/google-updates-teachable-machine-so-you-can-train-an-ai-without-code/

「誰でも機械学習できる！コーディング不要！」果たしてそんなものがもうリリースされているのかと疑問に思いながら見てみました。
## Teachable Machine とは
>Teachable Machine is an experiment that makes it easier for anyone to explore machine learning, live in the browser – no coding required.
...
The experiment is built using the TensorFlow.js library.
...
>>https://github.com/googlecreativelab/teachable-machine-v1

機械学習はTensorFlow(JavaScript)によって構築されているようです。
>https://www.tensorflow.org/js/

## 遊び方
最新版はこちら
>https://teachablemachine.withgoogle.com/

初期リリース版はこちら
>https://teachablemachine.withgoogle.com/v1/

「New Project」を押すと、3種類の機械学習が選べるようになっています。

- Image Project
    - ファイル/Webカメラによる画像をデータとして与えることで、二値分類ができます。
- Audio Project
    - ファイル/マイクによる1秒の音声データを与えることで、二値分類ができます。
- Pose Project
    - ファイル/Webカメラによる画像をデータとして与えることで、二値分類ができます。


<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Really excited to share that we launched a new version of <a href="https://twitter.com/hashtag/TeachableMachine?src=hash&amp;ref_src=twsrc%5Etfw">#TeachableMachine</a> today! It&#39;s a fast easy way to train machine learning models on-device, in your browser. You can now save models for your projects, use sound/pose, and more. Try it out → <a href="https://t.co/vrTrUAeYJ5">https://t.co/vrTrUAeYJ5</a> <a href="https://t.co/CTkLXHuWbd">pic.twitter.com/CTkLXHuWbd</a></p>&mdash; Alexander Chen (@alexanderchen) <a href="https://twitter.com/alexanderchen/status/1192525764316606464?ref_src=twsrc%5Etfw">November 7, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


二値分類以外の詳細な分析を行いたい場合は、しっかりとコードを書く必要がありそうですね。「機械学習とは何か」、「機械学習に触れてみたい」という方は遊んでみるといいかもしれません。
頻度論（頻度統計）についてざっくり説明してみた

#　頻度論（頻度統計）についてざっくり説明してみた

##　 頻度論とは
　頻度論とは（ものすごくざっくり説明すると）**観測されたデータに基づいてのみ**確率を推定する方法論です。例えば、コインを一回トスして表が続けて5回出てその時点で実験を終了した場合、このコインの表が出る確率は100％であると推定します。推定された確率のことを仮説頻度と呼びます。仮説頻度が決めた場合、今後観測するデータはその頻度に沿った結果になる予想されます。

##　ベイズ統計との違いについて
　ベイズ統計ではあらかじめ観測する事象がどの分布に属するかを仮定した上で観測データを検証します。コインの場合裏と表がでる確率はそれぞれ0.5であると仮定して観測データとのズレを考えます。

##　仮説頻度の問題点
　上記の例のように観測されたデータによっては非常に偏りのある結論を出してしまうことがあります。逆に言えばデータ次第でベイズ統計と全く同じ結論を出す可能性もあります。頻度論において**確率とはのそ中で最も起きる確率が高い仮説頻度**と言えます。これは頻度統計が内包する問題の一つ、頻度を用いて確率を定義するには確率の定義が必要になるという事です。
初心者の私がLaravel＋Vue.jsでSPAを作るときのCSRFトークンでつまずいたこと

## はじめに
Laravel＋Vue.jsでSPAを作るときのCSRFトークンの扱いについてつまずいたので設定方法や原因を私なりにまとめました。
もっと良い方法がある、この方法だとこれがだめ、といったことがありましたら指摘いただければ幸いです。


## 環境＆前提
- Laravel 5.8
- 認証機能はLaravel標準を使用
- Vue.js 2.6.10 
- **axios**でAPIを叩いてPOST

## 設定方法
結論から言うと、今回の私の環境や前提では**特に何もしなくてよい**でした。

前提通りなら特に設定は不要で、axiosがCookieからCSRFトークン(を暗号化したもののようです)を取得して送信してくれます。

日本語のドキュメントにも書いてありますね…
https://readouble.com/laravel/5.8/ja/csrf.html#csrf-x-xsrf-token
>いくつかのJavaScriptフレームワークや、AngularとAxiosのようなライブラリーでは、自動的に値をX-XSRF-TOKENヘッダに設定するため、利便性を主な目的としてこのクッキーを送ります。

私はこれを知らず、余計なことをしたためにハマりました。。。

## 私がハマったこと
### 状況
ログイン直後にフォームからPOSTすると、CSRFトークン不一致のエラーになる。
画面をリロードすると正常にPOSTできる。

### やったこと(誤っていた設定)
https://readouble.com/laravel/5.8/ja/csrf.html#csrf-x-csrf-token
上記を参照して以下2点を行いました。

1. headタグ内にCSRFトークンを埋め込む
```<meta name="csrf-token" content="{{ csrf_token() }}">```

2. `resources/js/bootstrap.js` を読み込む
このファイルに以下のような記載があって、これでmetaタグのトークンをaxiosのヘッダに埋め込んでいるようです。

```javascript:resources/js/bootstrap.js
let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
```

### トークン不一致の原因
フロント側のCSRFトークンが更新されず、サーバ側が持っている値と一致していないためでした。

それぞれ、以下のような状態です。
- フロント側：ログインしてもHTMLが再読み込みされるわけではないので、headタグ内のCSRFトークンの値は更新されない
- サーバ側：ログインによってトークンが更新される
※Laravel標準の認証機能だと、サーバ側のトークンがログインのタイミングで更新されるようになっていました


### 何もしないでもトークンを送ってくれるんじゃないの？
となるんですが、実際axiosはCookieから取得したトークンを送ってくれていました。
ただ、Laravel側で参照するトークンの優先順位があり、headタグ内に埋め込んだほうの更新されてないトークンが参照されていたためにエラーとなっていたようです。

## LaravelのCSRFトークンの参照の優先順位

優先順位はこうなっています。
　高：HTMLのheadタグに埋め込まれた`X-CSRF-TOKEN`の値
　低：Cookieから取得した`X-XSRF-TOKEN`の値（axiosが自動で送信してくれる値）
なので、どちらも送られている場合は`X-CSRF-TOKEN`の値が参照され、不一致エラーとなっていました。

こちらのブログの図が非常にわかりやすかったです。ありがとうございます。
http://shirangana.omaww.net/laravel52/laravel%205.2%20csrf%20token%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF

なお、ドキュメントでこの優先順位について記載がなかったので、`VerifyCsrfToken`クラスを確認したところそれらしいメソッドがありました。


```php:VerifyCsrfToken.php
protected function getTokenFromRequest($request)
    {
        $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

        if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
            $token = $this->encrypter->decrypt($header, static::serialized());
        }

        return $token;
    }
```


そもそも環境によって使い分けるべきなので優先順位とかは本来あまり関係ないのだろうなと思いました。
（更に言うと初めからソースを参照していればそんなに悩まずに済んだかも…！）
zshで補完機能


-　MACの最新のOS Catalinaはzshがデフォルトのようです。
-　補完機能のやり方を教えてもらいました。

```terminal
[~:] % emacs -nw .zshrc #emacsからzshrcを作成　zshrcは規定された名前
[~:] % emacs .zsh_hist  # zsh_histでヒストリーの内容をどこに保存するか設定するファイル
[~:] % ls -a　#隠しファイルも表示するlsコマンド
```

補完機能を設定するために以下のコードをzshrcに設定

```terminal
### Lines configured by zsh-newuser-install
export LANG=ja_JP.UTF-8 #文字コードをUTF-8に設定

# プロンプト設定
PROMPT="%F{cyan}[%~:%n]%f %# "

#大文字小文字を区別しない補完
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# history
HISTFILE=/Users/paraizo2424/.zsh_hist
HISTSIZE=1000
SAVEHIST=1000
setopt extended_history #ヒストリに実行時間も保存

# コマンドのスペルを訂正する
#setopt correct

# <Tab>でパス名の補完候補を表示したあと、
# 続けて<Tab>を押すと候補からパス名を選択することができるようになる
zstyle ':completion:*:default' menu select=1

autoload colors
zstyle ':completion:*' list-lolors "${LS_COLORS}"

#エイリアス
alias emacs='emacs -nw'

#railsを動かすために必要??
#http://railsgirls.jp/install#setup_for_macos
#エラーが出るのでコメントアウト
#'eval "$(rbenv init -)"'

#ProgateのNode.jsのインストール
#https://prog-8.com/docs/es6-env
export PATH=$HOME/.nodebrew/current/bin:$PATH

#Progateのrbenvについて追加事項
#https://prog-8.com/docs/ruby-env
#上記がbash用なのかうまくいかないので
#こっちのサイトを参考に入れるhttps://qiita.com/seijikohara/items/79b479c9dd2e3b950301
export PATH="$HOME/.rbenv/bin:$PATH" 
eval "$(rbenv init - zsh)"

fpath=($(brew --prefix)/share/zsh/site-functions $fpath)

autoload -U compinit
compinit -u

###end
```
[参考:MacOS「Catalina」とともにbashからzshへ乗り換え。zsh設定手順からおすすめ設定もろもろまとめ](https://creepfablic.site/2019/10/13/bash-zsh/)
AWSomeday@大阪 セミナーメモ

# 概要
2019/11/07 AWSomeday@Osakaのセミナーメモです。

## AMI
アミとも読む。マシンイメージのこと。VMでいう、動いている仮想環境本体。
ルートボリュームのテンプレート。複数回デプロイしなおす事が可能。
例：メンテ前にAMIのスナップショットをとる→メンテ→失敗→復元
みたいな事が可能

## AWSの費用について
### オンプレとAWSの比較
* オンプレ
 * DDOS対策
 * ソフトウェア関連費用（OS/DB/パッケージ
 * 代替機
 * 設備費用
 * 減価償却費

→５〜６年見越して調達しなければならない

* AWS
  * ソフトウェア関連費用（パッケージ）
  * クラウド利用料

→従量課金なので無駄のない投資が可能

### AWS利用料目安
例: 1Hあたり1.1円→5年：5万円（バックアップもしたら、7万円くらい）
インスタンスがLinuxのエントリーモデルの場合

### コスト削減事例
DWH構築
オンプレ：1年
  納品→取付→OS/MWインストール
AWS：1か月
  ポチポチやるだけ。

### AWSの利用料の一般的な内訳

70%：EC2
20%：RDS（MSSQL、Oracle、MYSQL他）
10%：サポート、通信、S3（EC2とRDSのバックアップ）

→EC2の利用料が大半を締める場合がほとんど。

## AWS設計指針
運用するんなら、以下を決めないといけない。
・RTO　目標復旧時間
・RPO　データ喪失許容時間
・バックアップの間隔、世代

## VPC(Amazon Virtual Private Cloud)

 * 仮想ネットワーク空間の制御ができるサービス。IPアドレスの範囲指定などを行う。

 * ルートテーブルのルーティング設定（設定必須）
    *  パブリックサブネット　：WordpressなどWebサーバー
    *  プライベートサブネット：DBサーバーとか

 * オンプレと同様の構成が可能
 * EC2を使ったら、1個は必ずついてくる。
 * 利用料0円


##  リージョン
地理的ロケーションのこと　日本なら、東京
2019/11時点で、世界で22リージョンある
大阪は単一のDCで構築されたリージョンで、ローカルリージョンと呼ぶ。
最低2台のAZで構成される
東京だと4AZ

## アベイラビリティゾーン(AZ) 
２〜３のデータセンター（建屋）をネットワークでつないでクラスター化にしたもの。
2019/11時点で、69のAZがある。
自然災害によって、リージョン全体が死ぬことを防止するため（冗長性を確保するため）にある。
個々のAZはそれぞれ分離している。

任意のAZにEC2をデプロイする事が可能。
複数のAWSリージョンおよびAZにまたがったデプロイも可能。

## EC2
データセンター(DC)のラックの上に、仮想サーバーが立ち上がるというサービス
キャパ(CPUの数/メモリ容量)を拡大/縮小可能
CPUの数/メモリを選んで立てる。起動後にも拡張可能。

## インスタンスタイプの読み方
例：C3.8xlarge
C:インスタンスファミリー
3:世代
8xlarge:サイズ（CPUとメモリのサイズ）

## タグ
以下のような情報を管理

 * サーバーの名前
 * 運用部署
 * サーバーの管理者
 * インスタンスの用途(開発/検証/本番)

# AutoScaling
サーバーの負荷や消費リソースに応じて、自動で追加サーバーをデプロイや削除してくれる機能
最大、最小で何台のインスタンスを作る、といった設定が可能

## AMAZON Cloudwatch
EC2の負荷などの状態を知らせてくれるサービス

## ロードバランサー
負荷状況をCloudWatchに送る役割を果たす
複数のインスタンスにトラフィック/パケットを分散する

 * ALB
アプリケーション層
HTTPS HTTPのロードバランシング

 * NLB
ネットワーク層
　　
 * CLB
古い。使わない。

# オートスケールの実施例
ECサイトのセール期間中に、サーバーを自動で20台に拡張し、セールが終わればまた10台に戻る。

ロードバランサー：「負荷増えたよ！」
Cloud Watch：「ほんとだね！AutoScalingサーバー増やしてよ！」
AutoScaling：「了解！サーバー増やします！」

といった具合で、3つのサービスを組み合わせて使う。

## 質疑応答
### Q:AWSのCLIでは何ができるの？
コンソールでポチポチやってる事をコマンドでできる。コンソールでできない細かい設定なども可能。操作のログを残すために使ってる人も。MACならターミナルにインストールして実行する。


### Q:EBSとS3の違いは？
OSから直接読み込めるのがEBS。S3はオブジェクトストレージ。ファイルを置く事は出来るがOSからは直接読み込めない。(EBSに読み出ししないといけない

### Q:AMIとスナップショットの違いは？
AMIは動いているサーバのマシンイメージ。VMで言う、動いてる仮想環境本体。
それをバックアップとして取得したのがスナップショット。
Optional Chaining と nullish coalescingメモ

TypeScript 3.7から使えるようになった、
Optional Chaining と nullish coalescingの動作確認メモです

http://www.typescriptlang.org/play/ に貼り付ければ動作確認ができます。

[リリースノート](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html)


### Optional Chaining

``` .ts
class Foo {
    bar?= {
        bazz: 'bazz'
    }
}

const foo = new Foo()

// Optional Chaining

foo.bar.baz  // ←barがundefinedの可能性があるため、これはコンパイルエラーになる

// 今まではこう書いていた
const a = foo.bar && foo.bar.bazz
// こうかけるようになる
const _a = foo.bar?.bazz
```

### nullish coalescing

```.ts
// nullish coalescing

const b = foo.bar || 'default'  // foo.barがundefindedだった時はdefaultにフォールバックする
const _b = foo.bar ?? 'default' // 上と同じ、ただし、foo.barが0や空文字のようなときにはフォールバックしない

// 例えば0に対する評価が以下のように変わる
const num = 0
const num1 = num || 1  // num1は1になる
const num2 = num ?? 1  // num2は0になる
```

コンパイル後の生成コード(ES2017で出力)

```.js
"use strict";
var _c, _d;
class Foo {
    constructor() {
        this.bar = {
            bazz: 'bazz'
        };
    }
}
const foo = new Foo();
// Optional Chaining
foo.bar.bazz; // ←これはエラーになる
// 今まではこう書いていた
const a = foo.bar && foo.bar.bazz;
// こうかけるようになる
const _a = (_c = foo.bar) === null || _c === void 0 ? void 0 : _c.bazz;
// nullish coalescing
const b = foo.bar || 'default'; // foo.barがundefindedだった時はdefaultにフォールバックする
const _b = (_d = foo.bar, (_d !== null && _d !== void 0 ? _d : 'default')); // 上と同じ、ただし、foo.barが0や空文字のようなときにはフォールバックしない
// 例えば0に対する評価が以下のように変わる
const num = 0;
const num1 = num || 1; // num1は1になる
const num2 = (num !== null && num !== void 0 ? num : 1); // num2は0になる

```
Windows互換のReactOSを仮想環境で動かした話

#はじめに
こんにちは。PyLocです。
今回は、Windows互換のオープンソースOS、「ReactOS」をVirtualBoxでうごかします。
#ReactOSとは
公式サイトによると、
>Imagine running your favorite Windows applications and drivers in an open-source environment you can trust. That's ReactOS. Not just an Open but also a Free operating system. 

つまり、
>信頼できるオープンソース環境でお気に入りのWindowsアプリケーションとドライバーを実行することを想像してください。それがReactOSです。 Openだけでなく、無料のオペレーティングシステムでもあります。 byGoogle翻訳

という意味です。
間違えないでほしいのは、このOS、Linuxじゃないんです。Windowsにとても近いです。
早速、インストールしましょう。
#ReactOSの入手
[https://reactos.org/download](https://reactos.org/download)でBootCDをダウンロードできます。
#VirtualBoxのセット
VirtualBoxを開き、「新規」をクリックし、名前に「ReactOS」と入力して、「作成」を押し、仮想マシンを作成します。
次に、「ReactOS」をダブルクリックして開き、ポップアップが出てくるので、ダウンロードしたisoファイルを選択して、起動します。
#インストール
青い画面が出てくるので、「Japanese」を選び、エンターを何回か押して画面の指示に従います。基本的に変える必要はありません。
#やったー
あなたはReactOS使いになることができます!!
docker-composeを使ってサクッとローカルにHackMDを構築する

個人的に最近よく使っている[HackMD](https://hackmd.io/)をローカルでいじったり使えるようにする。
HackMDは[Github](https://github.com/hackmdio/codimd)上でオープンソースとして公開されている。

記事にするほどでもないけどメモとして。


すでに用意されているリポジトリをcloneする。

```bash
git clone https://github.com/hackmdio/docker-hackmd.git
```

立ち上げるだけ。（ローカルにDockerが立ち上がっている前提）

```bash
cd docker-hackmd/
docker-compose up -d
```

http://localhost:3000/
![スクリーンショット 2019-11-09 14.57.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/3dea6ece-83be-67ab-dcb1-12143f10d25b.png)

なんてかんたんなんでしょう！
新しいトークンで vsce publish し直す

VSCodeの拡張を自作していると、たまに拡張を更新したくなることがありますが、アクセストークンが期限切れになっていがちです。

```
 ERROR  {"$id":"1","customProperties":{"Descriptor":null,"IdentityDisplayName":null,"Token":null,"RequestedPermissions":0,"NamespaceId":"00000r
000-0000-0000-0000-000000000000"},"innerException":null,"message":"Access Denied: The Personal Access Token used has expired.","typeName":"Micr
osoft.VisualStudio.Services.Security.AccessCheckException, Microsoft.VisualStudio.Services.WebApi","typeKey":"AccessCheckException","errorCode"
:0,"eventId":3000}
```

期限切れになっていると `vsce publish` しても上記のようなエラーが出ます。
更新のやり方をメモします。

まず Microsoft のアカウントを思い出しましょう。思い出したら

`https://dev.azure.com/XXXXXXXX/_usersSettings/tokens`

にアクセスしましょう。`XXXXXXXX` はあなたのアカウントのユーザー名です。

New Token で新しいトークンを作成します。

https://code.visualstudio.com/api/working-with-extensions/publishing-extension#get-a-personal-access-token

にある通り、

- 「Organization」を「All accessible organizations」に
- 「Scopes」を「Custom defined」に
- 「Marketplace」で「Acquire」と「Manage」を選択

します。これで、新しいトークン `YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY` が表示されるので、

```
vsce publish -p YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
```

で vsce publish し直すことができます。  
もし、ターミナルに直打ちするのはshellの履歴に残るから嫌だ！！！！！という場合は、

```
vsce login [ユーザー名]
```

まずこうします。

```
Publisher 'XXXXXXXX' is already known
Do you want to overwrite its PAT? [y/N] y
Personal Access Token for publisher 'XXXXXXXX':
```

と聞かれるので、新しいトークンを入力すればログインし直せます。そうしたら改めて `vsce publish` です。
【Python中級者への道】独自クラスにinを定義する



# まとめへのリンク

https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8

# はじめに

Pythonの勉強をするために、[acopy](https://github.com/rhgrant10/acopy)という群知能ライブラリを写経していました。

acopyでは、多くのPythonの面白い文法・イディオムが使われており、その中でも便利だなぁというのをまとめています。


今回は、クラスのインスタンスにinを利用できるようにします。


# `__contains__`

クラスには、`__contains__`という特殊メソッドを定義することができます。

`__contains__`メソッドを定義すると、ある値`item`がクラスに含まれるか？というのを簡潔に`in`演算子で表現することができます。

# 具体例

まずは、`__contains__`がないバージョンを見てみます。

```py
class A:

    def __init__(self, x):
        self.arr = list(range(x))


'''
Yes
No
'''
a = A(10)
print(("No", "Yes")[3 in a.arr])
print(("No", "Yes")[23 in a.arr])
```


今回適当に、クラスAを定義し初期化で受け取った$x$を利用して
`[0, x)`のリストを作成しています。

ここで、$3,23$がそれぞれインスタンスaに含まれているか？を調べるために、`[3 in a.arr]`というコードを書いています。
これによって、インスタンスaのarrという配列に、3が含まれますか？というのを調べることができます。



しかし、もしクラスでこのような**包含関係**を調べるのがarrのみ！　といった一個しか無いなら`__contains__`を定義すればより直感的に表記できます。


```py
class A:

    def __init__(self, x):
        self.arr = list(range(x))

    def __contains__(self, item):
        return item in self.arr


'''
Yes
No
'''
a = A(10)

print(("No", "Yes")[3 in a])
print(("No", "Yes")[23 in a])

```

先程のソースコードと異なり、`__contains__`メソッドを定義しました。
このメソッドでは、`item in インスタンス`で与えられる`item`を引数とし、このitemを含んでいるか？を返してあげればよいです。


# 最後に

あまり嬉しさがないメソッドのような気がしますが、大規模なコードを書くときは役に立つかもしれません。
ちょっと自分はまだあまり具体的な嬉しいポイントがわかってないです･･･
【WSL2】Windows10でLinuxを動かしてVSCodeで開発する【Mac買えなくても大丈夫】

# wsl2 インストール方法
> 参考:https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install

1. https://insider.windows.com/en-us/ からインサイダーになる
2. 管理者権限で開いた`Windows power shell`から以下コマンドを入力して設定を有効にする

```bash
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
wsl --set-default-version 2
```

3. ubuntuを[storeから](https://www.microsoft.com/store/productId/9N9TNGVNDL3Q)インストールする
1. ubuntuを起動してしばらく待ち、successfulとでたら完了

# VScodeでの開発環境を作成
> 参考:https://code.visualstudio.com/blogs/2019/09/03/wsl2

1. VScode を[インストール](https://code.visualstudio.com/download)
2. Remote-WSL拡張機能をVScode上から[インストール](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)
3. 作業ディレクトリに移動して以下コマンドでVScodeが起動する

```
code .
```

VScodeのターミナルからはWSL2がさわれるので、あとはここから自由にやれます

# おまけ
- reactアプリを作成して、firebaseでデプロイする
    - nodejsの[最新版をインストール](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)
    - yarnを[インストール](https://yarnpkg.com/lang/ja/docs/install/#debian-stable)する
    - `cmdtest`をアンインストールしないと、インストールや実行でエラーが発生する場合がある
        - `sudo apt remove cmdtest`
    - [『5秒』でTypeScript + React アプリを作り『5分』で全世界に公開する](https://qiita.com/Ikko_Kojima/items/28c9b913b7d5723411b3)
LaTeX で動的に単語数をカウント

`texcount` コマンドで単語数をカウントできる。

```bash
$ texcount main.tex
```

単に総単語数のみを出力させるには、下記のオプションをつける。

```bash
$ texcount main.tex -inc -sum -1
```

さらに、この機能を`bashful` パッケージを用いて文書内で動的に行う。

```tex
\documentclass{article}
\usepackage{bashful}

\bash
texcount main.tex -inc -sum -1
\END
\let\WordCount\bashStdout

\begin{document}

\section{Dynamic word counter}

This document has {\WordCount} words.
\end{document}
```

- `\bash ... \END` の中にシェルスクリプトを書くと、コンパイル時に実行される。結果が `\bashStdout` に格納されるので、これを `\WordCount` という別の変数に定義し直している。`\bashStdout` を直接用いても良いが、その場合別のシェルスクリプトを実行すると値が上書きされてしまう。`\let`による評価はその場で行われるため、`\WordCount`に格納された値は `\bashStdout`の値が変更されても保存される。
- `\bash ... \END` は `\begin{document}` より前に書くと良い。後ろに書くと、そこも文書内とみなされて、シェルコマンドの単語数もカウントされる。

ただし、シェルスクリプトの実行は危険を伴うので、コンパイル時に `-shell-escape` オプションを追加して明示に許可する必要がある。

```
$ latex -shell-escape main.tex
```


出力結果：
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80588/9bb66660-e216-5e4b-9c91-b43a725cd943.png">

例（Overleaf）： [word count test](https://www.overleaf.com/read/tdtfvwgrsqpj)
Railsでポートフォリオを作ってみよう！ vol.3 (RSpec・FactoryBot編 前編)

前回、データベースの作成とUsermodelの作成を行った。
また、Usermodelに入ってくる情報に対するバリデーションも作成したのが前回までのあらすじ。
今回はバリデーションという機能が正しく実装されたことを確認するために、「テスト」と呼ばれるものを作成していきたい。
#テストとは
>製作したアプリケーションが正常な動作を行なっているかの確認を行うこと

となっている。
テストを書くことによりバグやエラーを本番環境に落とす前に気づくことができる上に、リファクタリングの難易度も大きく下がることになる。
また、一言にテストと言っても、どういうタイミング(テスト駆動・一括テスト)で書いたほうが適しているか等、複雑な状況があるので詳しくはRailsTutorialの第3章の「テストから始める」を参照にしてみると良いかもしれない。
[RailsTutorial(テストから始める)](https://railstutorial.jp/chapters/static_pages?version=5.1#sec-getting_started_with_testing)

上記URLの通り、RailsTutorialではrailsを作った際に一緒についてくる「minitest」と呼ばれるものを使用してテストを行うが、今回はより実践的にするために「RSpec」を使用してテストを作成していく。

#RSpecとは

Ruby用に作成されたテスティングフレームワークのこと。
人が行うようなバグの発見などの作業を全て自動化してくれるすごい奴。(ただしテストコードは全部人が書くけど・・・)
ちなみにRSpecのRはRuby、Specはテストコードの事であり、綴りはSも大文字表記であることに注意。
RSpec専用の参考書があるのでそれを参考に勉強してみるのも良い。
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)

#導入

Gemfileに以下のgemを導入する。
導入した後には```bundle exec```を行う。

```Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'rails-controller-testing'
end

#以下gemは後ほど導入する
group :development do
  gem 'spring-commands-rspec'
end
```

##rspec-rails
RSpecの本体。これがないと何も始まらない。

##factory_bot_rails
テストデータの作成を行うgemの一つ。
RailsTutorialではuser.ymlにテストモデルを記入していたが、RSpecではfactorybotがそれの代わりになる。
少し前までfactory_girl_railsとしてあったが、問題があった為名前が変更された。

## rails-controller-testing
Rails5からは非推奨となっている```assigns```と```assert_template```を実行できるようにするgem。
余談だが、Rails5からはcontroller specは非推奨となり、新たにrequest specで記述することが推奨されている。
詳しくはEverydayRailsにて
[Replacing RSpec controller specs, part 1: Request specs](https://everydayrails.com/2016/08/29/replace-rspec-controller-tests.html)

##spring-commands-rspec
RSpecのテスト実行スピードを上げるgem
このgemを導入したら bin/rails を使用せず -> bundle exec rspecを使用すること。

###ちなみに
今回の開発環境ではDocker-composeを使用して開発を行っている為、ここで一度コンテナをDownしないとgemがインストールされない事象に見舞われてしまうので注意が必要。
ただ、Docker-composeを使っていない人はいつも通りサーバーを再起動すればよい。

#実行
###DBを作成する
導入が完了したら```bin/rails db:create:all```を叩きDBを作成する。
もしここでDBが無いよエラーが発生したら```config/datebase.yml```内の以下の文があるか確認する。
無いようであれば追加する。

```datebase.yml
#SQLiteを使っていれば以下の文を確認
test:
  <<: *default
  database: db/test.sqlite3

#MySQLまたはPostgreSQLを使っていれば以下の文を確認
test:
  <<: *default
  database: projects_test
```

###RSpecをインストールする
DBの作成が完了したら以下を叩く

```
bin/rails generate rspec:install
```

叩いたら
```.rspec``` 
```spec``` 
```spec/spec_helper.rb``` 
```spec/rails_helper.rb```
の4つが作成されるのでまず.rspecを開き

```.rspec
--require spec_helper
--format documentation <-この一行を追加する
```

```--format documentation```はRSpecからの出力をドキュメントに変更している。
必須事項では無いが、スペックがパス or エラーしたかがわかりやすい形式で出力されるため記入している。

###spring-commands-rspecの導入
```group :development``` にspring-commands-rspecを導入する。
bundle installも忘れずに。

これで導入は終了。
本当に入っているかどうかはわからない為、一度```bin/rspec```を打ちRSpecが走れば実装完了。
次回からテストの実装を行う。
[AWS IoT] MQTTでjsonデータをpublishしたことをトリガにDynamoDBにjsonデータを格納する方法

# はじめに
ここでは、AWS IoTを用いて、自宅にあるIoT機器からの情報をAWSクラウドを通じて何かシステムを構築できないかな。と思い、1つひとつAWSクラウドの勉強したときのノウハウをまとめています。備忘録としてまとめているので、誤りがありましたのでご指摘ください。

今回は、
#### [AWS IoT--->DynamoDB]のデータ保持方法
についてです。
実際は、IoT機器からデータをクラウドにuploadする想定です。
まずは、「クラウド上にデータが届いてから保持する」箇所を作成します。

## 事前準備
・今回取り扱うデータを何にするか。
・どのような形式で通信を行うか。
を決めます。
取り扱いデータは以下の5つとします。
(1)管理ID
(2)時刻
(3)デバイスバージョン
(4)デバイスID
(5)デバイス種類
通信方式は、MQTTを用いてjsonフォーマットとします。
⇒以上を踏まえて、以下のようなjson形式としました。

```sh
{
	"id" :"1",
	"time" : "20191109120010000",
	"data" :{
		"ver" : "01.01.001",
		"deviceId" : "12345",
		"kind" : "temperatureSensor"
	}
}
```
MQTTの概要については省略します。

## AWS上で各サービスを作成する

### DynamoDB
　DynamoDBのページで、以下のテーブル作成画面にアクセスします。
<img width="958" alt="DynamoDB1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/d4ed0b65-24d6-8972-7a69-50cc872c956c.png">
以下のように、テーブル名を定義し、プライマリキーとソートキーを記入し、テーブルを作成します。
<img width="959" alt="DynamoDB2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/5e4bd814-b63e-d75c-c053-ce892a766dbe.png">

### AWS IoT
 AWS IoTのページにアクセスし、ACTを選択、IoTのルールを生成します。
 ここで定義したルールに基づいて、AWS IoTにMQTTでpublishされたときに
発火するイベントを決めます。
<img width="960" alt="IoTCore1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/d2ed1304-8034-b19f-e6d2-707ffa13e4ab.png">

ルールの作成にて、任意のルール名を決めます。
<img width="956" alt="IoTCore2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/dc346040-1254-edea-6089-d30dd4816fdd.png">

ルールクエリステートメントに下記のようなSELECT文を記載します。
<img width="958" alt="IoTCore3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/5cca2703-c247-61ad-85f3-3512d85b15cd.png">

```sh
SELECT id, time, data.ver AS version, data.deviceId AS deviceID, data.kind AS kind FROM 'iot/topic'
```
MQTTのトピック(iot/topic)にjsonデータがpublishされると、
このルールに基づいてイベント発火します。
jsonデータをselectして次に定義するアクション(AWSサービス)に連携されます。
(入れ子になっているjsonデータにはASを使用することで一意にパラメータを定めています。またMQTTのトピックはiot/topicと定義します)

次にアクションを定義します。　
ここではDynamoDBの複数列に対してデータを格納するため
以下のサービスを選択します。
<img width="960" alt="IoTCore4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/33e63a92-6cea-001c-eb3c-5c2b8bf5c454.png">

データベースには、上記で作成したDynamoDBのテーブルを指定します。
アクションの設定で、新規にロールを作成します。
<img width="960" alt="IoTCore5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/ec7976b7-2838-774c-3d2f-173847cd0960.png">

次に、作成したルールの動作確認を行います。
AWS IoTのテストページにアクセスします。
画面下部の"発行"にMQTTのトピックにiot/topicを入力
発行するメッセージには、事前準備で記載したjsonデータを入力。
「トピックに発行」をクリックします。
<img width="956" alt="IoTCore7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/9693a7b0-6d88-a7ce-c259-c8a9c9d4640b.png">

最後に、DynamoDBのページにアクセスし、今回のテーブルに値が格納されていることがわかります。
<img width="959" alt="DynamoDB3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/03486adf-a01e-c6fd-c703-67673dfd0c72.png">

以上で、MQTTでjsonデータをpublishしたことをトリガにDynamoDBにjsonデータを格納することができました。
Git操作まとめ 〜Gitでのバージョン管理開始(git init)

この記事では、Ubuntu18.04LTSにインストールしたGit(version 2.17.1)を使用しています。

## リポジトリ作成

Gitのテストをするために、testGitというディレクトリを作成し、そのディレクトリに移動します。

```shell
mkdir testGit
cd testGit
```

次のコマンドを実行させると、testGitディレクトリのGitでのバージョン管理を開始することができます。

```shell
git init
```

このコマンドを実行したあとでtestGitディレクトリを、次のターミナルでコマンドを実行するか、もしくはNautilus("隠しファイルを表示する"にチェックを入れる)で確認します。

```shell
ls -la
```
```shell:実行結果
drwxr-xr-x 3 ooooooooo ooooooooo 8192 11月  9 14:47 .
drwxr-xr-x 5 ooooooooo ooooooooo 8192 11月  7 07:25 ..
drwxr-xr-x 7 ooooooooo ooooooooo 8192 11月  9 14:47 .git
```

注）実行結果の"ooooooooo"の中にはあなたのPCの情報が記されています。

.gitというファイルが確認できたら、testGitディレクトリが「リポジトリ」として設定されたことになります。

- 「リポジトリ」・・・過去の状態が記録される貯蔵庫のこと

---
### 本記事目次ページ
[Git操作まとめ](https://qiita.com/tsweblabo/items/6aec9d022c08954f5024)
【読書】コンピューターシステムの理論と実装を読んで

###「コンピューターシステムの理論と実装」

読んだ本のまとめと紹介です。

[コンピューターシステムの理論と実装](https://www.oreilly.co.jp/books/9784873117126/)

コンピューターサイエンスを学ぶ為に手に取りました。この本では、コンピューターが動く仕組みを理解し、実際にバーチャル上にコンピューターを作り上げて学ぶことができます。必要なツールなどはWebサイトに用意されています。この記事では、読んだ内容を要約し概要や大まかな流れなどを書いていきます。各実装の詳細はこの記事では書いていません。


目次：
１、学習計画
２、本の目次紹介
３、概要
４、コンピューターが実装される流れ

#１、学習計画
１、一通り読んで知識をインプット（知識が無さすぎて読みながらの実装は難しかった）
２、内容をまとめブログに書いてアウトプット
３、実装し、経験を通して知識・技術を身につける


#２、本の目次紹介
１章　 ブール論理
２章　 ブール算術
３章　 順序回路
４章　 機械語
５章　 コンピューターアーキテクチャ
６章　 アセンブラ
７章　 バーチャルマシン#１：スタック操作
８章　 バーチャルマシン#２：プログラム要素
９章　 高水準言語
１０章　コンパイラ#１：構文解析
１１章　コンパイラ#２：コード生成
１２章　オペレーティングシステム
１３章　さらに先へ
付録

本で学べる実装の流れとしては、
・コンピューターを構成するハードウェアの実装
（NANDという電子ゲート、論理回路、加算器、ALU、CPU）
・実装したハードウェア上で動くソフトウェアの実装
（アセンブラ、バーチャルマシン、OS、プログラミング言語など）

このように、コンピューター全体を構成する要素を実際に作ることによって、コンピューター全体の仕組みを理解できる構成となっています（なっているそうです）。

>本書は”発見の旅”である。本書によって、読者は次の３つのことを学ぶことになる。それは、「コンピューターの動く仕組み」「複雑な問題を扱いやすいモジュールに分割する方法」そして「ハードウェアとソフトウェアからなる巨大なシステムを開発する方法」である。

#３、概要

”Hello World”を表示する為には数行のコードを書けば表示することができますが、実際それがどのように実行されているのでしょうか。
コードを書いてからその裏でコンピューターがどのように動きているのか見ていきます。

プログラムはテキストファイルに格納された文字列のデータです。最初にすべき作業は、このテキストに書かれている構文を解析し、その内容を明らかにすること。
そして、それをコンピューターが理解できる低水準の言語に直す必要があります。その変換する作業が「コンパイル」と呼ばれます。

コンピューターが理解できる機械語とは何でしょうか。
その中身はある規則に基づくバイナリーコードの集合です。バイナリーコードは0と1の２進数で表現されるコードです。そのバイナリーコードは何らかのハードウェアアーキテクチャによって具現化します。
では、そのアーキテクチャはどのように実装されるのか。それはレジスタやメモリ、ALUといった回路集合が用いられます。さらにこれらにハードウェアデバイスは、集積されパッケージされた基本論理ゲートから構成されます。これらのゲートはNANDやNORなどのゲートから構築していきます。

このように、様々な実装が必要であると初めて読んだとき、コンピューターの奥の深さを実感しました。これ以上深く掘り下げると物理学の領域になる為、この本で扱うものはここまでとなっています。

#４、コンピューターが実装される流れ

>コンピューターシステムを支える抽象化の集合は、上位レベルの抽象化から、より単純なものへとトップダウン的に全体を捉えることができる。また、下位レベルの抽象化から、より複雑なものへとボトムアップ的な視点で捉えることもできる。

この本では、ボトムアップに実装していくことになります。

逆にトップダウンから（つまり私たちが実際にコーディングしたところから）見てみると、
まず頂上で高水準のプログラムを書き、それを実行する。その後ハードウェアの世界へ下り、高水準プログラム（私たちが書いたプログラム）が機械語へ変換される。最後に麓へたどり着き、一般的なハードウェアのプラットフォームが構成されている。

概要でも少し触れた内容ですが、より細かく流れを見ていきます。


##頂上：
####「高水準のプログラムを書き、それを実行する場所」
プログラミングをする際、「高水準言語」と「ライブラリ」という２つのツールを常用します。これらによってプログラミングし、文字などをディスプレイに表示できますが、それが実現されるのはOS（オペレーティングシステム）と標準言語ライブラリによってそのサービスが提供されているからです。では、そのOSはどのような仕組みで動いているのか。それは様々なアルゴリズム（数学ファンクション、文字列操作、メモリ配置、入出力（I/O)処理など）により完成されます。

##中間地点：
####「機械語への変換を行う場所」
概要でも触れましたが、変換作業は「コンパイル」と呼ばれます。このコンパイルを行う為にコンパイラ、バーチャルマシン、アセンブラという３つの変換器が関わっています。

コンパイラが行う変換作業：
#####１、構文解析
まず、ソースコードが解析され、意味的なグループ化が行われます。ここでの結果は「構文木」と呼ばれるデータ構造に格納されます。このパース作業が構文解析と呼ばれています。
#####２、コード生成
このパース木を再帰的に処理し、中間言語で書かれたプログラムを生成します。それがアセンブリコードです。このアセンブリコードはアセンブラによってバイナリコードに変換します。

##一番下:
####「ソフトウェアとハードウェアが交わる場所」
最下層では、Hackと呼ばれる汎用コンピュータシステム（ハードウェア）が活躍します。これは、様々な回路セットにより構成されます。コンピューターを設計する為に必要な基本的な原理や要素を兼ね備えています。
[AWSclient/sdk]Exceptionのerror-handle

php-Exception（try-catch構文）のお話し。
AWSclient/sdkのerror-handleで、プチはまりしてしまったので。。

Exceptionのerror-handleについて、サンプルコードを探していると
- `Exception`
- `AwsException`
- `SnsException`
- `S3Exception`
とかの使い分けを意識できてなかったので。
（モチのロンでしょ、って方には有意義なネタではないですので即終了で。ゴメンナサイ）

コード読み・試作した感じ、正しい実装例としては

```php:sample.php
use Aws\Sns\Exception\SnsException;
 
function wrap_publish($args)
    // ・・・
 
    try {
        $ret = $snsClient->publish($args);
    } catch (SnsException $e)
        $ret = false;
    }
    return $ret;
}
```
な感じです。
つまり、 **XxxClientに対してはXxxExceptionをcatchしなさいよ** ってだけですね。

C++脳で育った自分的には、Exception・RuntimeExceptionでもcatchできるんだと思ってました。（細かいerror-handleはできないとしても）
【mac】XAMPP7.3.11環境構築_インストール後からHelloWorldまでの設定

### ＜＜更新日：：2019年11月9日＞＞

XAMPPはバージョンが変わるごとにアプリ起動直後のインターフェースが少しづつ変わることが多く、初心者にとっては最初の一歩目の環境構築でわからん殺しを食いやすい。さらにmacでの日本語情報が少ない。


本記事は、その助けとなるようXAMPP環境構築のためのチートシートとして育てていく。随時更新予定。

ダウンロード＆インストール
---
OSX向け、XAMPP 7.3.11 をダウンロード＆インストールしよう。
[XAMPP Apache + MariaDB + PHP + Perl](https://www.dropbox.com/s/6hhn84fpgn4a5wf/Screenshot%202019-11-09%2013.36.12.png?dl=0)
※データベースがMySQLではなく、MariaDBだがそこまで気にする必要なし。


手順１　XAMPP.appでやること
---
1: Applications -> XAMPP.app を起動

![Screenshot 2019-11-09 14.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394058/2cfe37d6-8dc2-d276-de2e-521d872f2a18.png)


2: General > Start をクリック
3: Service > Start All をクリック
4: Network > localhost:8080->80(Over SSH) をクリック
5: Volumes > Mount をクリック
6: Volumes > Explore をクリック

手順２　Finderでやること
---
7: フォルダhtdocsを開く　※以後、主要なファイルをここに置くことになる。
8: test用にフォルダを作成する　
9: test用に適当なphpファイルを作成する　※index.phpで良い。

```index.php
<?php echo "HelloWorld"; ?>
```

手順３　ブラウザでやること
---
10: localhost:8080/test　を開く
11: ブラウザに"HelloWorld"が表示されていればOK


最後に
---
XAMPP環境で一通りの開発を通して得られる経験は本当に重要なので初心者こそ頑張ってトライして欲しい。

さらに初心者の段階から、できる範囲でOKなので自分が苦労して調べ上げたことはまとめて発信しよう。誰かに教えることは最高に投資効率の良い学習となる。

質問・不明点・間違いなどがあればご連絡ください。
Google Driveを使って容量を手軽に増やす方法 〜macOS編〜

# はじめに
皆さん，Google Driveは活用していますか？

SSDが主流の時代になり，容量が小さいPCも多くなりました．
その中で，空き領域に悩まされる日々を送っている方もいらっしゃると思います．

しかし，Google Driveを上手く使えば，PCの容量を手軽に増やすことが出来ます．

本記事では，Google DriveをPC上の一つのフォルダとして扱う方法について紹介します．
今回は，macOSを対象としています．

筆者の環境：MacBook (Early 2016) macOS Catalina

*TIPS: Google Driveの保存容量は無料プランでは15GBですが，月額250円払うだけで100GBにまで増やせます．年払いだと2,500円です．*

# インストール
[Homebrew](https://brew.sh/index_ja)をインストールしていない方はインストールしてください．

本記事では，Google Driveをフォルダとして扱うために`google-drive-ocamlfuse`を使います．
[公式Wiki](https://github.com/astrada/google-drive-ocamlfuse/wiki/Installation)を参考に次のコマンドを実行することでインストールできます．

```terminal
$ opam init
$ opam update
$ opam install depext
$ opam depext google-drive-ocamlfuse
$ opam install google-drive-ocamlfuse
```

一つずつ実行するのが面倒な場合はこれをコピペして実行してください．

```terminal
opam init; opam update; opam install depext; opam depext google-drive-ocamlfuse; opam install google-drive-ocamlfuse
```

これでインストールは完了です．

# アカウント設定
次にアカウントの設定を行います．
次のコマンドを実行するとブラウザが開かれるので，設定したいアカウントでログインして認証を行います．

```terminal
$ google-drive-ocamlfuse
```

次のコマンドでGoogle Driveを読み込みます． ディレクトリ名は好みに合わせて変更してください．

```terminal
$ mkdir -p ~/GoogleDrive
$ google-drive-ocamlfuse -o local,auto_xattr,volname=GoogleDrive ~/GoogleDrive
```

上手く行けば，FinderやTerminalからGoogle Driveの中身が見られるようになっていると思います．

取り外す際には次のコマンドを使います．

```terminal
$ diskutil unmount ~/GoogleDrive
```

# 自動化
ここまでの設定だけでは，再起動時にGoogle Driveが自動で読み込まれないので，再起動する度に上述の読み込み作業を行わなければなりません．
これをシェルスクリプトとAutomatorを使って自動化します．

[このページ](https://qiita.com/KurosawaTsuyoshi/items/425cd484e8d7759af460)を参考に次のスクリプトをapp化します．
`<USERNAME>`は実際のユーザ名に置き換えてください．`echo $USER`で確認できます．

```bash
/Users/<USERNAME>/.opam/default/bin/google-drive-ocamlfuse -o local,auto_xattr,volname=GoogleDrive /Users/<USERNAME>/GoogleDrive
```
次にmacの設定から`システム環境設定` → `ユーザとグループ`と進み，上で作ったappをログイン項目に追加します．

これで再起動時に自動でGoogle Driveが読み込まれるようになります．

# まとめ
本記事では，Google DriveをmacOS上で1つのフォルダとして扱う方法を紹介しました．
ここまで読んでいただき，ありがとうございました．

# 参考
- [Macでログインするときに項目を自動的に開く--Apple サポート](https://support.apple.com/ja-jp/guide/mac-help/mh15189/mac)
- [astrada/google-drive-ocamlfuse: FUSE filesystem over Google Drive](https://github.com/astrada/google-drive-ocamlfuse)
- [Macでシェルスクリプトを .appアイコン化する方法--Qiita](https://qiita.com/KurosawaTsuyoshi/items/425cd484e8d7759af460)
[AWS Cloud9]でのプロジェクトDownloadと、新プロジェクトへの復元方法

みなさんこんにちは 
[ジーズアカデミー 主席講師 山崎ですm(_ _)m](https://gsacademy.tokyo/about/)
今回はAWS+Cloud9でのプロジェクト「エクスポート（バックアップ）」と「インポート（復元）」についてMemoしておきます。

#AWS Cloud9
プロジェクトのバックアップ（ダウンロード）と復元方法をメモりました。

###前提条件
- Cloud9で作成したプロジェクト名は「cms」で作っていたので解凍後のフォルダ名で「cms」と出てきます。ご了承ください。


#バックアップ圧縮
#### １．[file] -> [Download Project] 
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/0341634b-80b1-0edc-47b8-89b1e36f6d0c.png">
####２．ダウンロードして保管しておきましょう！



##バックアップ復元
####1.「プロジェクト名（フォルダ）を選択
![image.png]()
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/5a7db15b-73cb-7c8b-7a46-3f4861ad0b70.png">

####2.[File] -> [Upload Local Files...] の順に選択
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/5274a62f-c72f-8fda-780e-f230ab675237.png">

####3.ダウンロードしてある 「 ****.tar.gz 」 をアップロード（ドロップすると自動でアップロードされます）
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/e96229f8-9f50-477a-f2cf-25981ef82c0b.png">

####4. 「 ****.tar.gz 」 がアップロードされてることを確認

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/daf39bb7-7fcb-100f-9d47-26d95c6e646e.png">

####５. 「 ****.tar.gz 」 がアップロードされてることを確認
cms.tar.gz を解凍するコマンドを打ちます。

```commond:
tar -zxvf cms.tar.gz 
```

####6.解凍すると「environment」フォルダが出来ます。その中の「cms」が元々の作業フォルダです。

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/d88b77d4-913e-c9e2-70c8-50a168b23cd9.png">

####7.「cms」フォルダを一つ上の階層に上げるため、以下のように操作しましょう。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/d28a11fe-3039-2dfb-de68-cebf2bcd744b.png">

####8.「cms」フォルダが以前と同じ位置に配置されました。ファイル・フォルダ一式戻りました。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/c6779c91-f2af-36f1-3b99-13e6a4aec5e7.png">

#ここまでが復元になります。


## 以下は私用の環境構築なので、スルーでOKです。


:::note warn

👉 **AWS環境：  EC2、Amazon Linux （ Educate版 ）**
👉 **開発環境： PHP/Laravel5.5**
:::

### １．PHPのアップデート ＆ Comopserのインストール(1つづつコマンドを打ちます)

```commond:
#このコマンド１行は右に長いので、ドラッグでコピーしてください。
sudo yum -y install php72 php72-cli php72-common php72-devel php72-mysqlnd php72-pdo php72-xml php72-gd php72-intl php72-mbstring php72-mcrypt php72-opcache php72-pecl-apcu php72-pecl-imagick php72-pecl-memcached php72-pecl-redis php72-pecl-xdebug

sudo alternatives --set php /usr/bin/php-7.2

php -v

curl -sS https://getcomposer.org/installer | php

sudo mv composer.phar /usr/bin/composer

composer
```


### ２．DB設定と起動
```commond:
sudo service mysqld start

mysql -u root -p

[Enter] #パスワードなし

show databases;

create database c9;

#Educate環境は他人には一切見れない環境のためパスワード:rootにしています。
update mysql.user set password=password('root') where user='root';

flush privileges;

exit;
```


### ３．Migrationファイルからテーブルを作成
```commond:
cd cms

php artisan migrate
```



### ４．Apache起動

```commond:

php artisan serve --port=8080

sudo composer update
```




#以上
"bcc32c"は内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイル として認識されていません

#概要

C言語コンパイラbcc32cをインストールしました。

早速sample.cをコンパイルしようと、
コマンドプロンプトでそのファイルがある場所にCDで飛び,

`bcc32c sample.c`を実行.

するとエラーで

>"bcc32c"は内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイル
として認識されていません

と出ました.そのときの対処法です.
#動作確認

`c:\BCC102\bin\bcc32c.exe`
を実行してみる.

問題無くインストールされているらしい.

参照：[コンパイラのインストール
Borland C/C++(embarcadero社 C++ Compiler)](http://www.isc.meiji.ac.jp/~be00085/ctips/install_embc/index.html)
#bcc32c所在地確認
どこに,zipを展開したかを確認する.

参照：[PATHが通っているか確認する方法](https://nikunimame.com/check-path/)

`>echo %path:;=&echo.%`

でPATHを見る.

どうやら環境変数をいじってdownload下にあるbcc32cにPATHを通している.

そして,その後Cドライブ直下に移動したのだが,

そのPATHを通したことが反映されていないらしい.

→**ウィンドウズへの再ログオン後に初めて有効になる**のを知る.

→**再起動**


参照：[cドライブ直下に移動 する、とはどういう事ですか？](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12101006712)


参照：["bcc32c"は内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイル
として認識されていません](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1014377945)の二番目の回答

#結果

`bcc32c sample.c`を実行.
エラーをはかない.

`sample.c`実行.
Hello Worldと出る.クリア.

#備忘録
・[コンパイラのインストール
Borland C/C++(embarcadero社 C++ Compiler)](http://www.isc.meiji.ac.jp/~be00085/ctips/install_embc/index.html)が詳しい.

・PATHを通した後、再ログオン（再起動でいい）を忘れない.
スプレッドシートEDA


## こんにちは
* 初めて記事を書きます。キンチョー
* この記事は小ネタ...というより極小ネタです。
* IEEEというkaggleのコンペにチームで出た際、特徴量の情報管理としてそこそこ有用だと思われる手法がチーム内で用いられたのでそれを共有します。

## IEEEコンペ
* IEEEコンペの概要
    * クレジットカードの取引情報をもとに、その取引が詐欺かどうかをあてるコンペです。
* IEEEコンペのデータについて
    * 個人情報だからなのか、カラム名の多くがmaskされていました。
    * 公式が少しずつカラムの情報を出したり、優秀な人が何のデータなのか当てdiscussionで公開していたりしていました。
    * →いちいち「このカラムが何者なのか」を探しに行くのが凄く面倒でした。
    * ここにどんなデータか載せようと思ったんですが、IEEEコンペの規約に同意してない人に見せるのは不味いですね。お手数ですがどんなデータなのか気になる方はkaggleのサイトでコンペにjoinして見てみてください→https://www.kaggle.com/c/ieee-fraud-detection/data
    
## スプレッドシートEDA
* 本手法について
    * 例やそのカラムの内容、あとどのように使ってきたかをまとめるというものです。実際にはこんな感じです。
    * （カラム名はjoin-competitionしなくても見ることができるデータです）
    ![BsPiD3ss2mFAN9A1574316390_1574316601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530411/01acf746-10d7-abdc-7525-ca7735eca7c7.png)
* メリット
    * データについて自分が理解したことをまとめておけます。
    * チームでそれを共有できます。
    * maskされたデータについてはより強力でしょう。

* EDAの一部？    
    * EDAは文字通り取ると「Exploratory Data Analysis」。モデリングや特徴量エンジニアリングの前にデータについて深く理解するステップと考えていいと思います。
    * 特徴量の意味を理解すること、表にまとめることも立派なEDAだと思います。ですが、EDAというとどうもグラフばかりがフォーカスされているように感じたりしています。気のせいかもしれませんが...

## その他
* IEEEでは毒kernel食べて散々な結果でした。残念。
    * あほ過ぎた。
    * 毒カーネルというのは、publicにはすごく良いデータを吐くが、privateにゴミデータを吐くというものです。皆さんも気を付けてください。
* チーミング一般に関してこのスライドが優秀でした
    * https://speakerdeck.com/j20232/kaggle-tokyo-meetup-li-number-01-way-to-border-collies-feat-jtc

* お疲れさまでした。
awscli のコマンドで #AWS ElasticBeanStalk環境を再構築する  ( eb コマンドではない )

awsコマンドでできるっぽい

```
aws elasticbeanstalk rebuild-environment --environment-name my-env
```

[rebuild-environment — AWS CLI 1.16.278 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk/rebuild-environment.html)

例

```
aws elasticbeanstalk rebuild-environment --environment-name puppeteer --region=us-east-2
```

コンソールで確認

![image](https://user-images.githubusercontent.com/13635059/68521155-8f1a8b00-02e1-11ea-9e82-546ad0981dc6.png)

たしかに `rebuildEnvironment is starting.` と表示されている




# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
office系ファイルをPDFに変換する（PHP+LibreOffice）

自分自身の過去記事（既に3年前）の焼き直しです。
時の流れは早い。。過去の自分が役立つかもと思い、整理しました。

PHP+LibreOffice実行環境の構築手順をまとめてます。
ちゃちゃっと環境構築したいなら、「作業手順」の項だけ読んでください。

# 使い勝手、注意事項
- 変換後PDFの再現度はソコソコ。ページ・印刷設定はまず再現されない。PrimoPDFとかのレベルを期待してはダメ。
- 変換処理速度はそんなに期待できない。PHPExcelと同レベルの遅さかと（体感）。ファイルサイズが数MBを超えだすと1minでもキツそう。
- LibreOfficeインストールに2GB程度はディスク容量が必要。

顧客要件（プレビューの再現性）が厳しい場合のPDF変換には正直、導入しづらい、、、
でも、Word/Excel/PowerPoint全てに対応できる点が◎

# 作業時にハマったポイント
## libreoffice-packageのインストール
`wget`,`rpm`コマンドを使いこなしている人は大丈夫。`yum install`に普段頼りきりだとハマりそう。

## font-dataのインストール
linux環境でのゴシック、明朝fontなどの使用を意識できている人は大丈夫。

## PHPでのコマンド実行
apacheユーザ・環境変数の設定がキッチリされていれば、すんなり実行できるかも。
コケた場合はwarning・error-log出力などの手がかりなく、超ハマっちゃいました。。。

# 作業手順
## libreoffice-packageのインストール
packageがyum管理下にあるなら、↓で一発。

```bash
# yum install libreoffice libreoffice-langpack-ja
```
 
ない場合は↓。　（自分でダウンロード、インストールする。）

```bash
# cd /tmp
# wget http://download.documentfoundation.org/libreoffice/stable/5.0.4/rpm/x86/LibreOffice_5.0.4_Linux_x86_rpm.tar.gz
# wget http://download.documentfoundation.org/libreoffice/stable/5.0.4/rpm/x86/LibreOffice_5.0.4_Linux_x86_rpm_langpack_ja.tar.gz
 
# yum install libXinerama.so.1
# yum install libGL.so.1
 
# tar zxvf LibreOffice_5.0.4_Linux_x86_rpm.tar.gz
# cd LibreOffice_5.0.4.2_Linux_x86_rpm/RPMS/
# rm libobasis5.0-gnome-integration-5.0.4.2-2.i586.rpm
# yum install *.rpm
 
# tar zxvf LibreOffice_5.0.4_Linux_x86_rpm_langpack_ja.tar.gz
# cd LibreOffice_5.0.4.2_Linux_x86_rpm_langpack_ja/RPMS
# yum install *.rpm
```

以下のコマンドが通ればインストールOK。

```bash
# /opt/libreoffice5.0/program/soffice.bin --help
```

##### 補足、苦しんだトコ

- libobasis5.0-gnome-integration-5.0.4.2-2.i586.rpmは、依存関係の解消がメンドクサくて断念。GUI機能向けだし、今回のコマンド実行には支障がないためインストール対象から除外した。。

## font-dataのインストール

```bash
# wget http://dl.mojikiban.ipa.go.jp/IPAmjMincho/ipamjm00301.zip
# unzip ipamjm00301.zip
# cd ipamjm00301
# mv ipamjm.ttf /usr/share/fonts
```

以下のコマンド結果リストに「IPAmjMincho,IPAmj明朝:style=Regular」があればOK。

```bash
#fc-list
```

##### 補足
- WindowsPC内からMSフォントを持ってきても実行できるが、ライセンス違反なのでやらない。

## PHPでのコマンド実行

```php:sample.php
exec("export HOME=/tmp;/opt/libreoffice5.0/program/soffice.bin --headless --convert-to pdf --outdir /home/s3_bucket/image /home/s3_bucket/image/master.doc");
```

↑の感じで実行できます。
サンプルだと/home/s3_bucket/image/master.pdfファイルが生成されます。
Ruby | EOL Rubyがインストールできない！

EOL => End Of Life
つまり、2.4以下のバージョンのrubyのことです。
[Ruby Lifecycle (EOL)](https://endoflife.software/programming-languages/server-side-scripting/ruby)

2.3.5をrbenvでインストールをしようとしたら、 以下のエラーログとともに失敗してしまいました。
そこでこの記事ではその原因と解決方法を記載します。

あ、ちなみにMacです。

```console
~ $ rbenv install 2.3.5
ruby-build: using openssl from homebrew
Downloading ruby-2.3.5.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.5.tar.bz2
Installing ruby-2.3.5...
ruby-build: using readline from homebrew

BUILD FAILED (OS X 10.15 using ruby-build 20191105)

Inspect or clean up the working tree at /var/folders/6n/8_hv1dkd2bvg1smftl8zybx40000gn/T/ruby-build.20191109131611.38543.IPfI1B
Results logged to /var/folders/6n/8_hv1dkd2bvg1smftl8zybx40000gn/T/ruby-build.20191109131611.38543.log

Last 10 log lines:
installing capi-docs:         /Users/anthony_kiedis/.rbenv/versions/2.3.5/share/doc/ruby
The Ruby openssl extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Configure options used:
  --prefix=/Users/anthony_kiedis/.rbenv/versions/2.3.5
  --with-openssl-dir=/usr/local/opt/openssl@1.1
  --with-readline-dir=/usr/local/opt/readline
  CC=clang
  LDFLAGS=-L/Users/anthony_kiedis/.rbenv/versions/2.3.5/lib
  CPPFLAGS=-I/Users/anthony_kiedis/.rbenv/versions/2.3.5/include
```

## 原因
最新のruby-build 20191105はopenssl@1.1に依存しているが、2.4以下のrubyがこれには対応していないことが原因

### 参考
* [ruby-build (Homebrew Formulae)](https://formulae.brew.sh/formula/ruby-build)

Depends on:

||||
|:--|:--|:--|
| autoconf | 2.69 | Automatic configure script builder |
| openssl@1.1 | 1.1.1d | Cryptography and SSL/TLS Toolkit |
| pkg-config | 0.29.2 | Manage compile and link flags for libraries |
| readline | 8.0.1 | Library for command-line editing |


* [rbenv/ruby-build](https://github.com/rbenv/ruby-build/wiki#openssl-usrincludeopensslasn1_mach102-error-error-this-file-is-obsolete-please-update-your-software)

> The openssl extension of Ruby version before 2.4 is not compatible with OpenSSL 1.1.x.

## 解決方法
ここに記載していることと同じです。
[Cannot install Ruby versions < 2.4 because of openssl@1.1 dependency #1353](https://github.com/rbenv/ruby-build/issues/1353#issuecomment-537749304)

```console
# 対応しているopenssl 1.0.2を入れます
$ brew install openssl

# 手動で使うopensslの場所を指定してrbenv installします
$ RUBY_CONFIGURE_OPTS="--with-openssl-dir=/usr/local/opt/openssl" rbenv install 2.3.5

# ちなみに僕はfishユーザなので、fishを使っている人は以下のコマンド
$ env RUBY_CONFIGURE_OPTS=--with-openssl-dir=/usr/local/opt/openssl/ rbenv install 2.3.5
```

以上 :fu: :goberserk: :fu:
配列とオブジェクトの違い（JavaScript）

## 配列
### 配列とは
複数の値をまとめて管理する。

### 書き方
要素を [] で囲む

### 例
```javascript:script.js
["apple","banana","orange"]
```

### コンソールに出力
`console.log(定数名)` で出力

```javascript:script.js
const fruits = ["apple","banana","orange"];
console.log(fruits);
```

```console:console
["apple","banana","orange"]
```


## オブジェクト
### オブジェクトとは
複数のデータをまとめて管理する。オブジェクトはそれぞれの値にプロパティと呼ばれる名前をつけて管理する。

### 書き方
要素を {} で囲む
{プロパティ1: 値1,プロパティ2: 値2}

### 例
```javascript:script.js
{name: "apple", price: 200}
```

### コンソールに出力
`console.log(定数名)` で出力

```javascript:script.js
const fruits = {name: "apple", price: 200};
console.log(fruits);
```
```console:console
{name: "apple", price: 200}
```

### オブジェクトの値を取り出す
`console.log(定数名.プロパティ名)` で出力

```javascript:script.js
const fruits = {name: "apple", price: 200};
console.log(fruits.name);
```
```console:console
apple
```

## 番外編：オブジェクトを要素に持つ配列
配列の要素には、文字列や数値だけじゃ無くオブジェクトも使うことができる。

### 例
```javascript:script.js
const fruits = [
  {name: "apple", price: 200},
  {name: "banana", price: 100}
];
```

### 配列の中のオブジェクトのプロパティの値を取り出す
`console.log(定数名[インデックス番号].プロパティ名)` で出力

```javascript:script.js
const fruits = [
  {name: "apple", price: 200},
  {name: "banana", price: 100}
];
console.log(fruits[1].price);
```
```console:console
100
```
AWS S3でStatic website hostingする際のReferer制御

# 実現すること

AWS S3でバケットをStatic website hostingする際に

 - index.htmlのみ公開
 - それ以外のリソースはRefererでアクセス制御

します

# やりかた

S3のバケットの
アクセス制限/バケットポリシー
にて以下を記載します

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Allow all to index.html",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::${S3_BUCKET_NAME}/index.html"
        },
        {
            "Sid": "Allow all from own domain",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::${S3_BUCKET_NAME}/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": "https://${S3_BUCKET_NAME}.s3-ap-northeast-1.amazonaws.com/*"
                }
            }
        }
    ]
}
```
Cannot allocate memory - fork(2) 対策

自動デプロイでエラー。unicornでエラーしていたので備忘録として書きます。
解釈がおかしければご指摘ください。

```unicorn.stderr.log
(省略)Cannot allocate memory - fork(2)
```
上記の意味はメモリエラーです。
メモリが足りない時にされていることとしてメモリースワップがありますが・・・
AWS　EC2 Linux は設定されていません。
（コマンド**$ free** で表示されますが、初期ではswapのところは0になってます）

設定の仕方は以下のページを参考にしました。先駆者様本当にありがとうございます。
[【Linux】スワップ領域（ファイル）の作り方](http://mktktmr.hatenablog.jp/entry/2016/09/28/055629)

**※ $ mkswap /Swapfile　の際に時間がかかるのでご注意ください**
上記ページの処理をすれば1GBのスワップ領域が確保されます。