OmniAICreator/Qiita-1.07M huggingface dataset:
openBLAS GEMM() GEMV() の Thread数別 演算時間比較

# 概要
* openBLAS の行列演算に用いる Thread数 によって、演算の所要時間がどう変わるか手元のPCで測定を行いました。
    * openBLAS の行列演算は、CPUのコア数までは openBLASのThread数を増やした方が (比例とならず鈍りがあっても)演算時間が短くなっていくと思い込んでいました。
    * ↑だと説明つかない現象を見聞きしたので、手元の環境で確認しました。
        * 手元の環境では、gemm も gemv も コア数未満のThread 数で、最小の演算時間になりました。

* 参考になれば幸いです。
#### 関連記事
* [行列の積演算で openBLAS cuBLAS を体感する](https://qiita.com/t-tkd3a/items/fbd1d97fae51a880ad1f)
測定環境は、↑の記事を参照ください。（変わってません…）


# gemm()
* 一辺 num の正方行列 の 積 ↓ の演算時間を測定する。
 
![GEMM.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/573a06c0-72eb-1c85-160a-120fffa3d0eb.png)

* ↓のグラフの横軸は↑のnum 数、縦軸は測定した行列演算の所要時間（試行10回の平均値）。
* num の初期値は 64 で 32 毎に刻んでいる。 
* Thread数 毎の測定結果を重畳している。

![Gemm_Thread_all.png](https://qiita-image-store.s3.amazonaws.com/0/169589/9ba41df8-809b-3cc7-f354-99d6a46b9ab0.png)

* ↓のグラフは、↑のグラフの num < 512 での拡大

![GEMM_Thread_u512.png](https://qiita-image-store.s3.amazonaws.com/0/169589/fa243507-f9a6-be76-3f08-f209db58db0d.png)

### グラフから読み取った事
* 2 thread は 1thread の 約半分の演算時間。ここは予想通り。
* 予想では、3 thread は 2 thread より 全般的に演算時間は短くなる、と想像していたが、そうはならなかった。
* コア数以上のthread数を指定した場合には、1threadより悪化＝演算時間が長くなっている。
* num が 1500位までは openblas_set_num_threads(0) が 最小演算時間。
    * openblas_set_num_threads(0) だと 何threadを割り当てるのだろう？
        * 動的に割り当てる？ とはいえ 2 Thread より効率よくするのってどうやってるのだろう？ 

# gemv()
* 行列Aを１辺 num の正方行列とした、行列とベクトルの積

![GEMV.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/ff8f6226-043d-5fc5-a379-c6732bee4dba.png)

* ↓のグラフの横軸は↑のnum 数、縦軸は測定した行列演算の所要時間（試行10回の平均値）。
* num の初期値は 64 で 32 毎に刻んでいる。 
* Thread数 毎の測定結果を重畳している。

![GEMV_Thread_all.png](https://qiita-image-store.s3.amazonaws.com/0/169589/9252405d-efd0-c252-acdf-2983ba304d34.png)

### グラフから読み取った事
* 1 thread を 2 thread にしても、演算時間の短縮は20% 位。
    * thread 数を増やしても、1 thread に比べての演算時間短縮は 30% 位。
* GEMV() の演算は、GEMM()に比べたら １次元分計算量は軽い。
    * thread 毎に計算を分配する所の処理の比が、相対的に大きくなっている？

* GEMV() 中心の演算であれば、openBLAS の Thread 数は 1 にしておいて、利用するアプリ側をマルチスレッド構成にして、openBLAS 関数を複数並列に動かした方が、トータルの演算時間は短くできそう。
    * ↑思い込みの可能性もあるので、後で確認する。　（追記）確認した。↓

### 追記： 実験用プロセスを並列させて 計算所要時間
* 実験用に並列に走らせるプロセス数をP 、その際のopenBLASのThread数をTとする。
* 同じ計算量を、PとT の値を変えて実施し、所要時間を測定した。
* 計算は、↑の正方行列のGEMV() num 64～4096 step 32 が各num での試行回数が合計80 回 (P
が2以上の場合、全プロセスでの試行回数の合計が80になるように、各プロセスの試行回数を調整) 

####結果

|P|T|所要時間(秒)|
|---|---|---|
| 1 | Default| 33|
| 1 | 1 | 37|
| 1 | 2 | 34|
| 1 | 4 | 34|
| 1 | 8 | 34|
| 2 | 1 | 31|
| 4 | 1 | 36|
| 8 | 1 | 50|

##### 結果から読み取った事
* openBLAS の Thread数を 1として、openBLASを呼び出す側のProcess(thread)数を多くした方が、トータルの演算時間は有利になるとの仮説もまた思い込みだった様だ…。
php-master-changes 2018-09-01

# 2018-09-01
## weltling: Fixed bug [#76829](https://bugs.php.net/bug.php?id=76829) Incorrect validation of domain on idn_to_utf8() function
- https://github.com/php/php-src/commit/b9ca573a1bf62e7fb55e863e2073e29ae94d59eb
- ext/intl の [idn_to_utf8()](http://php.net/manual/ja/function.idn-to-utf8.php) でバリデーションが誤っていたのを修正
- 本来 Unicode コードポイントへの変換後 252 コードポイントになるまで許容なのが、255 バイトまで許容という実装になっていた
- [uidna_nameToUnicodeUTF8()](http://icu-project.org/apiref/icu4c/uidna_8h.html#a61648a995cff1f8d626df1c16ad4f3b8) の結果はバイト数なのか？ 4 かけてるからそうなのかな

## weltling: Improve fix for bug [#76829](https://bugs.php.net/bug.php?id=76829)
- https://github.com/php/php-src/commit/4a43e5fb4f59bd4679f5233cc39f1a5b79820fdf
- ↑の修正について、[idn_to_ascii()](http://php.net/manual/ja/function.idn-to-ascii.php) の方とコードが共有な箇所なので、そっちでは 255 byte 分のバッファで済むよう修正

## weltling: [ci skip] Update NEWS
- https://github.com/php/php-src/commit/bcfe5f58451d574480453b98b02e2b4bd46df687
- ↑の ext/intl の修正を NEWS へ追記

## cmb69: Fix [#75696](https://bugs.php.net/bug.php?id=75696): posix_getgrnam fails to print details of group
- https://github.com/php/php-src/commit/2677d438502b68a967d46ffadfadc138070ce762
- ext/posix で、[posix_getgrnam()](http://php.net/manual/ja/function.posix-getgrnam.php) 呼び出し時に失敗するケースがある問題を修正
- 元々 [POSIX の sysconf(_SC_GETGR_R_SIZE_MAX)](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrnam.html) はバッファサイズが足りないと失敗する仕様
- ERANGE での失敗時、バッファサイズを力強く倍々に増やしてリトライしていくよう修正された
Alexaスキルのデプロイが面倒くさいのでローカルソースコードをZipにしてデプロイするためのnpmパッケージを作ってみた

最近はせっせとAlexaスキルの開発に勤しんでいます。

私はAWS Lambdaから実行する形式を取っているため、基本的には

- Node.jsでコードを書いて
- Zipファイルにして
- AWS Lambdaにアップロードする

という感じで作業します。

AWS Lambdaにはローカルテスト用のツールもあるとは言え、正直使いづらい部分も多く、またAlexaスキルの検証には大量のJSON定義ファイルが必要となるため、**実機でのデバッグが中心です。**

そうすると上記のデプロイの手順をいちいち手作業でやるのが、**とても面倒くさい**です。

そこで今回は**コマンド一発でローカル環境のソースをZipにしてLambdaにアップロードする**npmパッケージ [aws-lambda-local-deployer](https://www.npmjs.com/package/aws-lambda-local-deployer) を作ってみました。

https://github.com/quotto/aws-lambda-local-deployer

## 事前準備
このnpmパッケージはPython、pipおよびaws-cliが必要です。

pip導入後にaws-cliをインストールし、AWSの認証情報を設定しておきます。

```:aws-cliインストール
$ pip install awscli --upgrade --user
```

```:AWS認証情報の設定
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
```

詳しくはそれぞれの公式Webサイトをチェックしてください。
[Python](https://www.python.org/downloads/)
[pip](https://pypi.org/project/pip/)
[aws-cli](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html)

## パッケージインストール
普通のnpmパッケージと同じです。

```
$ npm install --save-dev aws-lambda-local-deployer
```

## デプロイ設定の作成
JSONファイルでデプロイ時の仕様を設定できます。初期設定ファイルの作成は`aldeploy`コマンドを使います。

```
$ aldeploy --init
```

これによりプロジェクトルートに`.aldeploy.json`が作成されます。このファイルで以下の項目が設定可能です。

- `rootdir` : Zip化する対象のディレクトリ。デフォルトはプロジェクトルート。
- `zipname` : 作成されるZipファイルの名前。デフォルトは`lambda.zip`。
- `deletezip` : 作成されたZipファイルをローカルから削除するフラグ。デフォルト`true`の場合はデプロイ後に削除される。
- `exclude` : Zipファイルに含めないファイル名のパターンを配列で指定する。ファイル名パターンはglob形式で設定する。
- `region` : デプロイ先のAWSリージョンのエンドポイント名。デプロイ時にパラメータから直接指定も可能。
- `function` : デプロイ先のAWS Lambdaの関数名。デプロイ時にパラメータから直接指定も可能。

例えばこんな感じで使います。

```json:.aldeploy.json
{
    "rootdir": "src",
    "zipname": "lambda.zip",
    "deletezip": true,
    "exclude": [
        ".*",
        "test/**"
    ],
    "region": "ap-northeast-1",
    "function": "MySkill"
}
```

## デプロイ
設定ファイルができたらあとは`aldeploy`でデプロイします。
**※デプロイ先のAWS Lambda関数は先に作成しておく必要があります。**


```
$ aldploy
```

なお`region`と`function`はコマンド実行時にオプション指定が可能です。

```
$ aldeploy --region ap-northeast-1 --function MySkill
```


<br/>
必要最小限のことしかできませんが、Alexaスキルのコードは比較的こじんまりしている（と思っている）ので、これくらいのシンプルさが使いやすいかな、と思います。

以上です。
Laravel リリース・サポート期限

# リリース・サポート期限

現時点で有効なバージョンは 11, 10 です

| Version | Release | Bug fix | Security fix | PHP |
|:---:|:---:|:---:|:---:|:---:|
| 12.0 | 2025-1Q | 2026-Q3 | 2027-Q1 | >= 8.2 |
| 11.0 | 2024-03-12 | 2025-09-03 | 2026-03-12 | >= 8.2 |
| 10.0 | 2023-02-14 | 2024-08-06 | 2025-02-04 | >= 8.1 |
| 9.0 | 2022-02-08 | 2023-08-08 | 2024-02-06 | >= 8.0.2 |
| 8.0 | 2020-09-08 | 2022-07-26 | 2023-01-24 | >= 7.3 |
| 7.0 | 2020-03-03 | 2020-10-06 | 2021-03-03 | >= 7.2.5 |
| 6.0 (LTS) | 2019-09-03 | 2022-09-06 | 2022-09-06 | >= 7.2 |
| 5.8 | 2019-02-26 | 2019-08-26 | 2020-02-26 | >= 7.1.3 |
| 5.7 | 2018-09-04 | 2019-03-04 | 2019-08-04 | >= 7.1.3 |
| 5.6 | 2018-02-07 | 2018-08-07 | 2019-02-07 | >= 7.1.3 |
| 5.5 (LTS) | 2017-08-30 | 2019-08-30 | 2020-08-30 | >= 7.0.0 |
| 5.4 | 2017-01-24 | 2017-07-24 | 2018-01-24 | >= 5.6.4 |
| 5.3 | 2016-08-23 | 2017-02-23 | 2017-08-23 | >= 5.6.4 |
| 5.2 | 2015-12-21 | 2016-06-21 | 2016-12-21 | >= 5.5.9 |
| 5.1 (LTS) | 2015-05-09 | 2017-06-09 | 2018-06-09 | >= 5.5.9 |
| 5.0 | 2015-02-04 | 2015-08-04 | 2016-02-04 | |


- 2021年7月
  - 延期 6.0 Bug Fix 2021-09-07 => 2022-09-06
  - 延期 8.0 Bug Fix 2022-03-01 => 2022-07
  - 延期 8.0 Security Fix 2022-09-06 => 2023-01
  - 延期 9.0 Release 2021-09 => 2022-01
  - 延期 9.0 Bug Fix 2023-09 => 2024-01
  - 延期 9.0 Security Fix 2024-09 => 2025-01
  - 延期 10.0 Release 2022-09 => 2023-01
  - 延期 10.0 Bug Fix 2024-03 => 2024-07
  - 延期 10.0 Security Fix 2024-09 => 2025-01

# リリースノート

リリースノート 11.0 Laravel
https://readouble.com/laravel/11.x/ja/releases.html

リリースノート 10.0 Laravel
https://readouble.com/laravel/10.x/ja/releases.html

リリースノート 9.0 Laravel
https://readouble.com/laravel/9.x/ja/releases.html

リリースノート 8.0 Laravel
https://readouble.com/laravel/8.x/ja/releases.html

リリースノート 7.0 Laravel
https://readouble.com/laravel/7.x/ja/releases.html

リリースノート 6.0 Laravel
https://readouble.com/laravel/6.0/ja/releases

リリースノート 5.8 Laravel
https://readouble.com/laravel/5.8/ja/releases

リリースノート 5.7 Laravel
https://readouble.com/laravel/5.7/ja/releases

リリースノート 5.6 Laravel
https://readouble.com/laravel/5.6/ja/releases.html

リリースノート 5.5 Laravel
https://readouble.com/laravel/5.5/ja/releases.html

リリースノート 5.4 Laravel
https://readouble.com/laravel/5.4/ja/releases.html

リリースノート 5.3 Laravel
https://readouble.com/laravel/5.3/ja/releases.html

リリースノート 5.2 Laravel
https://readouble.com/laravel/5.2/ja/releases.html

リリースノート 5.1 Laravel
https://readouble.com/laravel/5.1/ja/releases.html

リリースノート 5.0 Laravel
https://readouble.com/laravel/5.0/ja/releases.html

# 8.0


# 7.0

- PHP >= 7.2 ⇒　>= 7.2.5

# 6.0

- PHP >= 7.1.3 ⇒　>= 7.2

# 5.6

- PHP >= 7.0.0 ⇒　>= 7.1.3
- UUID が使えるようになりました
    - Str::uuid();
    - Str::orderedUuid();
OpenSPIFeの開発の仕方

# [OpenSPIFe](https://github.com/nasa/OpenSPIFe) とは
OpenSPIFe（Open Scheduling and Planning Interface for Exploration）は、NASAの作ったスケジューリングのツールキット。数百時間にわたる経験に基づいて開発されたソフトウェア。

# 環境の前提条件
- Java SE 7 JDK
    - [Ubuntu 16.04 LTSに複数のJDKをインストールする方法](https://qiita.com/SUZUKI_Masaya/items/a4eb06e826bf56541537)
    - [ubuntu 14.04にOracleJDK7（JAVA）をインストールする](https://qiita.com/minecraft/items/3ca7e9897fa8ec7099ae)
- The Modeling Tools version of Eclipse Luna (4.4.2)

# SPIFeターゲット定義の選択
- Eclipse Package Explorerから、`_feature_gov.nasa.arc.spife` プロジェクトを展開し、 `SPIFe.target` ファイルを右クリックしてコンテキストメニューを表示する。次に、`[Open With]` を選択し、 `[Target Editor]` オプションをクリックする。
- 次に、右上隅にある`Set As Target Platform`リンクをクリックします。 これにより、ワークスペースの完全なビルドがトリガーされ、以前に`[Problems]`ビューに表示されていたエラーが修正される。

# 補足
OSS提供サーバのリンク切れにより、NASAのリポジトリのコードをそのまま使うとコンパイルエラーになる。そこで、[筆者がForkして改造したリポジトリ](https://github.com/kannkyo/OpenSPIFe)を使うことを推奨する。
windows10のvagrantでrailsコマンドが使えないときの備忘

windows10環境でVagrantを用いてRailsの環境構築を行ったものの、自分の環境では一度vagrantを終了すると次にVagrantに入った時、railsコマンドを認識しなくなってしまうので備忘として再認識させる方法を残します。

##環境
・windows10
・VagrantのboxはCentOS72

###コマンド

vagrant sshでCentOSのターミナルに接続後、以下のコマンドを入力
```source ~/.bash_profile```
※自分の場合は一度suを実行後にやってます。

最初にプロファイルの読み込みが上手く行ってないのだろうか・・・。

###追記(2018/09/02)
コメントでアドバイスいただきました。
どうやら~/.bash_profileにパスを通していたのが原因だった模様。
~/.bashrcにパスを通したらsourceコマンドを実行しなくてもrailsコマンドを認識した。
一応、以下のコマンドを実行した。

```echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc```
```echo 'eval "$(rbenv init -)"' >> ~/.bashrc```
(スーパーユーザーで実行した。)

ちょっとしたことでも投稿してみるものだなぁ。。。
Pythonについて vol11.Class

今回はクラスについてです。思想的には関数と似ていて、特定の処理を再利用可能にできます。
関数と異なる点は、別ファイルに書いてある処理でもimportすることで呼び出し可能な点です。

また自分は腹落ちしていませんが、クラス内の関数はメソッドと呼びます。
詳しく知りたい人はググってください。(丸投げ

簡単な書き方

```py:MyClass.py
class MyClass:
    def __init__(self):
        pass
    
    def MyMethod(self, phrase):
        print(phrase)
    
if __name__ == '__main__':
    phrase='Hello, World!'
    mc = MyClass()
    mc.MyMethod(phrase)
```

というpyファイルを作って実行すると、Hello, World!と表示されます。
分解して説明します。

```py
class MyClass:
```
クラス名の宣言です。1ファイルで複数クラスを設定することもできますが、あまりやらないと思います。

```py
    def __init__(self):
        pass
```
コンストラクタです。何にも初期値は設定していませんが。。。
コンストラクタとは、インスタンスが作成されたときに実行されるメソッドです。初期値などを設定しておきます。
また引数を受け取って、それをインスタンス変数の初期値に設定することもできます。

```py
    def MyMethod(self, phrase):
        print(phrase)
```
MyClassのメソッドです。書き方は関数と一緒ですが、第一引数はインスタンス自身(self)を指定します。
処理の中身はご自由に。計算したり、printしたり、何かをreturnしたり。

```py
if __name__ == '__main__':
```
ここからはMyClass外の処理になっています。MyClass.py直接呼び出されたときだけ実行されます。
外からimportされた時は実行されません。

```py
    phrase='Hello, World!'
    mc = MyClass()
    mc.MyMethod(phrase)
```
ここからは普通の処理です。phraseに'Hello, World!'を代入して、MyClassのインスタンスmcを作って、
それ経由で引数にphraseを指定して、MyMethodを実行しています。
MyMethodの中で、print(phrase)があるので、画面にはHello, World!が表示されます。

そしてこれを別のファイルから呼び出します。MyClass.pyと同じフォルダにmain.pyというファイルを作ります。

```py:main.py
from MyClass import MyClass

phrase='Hello, New World!'
mc = MyClass()
mc.MyMethod(phrase)
```

こちらも分解して解説していきます。

```py
from MyClass import MyClass
from MyClassはファイル名MyClass.pyを指しています。
```
その中から、クラスMyClassをインポートしています。（名前を変えれば良かった。。）

```py
phrase='Hello, New World!'
mc = MyClass()
mc.MyMethod(phrase)
```
ここからは先程と同様。ただphraseの中身が'Hello, New World!'となっているので、
画面の表示は、Hello, New World!となります。

このあとは自分が作ったAWS CLIのSTS AssumeRoleを実行して、アクセスキー、シークレットアクセスキー、
トークンを取得するクラスの説明をしようと思ったんですが、全部を説明すると長くなるので、ざっくりと。
クラス・メソッドの中の処理としては、環境名を引数で貰って、EC2インスタンスにsshして、
sts assumeroleを実行して、アクセスキー、シークレットアクセスキー、トークンを返してきます。

使い方はとおりです。

```py
from get_sts_assumerole import Gsa    # import
environment = 'dev'    # 環境をdev(開発)に設定
gsa = Gsa()    # インスタンス生成
creds=gsa.get_sts_assumerole(environment)    # メソッドに引数(環境)を渡して設定。
```
そうすると配列credsにアクセスキー、シークレットアクセスキー、トークンが入ります。
あとは、以下のようにそのcredsを使って、sessionを作ります。

```py
session = boto3.Session(
    aws_access_key_id=creds[0],
    aws_secret_access_key=creds[1],
    aws_session_token=creds[2],
)
```

あとはこのセッションを使って、各サービスのクライアントを作る話以降はBoto3の回と重複するので割愛します。
pathlibを使って特定ディレクトリ以下の全ファイルを取得する

# はじめに
テキストファイルを分かち書きするのにファイルを全て結合させて処理していたが、サイズが大きすぎてメモリが悲鳴を上げたのでファイルを１つずつ開いて処理することにした。
そのため、まずは全ファイルを取得して１つずつ開くコードを書いた。


# コード
` Path().rglob('*')` を使う
対象のファイルの拡張子が決まっているなら` Path().rglob("*.txt")` のように書けばよいのだが、私が扱いたいファイルは拡張子がないので` is_file()` を使ってファイルのみを返すようなメソッドを書く。


```python
from pathlib import Path


def main():
    for path in get_file('./text'):
        with path.open("r", encoding='utf-8') as file:
            file.read()

def get_file(dirctory):
    for f in Path(dirctory).rglob('*'):
        if f.is_file():
            yield f
```


# コード(修正前)
良くない書き方


```python
from pathlib import Path


def main():
    for path in get_file('./text'):
        with path.open("r", encoding='utf-8') as file:
            file.read()

def get_file(dirctory):
    d = Path(dirctory).iterdir()
    for f in d:
        if f.is_file():
            yield f
        elif f.is_dir():
            yield from get_file(f)

if __name__ == '__main__':
    main()
```
iOSDC2018に行ってきたので興味を持った技術を紹介します

# iOSDC2018の感想

エンジニアの祭典iOSDC2018でこれまで聞いてきたTLの中で一際興味を持った技術を淡々と紹介していきたいと思います。

勿論、これから深掘りしていきたいと思ってます。
本当は全LTを見たい気持ちなのですが、Track別になっている影響もあるため全部見れません。

## GraphQL

[iOS × GraphQLの嬉しみとつらみ](https://fortee.jp/iosdc-japan-2018/proposal/c27a8d9b-8873-4e03-bb8a-fa171416bc00)

簡単な感想: GraphQLを扱う上でサーバーサイドのコードとクライアントのコードそれぞれを拝見することができて満足でした。
これまでのブログではGraphQLは凄いよ、という文章しか見られない中サンプルコードを使って丁寧に解説して頂いていました。


そして何より、こういった技術を導入したことにより分かった**メリット**と**デメリット**を発表してくれたこと

これが一番参考になりました。

エンドポイントが一つになること、がよく特徴として取り上げられていましたが、じゃあどうやって欲しい情報を手に入れるんだろ？と疑問に思っていたので凄い納得して聞いていました。

ただ正直、まだどの現場にもすぐに導入できる代物ではない気がしています。


## WebSocket

[WebSocketをiOSに持ち込んで辛い思いをした経験がありますか！？](https://fortee.jp/iosdc-japan-2018/proposal/1e7fe56b-79da-454f-8a2f-08b1a8943aab)

本当にいろんなところで聞く一言ですが、

「WebSocketイケてるみたいだからウチのアプリにも導入してみたいね〜」

というフレーズを粉砕してくれるいいLTでした。
まあ、そんなにいいならみんなもう導入してるしね。

このLTでは実際にアプリにWebSocketを導入して失敗しまくった部分の紹介がありましたので非常に参考になりました。
こういう成功の中にも失敗談のあるLTが非常に勉強になります。
逆に言いますが、メリットしか言わない(紹介しない)LTは割とダメな印象が多かったです。

脱線しますが、いいプレゼンの流れは
普段(日常)の状況→課題(デメリット)→課題を打ち消す提案→提案のメリット→提案のデメリット→感想・まとめ

って感じです。
記憶に残るLTのコツは「発表する内容」にさらに「流れ」で決まるかなっと。

## 所感

私自身がクライアントサイド(最近はもっぱらAndroidですがw)の案件をそれなりにやってきたためかクライアントサイドの話に若干飽きてきたので、
今回のiOSDCではクライアントサイドではなくサーバーサイド寄りのLTの方を重視して聞いていました。  
もちろん、1日ということで3日目で他にも凄いよかったLTもありました。

本当は凄い残念なLTもあって今後のiOSDCのためにディスってやろうとも思ってましたが、それは流石にダメだろうなと思ったのでやめます。

iOSDCって本当に登壇者(speaker)のための祭典である気がします。
というのも、こういう勉強会系って**売名目的**のためのイベントであって勉強できるイベントでない。
だから、単純にリスナーとして参加しているっていうのはただの時間の消費になる。

はっきり言って、その時間を使って家で個人アプリを開発していた方がまだ身になるはずである。
(だからこそみんなこういう場でLTをして有名になろうとするのである。)

それよりも、こういう場では今まではあまり興味を持たなかった技術のLTを聞きに行って興味を持つきっかけにする方が100倍いい使い方かな。

正直、ソースコードのリファクタやらテストやら、アプリの設計のお話しは聞き飽きたし、
英語の文献を漁った方がよっぽど参考になる。
(あと、英語のリファレンスやらブログを読んだ後に日本語のブログ記事を読むと残念な気持ちになることが多い。。。)

しかしなぜか「リファクタリング」に関してはまともな情報が少ないですよね。


最後に、スタッフの皆さんお疲れ様でした。
Ubuntu (GeForce)× Nvidia-docker2 で Keras(Tensorflow-gpu) の環境構築

##結論
UbuntuとNvidia-docker2を使うことで、GPU付きPCにおいて、Keras(Tensorflow)を利用可能なPythonプログラム環境を超簡単に構築できる！

##環境
・Ubuntu 18.04
・GeForce GTX1080

##すること
・NVIDIAドライバのインストール
・docker-ceのインストール
・Nvidia-docker2のインストール
・コンテナ内で、GPUを使って、Kerasでプログラムを動かす。

（ネットの記事によっては、ホスト側にCUDAをインストールしているが、コンテナ内で実行するにあたって必要ないようだ。）


##はじめに
CentOS7にTensorflow-gpuを使える環境を構築したことがあるものの、そのときはドライバーを入れたり、CUDAを入れたりで1日を費やした。ネットの情報を見ると、UbuntuとNvidia-dockerで簡単に環境構築できそうだったので、今回、チャレンジしてみた。その過程をここで共有する。

#NVIDIAドライバのインストール
多くのネット記事にあるのは、手動でNvidiaドライバをダウンロードして、既存のnouveauドライバを無効化して、、、という手順だが、以下のように、aptで一気にインストールすることもできる。

まずは、aptのリポジトリに Geforce GTX1080 で利用できる NVIDIA ドライバがあるか確認する。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp にて、GPU情報等を入力して、必要なドライバのバージョンを調べる。私の環境では以下であった。

　　Linux x64 (AMD64/EM64T) Display Driver
　　バージョン:   390.77
　　リリース日:   2018.7.16
　　オペレーティングシステム:     Linux 64-bit
　　言語:         Japanese
　　ファイルサイズ:       78.89 MB

次に、NVIDIA ドライバを提供している xorg-edgers レポジトリを追加する。

``` 
 $ sudo add-apt-repository ppa:xorg-edgers/ppa -y
 $ sudo apt-get update
 $ sudo apt-get upgrade
```
apt-get でインストールできるドライバ一覧を検索する。

```
 $ sudo apt-cache search "^nvidia-[0-9]{3}$"
```
バージョン390があるから、aptでinstallできる！
(手動インストールに比べて、nouveauの無効化とかが必要なく、かなり楽になる)
以下で、nvidia-driverのインストール

```
$ sudo apt install nvidia-driver-390
$ sudo reboot
```
CentOS7のときに、何度もリブートして、失敗して、を繰り返したことを思うと、これだけでも、ただただ感動 (T T)


##docker-ceのインストール
ネットの記事によっては、nvidia-dockerをインストールしたら、docker-ceもインストールされる的なことが書いてあった。私も次に書くnvidia-dockerだけをインストールして試したものの、うまくいかなかった。なので、docker-ceのインストールも必要で、先に書いておく。

```
$ sudo apt-get remove docker docker-engine docker.io
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
```

##Nvidia-docker2のインストール
続いて、以下でnvidia-docker2をインストールする。

```
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
```
以下で、動作確認。

```
$ sudo pkill -SIGHUP dockerd
$ docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
```

##コンテナ内で、GPUを使って、Kerasでプログラムを動かす。
以下で、tensorflow-gpuのイメージをとってきて動かして、コンテナに入る。

```
$ sudo nvidia-docker run -it tensorflow/tensorflow:latest-gpu-py3 bash
```
コンテナ内で以下を実行。

```
$ pip3 install keras
$ apt-get update
$ apt-get install wget
$ wget https://raw.githubusercontent.com/fchollet/keras/master/examples/mnist_cnn.py
$ python3 mnist_cnn.py
```
これで、MNISTがGPUを使いながら実行される！！　なんてお手軽に構築できたことか。。。
Exchange 2019 Preview をインストールしてみた

TechNet Blog で [Exchange Server 2019 Public Preview](https://blogs.technet.microsoft.com/exchange/2018/07/24/exchange-server-2019-public-preview/) としてアナウンスされたので、ちょっとさらっとですがインストールしてみました。

## 環境

Windows Server 2016

## ダウンロード先

https://www.microsoft.com/en-us/download/details.aspx?id=57167

## インストールしておいたほうが良いもの

セットアップ中に、下記のプログラムがインストールされていないと先に進めなくなるため、事前にインストールしておく必要があります。

[.NET Framework 4.7.1](https://support.microsoft.com/kb/4033342)
[Microsoft Unified Communications Managed API 4.0、Core Runtime](http://go.microsoft.com/fwlink/?LinkId=260990)
[Visual C++ 2013 再頒布可能パッケージ](https://www.microsoft.com/download/details.aspx?id=40784)

## インストールしてみた

前述のものをインストールしておけば、基本は、ウィザードに沿ってポチポチするだけです。いやー、昔と比べてものすごく楽になりましたね。

インストール時に必要なディスク領域は、こんな感じ。

![SRV01_Exchange2019-2018-08-24-23-48-28.png](https://qiita-image-store.s3.amazonaws.com/0/218221/41f8bc6e-929c-551f-83d7-ba2d7bdca423.png)

Exchange 管理センターも、問題なく使えました。

![SRV01_Exchange2019-2018-08-25-01-13-53.png](https://qiita-image-store.s3.amazonaws.com/0/218221/2e37d50c-88fb-0356-862c-645d1fb2efa7.png)

## その後の手順の参考

[Exchange 2016 のインストール後のタスク](https://docs.microsoft.com/ja-jp/Exchange/plan-and-deploy/post-installation-tasks/post-installation-tasks)

いまのところ、Exchange 2019 に明示的に対応したページは無いみたいですね。

## バージョンを確認してみた

インストールだけだと少し芸が無いかなと思ったので、Exchange Management Shell で、Exchange のバージョン (AdminDisplayVersion) を確認してみました。

```PowerShell
Get-ExchangeServer | fl AdminDisplayVersion

AdminDisplayVersion : Version 15.2 (Build 196.0)
```

[こちら](https://technet.microsoft.com/ja-jp/library/hh135098.aspx)の情報的にも、Exchange 2016 は 15.1.x なので、Exchange 2019 は 15.2.x 系っぽいですね。
Google Cloud Platform のストレージオプション(備忘録）

ふと、様々なCloud サービスを整理しようと思い立ち、記録を付けてみることにした。

Google Cloud Platform のストレージオプションにおいて、それぞれ**適しているケース**について

![alt](https://4.bp.blogspot.com/-qaPL50HB4sQ/W1a5LGGwsFI/AAAAAAABNkU/zfy15VpupA0F0CCypSOLNZXRI0pPcwNhgCLcBGAs/s800/study_book_neochi_man.png)


#　Cloud Datastore

　　半構造化の アプリケーションデータがApp Engineアプリで 使用される場合

# 　Bigtable

　　読み書きイベントが多い 解析データ
　　AdTech、金融、IoTデータなど
 
#　Cloud Storage

　　構造化、非構造化バイナリ、オブジェクトデータ
　　画像、大容量のメディアファイル、 バックアップなど
#　Cloud SQL

　　Webフレームワークや既存のアプリ
　　認証情報や 顧客の注文を保存する場合

#　Cloud Spanner
　　2テラバイトより大きい 大規模データベースアプリ
　　金融取引や eコマースのユースケース




　　1つ以上の上記サービスを 組み合わせることもできる
JavaScript開始時にあるコメントについて <!-- //-->

## 昔のJavaScriptによくあるコメント
最近はHTMLファイルにJavaScriptを書くことが減ったから、あまり見ないけど…。


```html
<script type="text/javascript">
<!--
  :
//-->
</script>
```

ある時、JavaScript初心者の方から「このコメント`<!-- //-->`は何のためにあるのですか？」と聞かれました。

「これはscriptタグが解釈出来ない古いブラウザで表示した時に、JavaScriptのソースが画面に出てしまうのを防ぐものです。」と、説明したところで、ふと疑問に思った。

コメントの終わりは「`//`」でわざわざJavaScript的にはコメントアウトしているのに、コメントの開始は何もしていない。

## 検証

以下のコードを試してみた。な、なんと「a」のみ表示されてエラーにならない。

```JavaScript
console.log("a")
<!--console.log("b")
```

## 仕様

これは、以下のページの真ん中あたりにもあるように、`<!--`が行コメントとして扱われるそうです。(注: 追記参照)

> the string "&lt;!--" in JavaScript is actually treated as a line comment start, just like "//".

https://www.w3.org/TR/html5/scripting-1.html
`var a = "<!-- <script>";` がバグるっていう内容も載っていて興味深い。

**2018年2月6日追記**
もう上記のリンクは死んでいる。インターネットアーカイブの2015年ごろは載っている。ので転記させてもらいます。

* 4.11.1.2 Restrictions for contents of script elements

```html
<script>
  var example = 'Consider this string: <!-- <script>';
  console.log(example);
</script>
<!-- despite appearances, this is actually part of the script still! -->
<script>
 ... // this is the same script block still...
</script>
```

`</script>`が終了しないというバグ

> despite appearances, this is actually part of the script still! (外観にもかかわらず、これは実際にまだスクリプトの一部です！)
オフラインリアルタイムどう書く E26 の問題

オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/77405 )を行いました。

問題は「Gears Out!」という名前で、詳細は
https://cedretaber.github.io/doukaku/e26/
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
pythonで可変長引数を使うときに気をつけたいこと

　とても初歩的な内容だが、仕事でプログラミングをしているときにどツボにハマったのでメモしておく。

##可変長引数とは
　可変長引数とは、自由に引数の大きさを変更できる引数のことである。Pythonだと、引数の中身をtupple型に格納してくれる```*args```(arguments)と、dict型として受け取ってくれる```**kargs```(keyword arguments)が用意されている。
　詳しい使い方等については、以下のページに詳しい。
- [可変長引数](https://qiita.com/Kodaira_/items/51237ada3bb672433e78)
- [Pythonの可変長引数（*args, **kwargs）の使い方](https://note.nkmk.me/python-args-kwargs-usage/)

##可変長引数を使うときの問題点
###argsの場合
　では、本題に移ろう。まず、次のような関数を考える。

```py:test1.py
def hoge(a,b,*c):
	print(a)
	print(b)
	print(c)

if __name__ == "__main__":
	a="Hello!"
	b="World!"
	c=["I am a","nooby","programmer!!"]
	hoge(a,b,c)
```
```test:responce
Hello!
World!
(['I am a', 'nooby', 'programmer!!'],)
```
　この関数は、引数が3つあるが、もしそのうちの1つを忘れてしまったらどうなるだろうか?

```py:test2.py
def hoge(a,b,*c):
	print(a)
	print(b)
	print(c)

if __name__ == "__main__":
	a="Hello!"
	b="World!"
	c=["I am a","nooby","programmer!!"]
	hoge(a,c)
```
```text:responce
Hello!
['I am a', 'nooby', 'programmer!!']
()
```
**問題なく動いてしまった。**
そう、可変長引数は「変数の大きさを自由に変えられる引数」だった。言い換えれば、**長さは0であっても良い**ことを意味する。

###**kargsの場合
以上の特徴は、`**kargs`でも同様だが、こちらはキーワードが必要になるので比較的間違いに気づきやすいかもしれない。

```py:test3.py
def foo(hoge,fuga,**hage):
	print(hoge)
	print(fuga)
	print(hage)

if __name__ == "__main__":
	hoge="Hello!"
	piyo="World!"
	hage=["I am a","nooby","programmer!!"]
	foo(hoge,fuga=hage[0],c=hage[1],d=hage[2])
```
```test:responce
Hello!
I am a
{'c': 'nooby', 'd': 'programmer!!'}
```
　これは、`**kargs`の一部としたかったkeywordを、関数fooの2番目の引数である`fuga`としてしまったことに起因している。引数と一致させなければきちんとエラーが返る。

```py:test5,py
def foo(hoge,fuga,**hage):
	print(hoge)
	print(fuga)
	print(hage)

if __name__ == "__main__":
	hoge="Hello!"
	piyo="World!"
	hage=["I am a","nooby","programmer!!"]
	foo(hoge,b=hage[0],c=hage[1],d=hage[2])
```
```text:responce
Traceback (most recent call last):
  File "hoge.py", line 12, in <module>
    foo(hoge,b=hage[0],c=hage[1],d=hage[2])
TypeError: foo() missing 1 required positional argument: 'fuga'
```

##対策
　以上のように、特に`*args`を用いた際にケアレスミスの要因となる場合があることがわかった。以上のような問題を起こさないためには、`*args`がtupple型、`**kargs`がdict型として格納されていることを活用して、次のようにすると良いだろう。

```py:test5.py
def hoge(a,b,*c):
	if len(c)==0: raise TypeError("*c is not given")
	print(a)
	print(b)
	print(c)

if __name__ == "__main__":
	a="Hello!"
	b="World!"
	c=["I am a","nooby","programmer!!"]
	hoge(a,c)
```
```text:responce
Traceback (most recent call last):
  File "hoge.py", line 11, in <module>
    hoge(a,c)
  File "hoge.py", line 2, in hoge
    if len(c)==0: raise TypeError("*c is not given")
TypeError: *c is not given
```
RX65NなどのCDC USBドライバー

ルネサスのUSBシリアルドライバーが見つからないケースが多々あるようです。

PCとRX64MをCDCで通信するためのドライバーに関して
https://japan.renesasrulz.com/cafe_rene/f/002-2095199602/4808/pc-rx64m-cdc

Windows7では発生するが、Win10では発生しないようで、CDCDriver（FTDIやCP2102系のドライバーを移植すれば動く場合もあるようですが、VID等を細工しても動かない、エラーになるケースもあるようです。
*私はいじらないで使おうとしたら案の定エラーになりました。

![DeviceManager-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/2a81672e-7523-a0d9-3645-21dc8766bf87.jpeg)
USB\VID_045B&PID_025A&REV_0100
USB\Class_02&SubClass_02&Prot_00

![DeviceManager-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/66f40358-b52a-ced6-c65a-b6cd48b9774d.jpeg)

Synergy Signed USB CDC Driver　をダウンロードします。
https://www.renesas.com/jp/ja/products/synergy/software/add-ons/usb-cdc-drivers.html

![SynergyUSB.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/093b7964-dc72-980a-3bb0-bd9d1a3519de.jpeg)
![DeviceManager-2-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/7c1244a2-f062-4f27-cfae-bff6e2d6c7f6.jpeg)
![DeviceManager-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/0a86c6d6-d173-b9a9-adbb-a03e790fec21.jpeg)

![DeviceManager-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/dc6c9ca4-9dd8-42ef-05a5-bb2ee4139ec5.jpeg)
![DeviceManager-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/3ad37b2e-18ed-e968-f304-47907210fab4.jpeg)
先ほどダウンロードしたドライバーファイルを指定。
![DeviceManager-6.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/d395df6b-9339-5a4d-515c-547fd3840296.jpeg)
![DeviceManager-7.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/b6c059cb-598b-dd49-1c4f-c6486c6b421f.jpeg)
![DeviceManager-8.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/df8e291b-d10e-972e-66ef-04d09b21532a.jpeg)
![DeviceManager-9.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/3244e817-b561-45b0-ed86-e4edb559031b.jpeg)
![DeviceManager-10.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/0c7aa163-c2ca-661f-ad3f-daebf3b342b5.jpeg)
![DeviceManager-11.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/131ff74a-c3fb-c43c-7546-e647a669316c.jpeg)

以上で使えるようになっているはずです。
今回私はGR-ROSEに使われるRX65Nで確認しています。
Spring bootをVSCodeで使う方法

### VScode
[VScode](https://code.visualstudio.com/)をここからダウンロードしてインストールしてください。
Javaは1.8を使用するので入れておいて下さい。

### プロジェクトの設定
[start.spring.io](https://start.spring.io/)を使ってSpring bootのプロジェクトをある程度設定済みの状態でダウンロードします。注意すべきは「Web」と「Thymeleaf」をDependenciesに追加しないとSpring bootがちゃんと動かないということです。「Search for dependencies」の場所で検索して、出てきたものをクリックすると追加できます。できたら「Generate Project」をクリックしてダウンロードを始めてください。私は以下の画像のように設定したので参考にしてください。 
<img src="https://qiita-image-store.s3.amazonaws.com/0/260163/fb0b30aa-882e-a198-65fc-b9eba6e6a881.png" width="80%">

### VSCode
「Generate Project」をクリックすると[Artifact名].zipがダウンロードできます。今回Artifact名はdemoだったのでdemo.zipがダウンロードされます。こいつを解凍して中身の「demo」を適当な場所においてください。 
<img src="https://qiita-image-store.s3.amazonaws.com/0/260163/be100c54-a1c2-40ef-0a40-e46eac42cf05.png" >

このdemoフォルダをVSCodeで開きます。 
<img src="https://qiita-image-store.s3.amazonaws.com/0/260163/c7028bc9-3d49-2bc6-7cd9-5f9cb65830b9.png" width="80%">

pom.xmlというファイルがVSCodeの左側に表示されているはずなのでそいつをダブルクリックして開きます。 
<img src="https://qiita-image-store.s3.amazonaws.com/0/260163/4e9b241d-fb34-3522-f1f9-250fb7872778.png" width="80%">

開いたらF5を押し、Javaを選択します。 
<img src="https://qiita-image-store.s3.amazonaws.com/0/260163/688659f5-57fc-f25e-1fe7-09b7d1655067.png" width="80%">

するとコンパイルが始まり、さらにデバッグモードになります。 

### Hello World
#### Controller
「controller」フォルダをdemoフォルダ内に作ってください。さらに「HelloController.java」をcontrollerフォルダ内に作ってください。 
![Screenshot from 2018-09-01 17-27-58.png](https://qiita-image-store.s3.amazonaws.com/0/260163/676dcd04-c65c-baa3-70b2-0d2c58c937c6.png)

HelloController.java内には次のように書いてください。書いたら「ctrl + s」で保存してください。

```java
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloController{
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String get(){
        return "hello";
    }
}
```

#### Template
今度は「templates」フォルダ内にhello.htmlを作ります。次のようになるはずです。
![Screenshot from 2018-09-01 17-12-12.png](https://qiita-image-store.s3.amazonaws.com/0/260163/a15fa68a-d2d1-f8c9-882d-fdae1fefa141.png)

できたらその「hello.html」内に次のように書きます。Hello World!表示用のhtmlファイルです。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
Hello World!
</body>
</html>
```
できたらブラウザから確認してみましょう。まずデバッグモード（がまだ走っているなら）止めます。
![Screenshot from 2018-09-01 17-17-13.png](https://qiita-image-store.s3.amazonaws.com/0/260163/6d03b285-2233-4392-3c54-60c9d6981fee.png)

そしてF5を押します。するとコンパイルが始まり、デバッグモードになるはずです。そしたら http://localhost:8080 を開いてください。もし以下のようにHello World!と表示されれば成功です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/260163/7232a06d-8036-0200-f9c0-9de460f5e89f.png">
npm でエラーが発生しているときはキャッシュを消すと上手くいくことも。

[node.jsで足りないmoduleをインストールするコマンドをインストールしてみる](http://uraway.hatenablog.com/entry/2015/11/02/node.js%E3%81%A7%E8%B6%B3%E3%82%8A%E3%81%AA%E3%81%84module%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E3%82%A4%E3%83%B3)
これ↑をやろうとしたら、
エラー続きで絶望。

##状況
１．windowsにubuntuをインストール！
２．node.jsを入れる(nvm)
３．npmを入れる(上手く入ってなかったかも?)
４．nodeのバージョンを変えたい

```
$ node use 8.11.4 
```
```
module.js:549
　　throw err;
```
　　→冒頭の記事へ。

##上手くいかなかったやり方
人によってはこれで解決するかも？
それで、この辺を試してみる。
①[npm installでError:EACCESがでたら](http://okoysm.hatenablog.jp/entry/2016/06/11/214459)
②[npmでpermission deniedになった時の対処法[mac]](https://qiita.com/Gaddict/items/8c76d92bd0adec2bfb6a)

上手くいかない…。
自分の場合、
①のほうではディレクトリがusr/localだったのでその方法を試すも
"no such directly"で追い返される。
②のほうを試すも同様にno such directly...

##上手くいったやり方

```
$ npm cache clean -f
```

入力してみると…

```
npm WARN using --force I sure hope you know what you are doing.
```

これでエラーから解放されました。
めでたしめでたし。

何が問題なのかわかる方、
客観的視点もいただけると幸いです。
【Game a Week】４週間目

# Game A Week
1. 一週間（月曜日から日曜日）に一本ゲームをリリースする。
2. 日曜日（まで）に制作したゲームを何らかの手段で公開する。
3. 制作したゲームはGame A Weekが終わるまで改変しては行けない。

# 前置き
先週の作品：[【Game a Week】3週間目](https://qiita.com/hota1024/items/27af314df54b80ec12de)

# 今回作ったゲーム
今回はmicro:bitを手に入れたのでmicro:bitを使ったゲームを作りました。

# 使った技術
| 名前 | 説明 |
|:-:|:-:|
| [micro:bit](https://microbit.org/ja/guide/)  | 小型のコンピューター。傾きセンサーや明るさセンサーなどたくさんのセンサーが付いているのでいろんなことができる。  |
| [Scratch3.0beta](https://beta.scratch.mit.edu)  | Scratchの最新版のbeta版。  |

# ゲームの詳細
今回はmicro:bitの傾きセンサーを利用したゲームを作成しました。
実際に動画で撮って載せる予定でしたが、時間がなくて断念しました。
実際に遊びたい方は
[こちら](https://github.com/hota1024/rollball-microbit)からsb3ファイルをダウンロードできます。
[Scratch3.0beta](https://beta.scratch.mit.edu)で開きmicro:bitにつなげれば完了です。

micro:bitを上下左右に傾けることによってプレイヤーが移動します。赤い障害物に当たるとゲームオーバーです。10秒以内に黄色のコインを取りましょう。

# ４週間目の感想
micro:bit楽しいです。
いろんなセンサーやBluetoothもついているので２台で通信するゲームを作ったりしてます。
2000ぐらいで変えるのでお手軽です。

# 最後に
ここまで読んでいただきありがとうございます。
良ければアドバイスや質問よろしくおねがいします。
【Raspberry Pi 3B/3B+】ラズパイをオーバークロック（OC）しよう

#Overview
Let's over clock

### やってみる

$ sudo raspi-config

6番のOverclockを選択して設定を変更する。
<img width="679" alt="スクリーンショット 2018-09-01 22.10.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/194284/5cdbdb43-e308-a0ab-5b2d-012f0b232414.png">

2018/9/1現在、残念ながら3B+ではOverclockすることができませんでした。
Docker/Docker Composeのインストール

# 概要
今まで触る機会がなかったけど、ついにDockerに触らなくてはならない事になったので自分用メモ。
とりあえずインストールと軽く使って見るところまでをメモ。環境はmacOS 10.13.6。

# Dockerのインストール
* https://docs.docker.com/docker-for-mac/install/
    * 上記URLからインストーラをダウンロードする
    * Docker Storeなるもののアカウントが必要
    * アカウントができたら以下のURLからダウンロードできる
    * https://store.docker.com/editions/community/docker-ce-desktop-mac
* Docker.dmgをダブルクリックしてD&Dすればインストールは完了
* Docker.appをダブルクリックして起動する
* 以下のコマンドを実行して正常にインストールされているかを確認する

```shell
$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:21:31 2018
 OS/Arch:           darwin/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:29:02 2018
  OS/Arch:          linux/amd64
  Experimental:     true
```

# Docker Composeのインストール
Docker ComposeはDockerの構成ツール。
詳しくはよくわからないけど、yamlファイル書けばシステムの構成をかけてコマンド一発でビルドとかができる便利なやつ。

* 以下のコマンドでインストール

```shell
# [version]の部分は最新の安定版とかを指定する
$ curl -L https://github.com/docker/compose/releases/download/[version]/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
```

* 以下のコマンドで確認

```shell
$ docker-compose version
docker-compose version 1.22.0, build f46880f
docker-py version: 3.4.1
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018
```

# Tips
## Bad respose from Docker engine
最初に`docker version`のコマンドを叩いたときに以下のようなエラーが出た

```shell
> docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:21:31 2018
 OS/Arch:           darwin/amd64
 Experimental:      false
Error response from daemon: Bad response from Docker engine # ← この部分がエラー
```

抜き出すとコレ

```
Error response from daemon: Bad response from Docker engine
```

Macの場合、Dockerアプリから「Reset to factory default」ってボタンをクリックすれば治るっぽい。
preferences... > Reset > Reset to factory defaults (上から3つ目のボタン)
<img width="500" alt="スクリーンショット 2018-09-01 17.39.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/65939/49116626-5e47-48f1-60c9-349ccedf80be.png">

## ERROR: Network auto-diagnosis_default declared as external
以下のコマンド叩いたらエラーが出た。

```shell
> docker-compose up --build
ERROR: Network auto-diagnosis_default declared as external, but could not be found. Please create the network manually using `docker network create auto-diagnosis_default` and try again.
```

エラー文言の通りに以下のコマンドを叩いたら治った。

```shell
$ docker network create auto-diagnosis_default
```

# Dockerを使ってみた所感
いろいろ便利。Docker Composeはいいね。
ただ、Dockerは最低限必要な状況のみで使っていきたいね。
コンテナ型と言っても起動は遅いし、HMRもローカルでやるよりもっさりしてる。
※ フロントエンドの開発だけだったらVM立ち上げる必要もないし
Affinity Designerの画面をiOSでライブプレビューする方法(無料)

1. [Skala Preview](https://bjango.com/mac/skalapreview/)というアプリをmac, iPhoneにインストール(2018年9月1日時点では無料)
2. macとiPhoneを同一のWi-Fiにつなぎ，アプリを起動
3. iPhone側から接続したいmacを選択
4. Affinityで開きたいアートワーク，オブジェクトを選択，iPhoneにプレビューが表示される
5. mac側のアプリで左下の矢印ボタンから「Send All Images...」を選択しておくと画像のサイズによらずプレビューできる．
6. 画像ファイルをアプリにドラッグアンドドロップして開くことも可

画質が粗いことが難点ですが，DropboxやiCloud Driveで同期するよりも簡単にプレビューできます．
マイクロ波レーダーセンサーRCWL-0516を使ってみる

# はじめに
- AmazonでRCWL-0516なる安いマイクロ波レーダーセンサー(中国から到着するまで約2週間程かかるが、1個120円くらい)を見つけて購入してみた。
- こいつはドップラー効果を使って動体を検知する。壁を挟んだ動体でも検知できるらしい。
- これに手持ちのボイスレコーダー(ISD-1820)を組み合わせ、動体検出したら何か喋る回路を作ってみた。

![IMG_1351.JPG](https://qiita-image-store.s3.amazonaws.com/0/283854/1b3fde6f-f5cf-1d23-edbb-8b607aecd1fe.jpeg)

# RCWL-0516の動作チェック
- 先ずは単体でLチカ出来るか軽く動作確認。

## ピン接続

|RCWL-0516|Arduino Nano互換機|
|:--:|:---:|
|VIN|5V|
|OUT|D5|
|GND|GND|

あと、Lチカ用にArduino側のD3/GNDに青色LEDをつないでおく。

## コード

```
int ip = 5;
int val = 0;
int led = 3;

void setup() {
  Serial.begin(9600);
  pinMode (ip, INPUT);
  pinMode (led, OUTPUT);
}

void loop() {
  val = digitalRead(ip);
  Serial.println(val, DEC);

  if(val >0) {
    digitalWrite(led, HIGH);
  } else {
    digitalWrite(led, LOW);
  }

  delay(100);
}
```

## 動作チェック
- 呆気無く動いた。結構感度もいい感じ。

![IMG_1355.JPG](https://qiita-image-store.s3.amazonaws.com/0/283854/f5a17e8c-17ff-75f1-d419-81daebf865de.jpeg)

# ボイスレコーダー(ISD-1820)との接続
- 電源に3Vを入れて、赤いボタンを押すと10秒間の録音が可能。
- PLAYEで最後まで１回再生、PLAYLで最初から強制再生。
- これらは物理スイッチでも、ジャンパPINでも可能。
- 単体でここまでできて200円しない。色々と使えそうなので数個まとめ買いしている。

![IMG_1353.JPG](https://qiita-image-store.s3.amazonaws.com/0/283854/8a08545a-3935-cd70-8e73-25134dc2ff69.jpeg)

## ピン接続

|ISD-1820|Arduino Nano互換機|
|:--:|:---:|
|VCC|3V|
|GND|GND|
|PE|D6|

## コード
- 動体検知したらD6をHIGHにするCodeを追加。

```
int ip = 5;
int val = 0;
int led = 3;
int alert = 6;

void setup() {
  Serial.begin(9600);
  pinMode (ip, INPUT);
  pinMode (led, OUTPUT);
  pinMode (alert, OUTPUT);
}

void loop() {
  val = digitalRead(ip);
  Serial.println(val, DEC);
  digitalWrite(alert, LOW);

  if(val >0) {
    digitalWrite(led, HIGH);
    digitalWrite(alert, HIGH);
  } else {
    digitalWrite(led, LOW);
  }

  delay(100);
}
```

## 結合動作
- バッチリ。軽く動いただけでもしっかり検知する。
- 手軽に好きな言葉を録音＆再生できるので、オモチャとしては最高。
- 子供に与えたところ、ゲラゲラ笑いながら「だるまさんが転んだ」で遊びだした。（笑
- 安いし、簡単だし、こういうのは結構いいんじゃ無いかな。

![IMG_1352.JPG](https://qiita-image-store.s3.amazonaws.com/0/283854/90a44745-2fa4-1b5d-6008-52ac677d24d7.jpeg)


# あとがき
- センサ、ボイスレコーダ共に電源入れたら信号線のIN/OUTで動くだけなので、これらの組み合わせであれば、別にArduinoをわざわざ使わなくてもこの回路は組める。
WEBサーバーとブラウザ間のセッション認証について

PHP初学者です。WEBサーバー（PHP）のセッション機能を使ったログイン処理について勉強しました。雰囲気だけ何となくわかってきたので、WEBサーバーとブラウザのやり取りを会話調でまとめてみました。
僕自身が、こんな雰囲気かなーって程度の理解なので、技術的には多分全然正確じゃないです。あくまで次のステップへ進むためのとっかかりととして、自分用メモとしてまとめてみました。ご了承ください。m(__)m

### はじめての出会い
**ブラウザ**　「ログインが必要なこのサイトにアクセスしよう！サーバーさんはじめまして！ `login.php` をくださいな、っと。」 
**サーバー**　「 `login.php` ですねー。はい、コレでーす。（あっ、`session_start` って書いてあるな... ブラウザさん、セッションID持ってますかー？」
**ブラウザ**　「何それ？おいしいの？」
**サーバー**　「セッションID、お持ちじゃないみたいですねー。OK、じゃあコレ `{00001234}` があなたのセッションIDです。あなた自身の **クッキー手帳** に控えておいてくださいね。それで、これから僕に話しかける時は、かならずセッションIDを最初に伝えてくださーい。」
**ブラウザ**　「わかりましたー！（ **クッキー手帳** にセッションIDを控える...っと。）」

### ログイン処理
**ブラウザ**　「サーバーさん、私のセッションIDは `{00001234}` です。で、サービスにログインしたいのですが...ユーザーIDとパスワードはコレです。」
**サーバー**　「はーい。セッションIDが `{00001234}` の人ですね。。えーっと、ユーザーIDとパスワードは、、あってますねー。じゃあログイン許可しますねー。
（僕、ブラウザさんとのやり取りいちいち覚えられないからファイルに記録しとこう。えーっと...セッションID `{00001234}` のセッションファイルを作成！っと。そして、この人のユーザー名コレで、ログイン許可中ですよ...っと。）

### 会員専用ページを見たい
**ブラウザ**　「サーバーさん、私のセッションIDは `{00001234}` です。で、会員専用ページの `mypage.php` をくださいな。っと。）
**サーバー**　「はーい。セッションIDが `{00001234}` の人ですね。
（えーと、セッションファイルを探してみよう。。あっ、このセッションIDのセッションファイル発見！この人のユーザー名はコレで、さっきログイン許可したって書いてあるな。）
はい、これが `mypage.php` ですよー。」
**ブラウザ**　「サーバーさん、ありがとう」

### ログアウト処理
**ブラウザ**　「サーバーさん、私のセッションIDは `{00001234}` です。で、そろそろログアウトしますねー。ポチッと」
**サーバー**　「はーい。セッションIDが `{00001234}` の人ですね。
（えーと、セッションファイルを探してみよう。。あっ、このセッションIDのセッションファイル発見！この人のユーザー名はコレで、さっきログイン許可したって書いてあるな。ログアウトしたいって言ってるから、もうこのセッションファイルいらないじゃん！削除しよっと！）
ブラウザさん、ログアウト処理しといたから `logout.php` にリダイレクトしといてねー！」
**ブラウザ**　「はーい、 `logout.php` を表示...っと。サーバーさんありがとー。またよろしくねー。」

---
## 参考させて頂いたリンク
- [Qiita - 【PHP超入門】Cookieとセッションについて](https://qiita.com/7968/items/ce03feb17c8eaa6e4672)
- [Qiita - PHPによる簡単なログイン認証いろいろ](https://qiita.com/mpyw/items/bb8305ba196f5105be15)
- [Qiita - Basic認証とフォームによる認証についてのまとめ](https://qiita.com/toshiya/items/e7dcc7610b15884b167e)
- [しもた帳 - 認証の種類や認証の分類](https://shimota.app/%E8%AA%8D%E8%A8%BC%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%82%84%E8%AA%8D%E8%A8%BC%E3%81%AE%E5%88%86%E9%A1%9E/)

## 最後に
- 冒頭でも書きましたが、セッションIDのやり取りのタイミングとか、実際には上の描写は正確でないと思います。
- セッションファイルの作成、削除など、サーバー側の処理の詳細はよく理解してませんので、雰囲気で書いてます。
- そして当たり前ですが、ブラウザは「サーバーさんありがとう」とか言いません。フィクションです。
- もし初学者の方で、この記事で雰囲気がつかめたという奇特な方がいらしたら、あとは Qiita やその他の記事で正確に学び直してください。
- Qiita には本当に素晴らしい記事が沢山あって、皆様に感謝です。いつもありがとうございます。
【Raspberry Pi 3B/3B+】ラズパイケースを改造して小型ファンを設置しよう

#Overview
ラズパイに小型ファンを設置して冷やす

###ケースを改造
ケースに電動ドライバーで４つ穴をあけて小型ファンを設置します。
配線は赤色の線が２段目の一番左、黒色の線が上段の左から３つ目に繋げます。

![IMG_4259.JPG](https://qiita-image-store.s3.amazonaws.com/0/194284/ef5b2626-2546-3ef2-939e-0bd52d8991a5.jpeg)

###温度を調べる
【Raspberry Pi 3/3B+】CPU温度をチェックしてみよう
https://qiita.com/BearcubThaw/items/070be8be8dc14e5837f4

$ vcgencmd measure_temp


お疲れ様でした！
【Raspberry Pi 3B/3B+】Visual Studio Codeをインストール

#Overview
ラズパイにVSCodeをインストールする手順

参考サイト
https://code.headmelted.com

### インストール

$ sudo su

$ . <( wget -O - https://code.headmelted.com/installers/apt.sh )

### Code-OSSがインストールされていることを確認
<img width="461" alt="スクリーンショット 2018-09-01 21.45.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/194284/b4e01691-1e18-6656-fe33-0f53e9e8945d.png">

<img width="658" alt="スクリーンショット 2018-09-01 21.47.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/194284/67318c18-a46e-dc9a-9940-5abbf0c23673.png">


お疲れ様でした！
【Raspberry Pi 3B/3B+】アップデート（ソフトウェア更新）

#Overview
ラズパイを最新化する手順です。


###パッケージ情報を最新化
sudo apt-get update

###インストール済みパッケージを最新化
sudo apt-get upgrade

###ディストリビューションを最新化
sudo apt-get dist-upgrade

###ファームウェアアップデート
sudo rpi-update

###再起動
sudo reboot

お疲れ様でした！
サイトの速度改善をしたい？それChromeのAuditsで（だいたい）できるよ！

[GDG DevFest Tokyo 2018](https://gdg-tokyo.connpass.com/event/95307/?utm_campaign=event_message_to_selected_participant&utm_source=notifications&utm_medium=email&utm_content=title_link)で聞いたお話を忘れないうちに備忘録もかねて:relaxed:

# Webサイトのパフォーマンス改善:airplane:
フロントエンドのパフォーマンス測定ってどうやってます？
[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/?hl=ja)を使ったり色々なWebサービスを使ったり、あるいはnpmでツールを入れてみたりしていると思います。
なんですが、このあたりの調査ってGoogleChromeの開発者ツール、Auditsのタブから（だいたい）できちゃいます！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/d2db3dca-2f54-2ea7-5869-04bf013aa600.png)

開発者ツールのこの項目から実行できるので、「Run Audits」を押してぜひ実行してみましょう！

# Auditsで調べられるもの

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/4dce6ec8-b70a-2040-57cf-14933c84acdd.png)

QiitaのTOPページをAuditsしてみた結果です！

- パフォーマンス
- PWA
- アクセスのしやすさ
- ベストプラクティスに則っているか
- SEOへの考慮

Auditsのタブから[lighthouse](https://github.com/GoogleChrome/lighthouse)が起動されて、上記の項目をチェックしてくれます！
どういうチェックが走るのか、というのは[このページ](https://developers.google.com/web/tools/lighthouse/?hl=ja)に全部書いてあります！
画像が最適化されてないとか、jsがレンダリングブロックを発生させてしまっているとかでしょうか、
そういうチェック対象の一覧と対策方法が書いてあるので、これを見ればだいたい解決できてしまいます！

# Performanceが100点の最強のサイト

パフォーマンス改善をする上で中々100点って取りにくいのです。
GoogleのTOPページでも77点だったりするので:pensive:

そんな中、100点を叩き出すサイトを見つけたので貼っておきます:v:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/8baa5478-debf-c5bf-9968-c6264a30a66f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/69843957-3da7-52f0-acc9-a0cc03f17ecb.png)

**SIMPLE IS BEST!!**
[Java]引数とかパラメータとか


https://qiita.com/hp_kj/items/789a7fb7e922745f8bd9#comment-f22f811bbe75340a3f1b
コメント欄にてご指摘いただいたので、仮引数、実引数に関して調べてみました。ありがとうございました！

引数なんて初歩で習ったし。余裕、、とか思ってました。
例えば、

```java:
public static void main(String[]args){
  int x = 10;
  int y = 20;
  System.out.println(add(x,y));
}

public static int add(int x,int y){
   return x + y;
}
```
上記だと自分は理解でできたんです。
add関数に
xの10
yの20が入るんだと。
結果、30が出力されるのだと。

けど、こうなると分からなくなっていました。

```java:
public static void main(String[]args){
  int x = 10;
  int y = 20;
  System.out.println(add(x,y));
}

public static int add(int a,int b){
   return a + b;
}
```

いやいやaとbじゃないよ、add関数に入れたいのはxとyだと。

なので関数をudemyで勉強しました。

結果は、関数の引数はただの入り口である。
というのが結論でした。

例を書きます。

```java:
public static void main(String[]args){
  int x = 10;
  int y = 20;
  System.out.println(add(x,y));
}

public static int add(int a,int b){
   return a + b;
}
```

まずこのコードです。分解します。
した半分です。

```java:
int add(int a,int b){
   return a + b;
}
```

自分の文章力がなさ過ぎます。更に分解します。

```java:
int add(int a){
   return a;
}
```

これで考えます。

このadd関数はint型を引数に使ってくれたらaという名前で使います。
！ここが大事です。

:o: int型を引数に使ってくれたらaという名前で使う。
---------------------------------------------
:x: aという名前のint型のみを引数に使う。
---------------------------------------------

add関数の中ではaという名前で使います。
という意味のint aなんです。
なのでたとえば、

```java:
public static void main(String[]args){
  int x = 10;
  int cccc = 20;
  System.out.println(add(x,cccc));
}

public static int add(int aaaaaaa,int bbbbbbb){
   return aaaaaaa + bbbbbbb;
}
```

これでもいいんです。
main関数では、add(x,cccc)となっていますが、
int型を引数に使ってくれたらaaaaaaaという名前で使う。
---------------------------------------------
なので、xだろうが、yだろうが,ccccだろうが、int型を使ってくれさえすれば返してくれるんです。

途中からadd関数ですらなくなったりしましたが、よんでくださりありがとうございました。
書いていて思いました。動画って伝えやすいんだな。
Vue.jsでカスタムディレクティブ作って正しく名前指定してるのに、[Vue warn]: Failed to resolve directiveになるとき

# 前提

Vue.js 2.5.13

# 結論

大文字のディレクティブ名作っても小文字で評価されるらしい。

# サンプル
## js

```main.js
var app = new Vue({
    el: '#app',
    directives: {
        focusLocal: {
            inserted: function(el) {
                el.focus()
            }
        }
    }
````

## html
```index.html
<input v-focusLocal>
```

## エラー内容 (jsconsole)
```
vue.js:584 [Vue warn]: Failed to resolve directive: focuslocal

(found in <Anonymous>)
```
エラーメッセージの時点で小文字化されてる。

# 参考
## 基礎から学ぶ Vue.js
https://www.amazon.co.jp/dp/B07D9BYHMZ
## カスタムディレクティブ — Vue.js
https://jp.vuejs.org/v2/guide/custom-directive.html
## コンポーネントの登録 — Vue.js
https://jp.vuejs.org/v2/guide/components-registration.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D
ディレクティブ名じゃなくて、コンポーネント名ですが、全て小文字のケバブケース推奨ってことらしい。
計算、数学関連の英単語メモ（Codecademy, Python）

CodecademyのPythonを（無料部分は）全部やりきったので、
そこでちょっと分かりづらいな、とか、日常的には使わんな…という英単語をほぼ自分用にまとめました。自分用なので分類は適当。

#指示
**concatenate** = 連結。`"Hello" + "World"` の+。
**iterate** = 繰り返し
**inclusive** = を含む。between 1 and 15 (inclusive)　=　1以上15以下の数値
**round** = 四捨五入、丸める。
**instantiate** = インスタンスを作成する
**XOR** = 排他的論理和というらしい。へぇ～（分かったふり）2つの2進数を比較して、被ったビット（1）の部分は0にして、被ってないとこはそのまま出力するらしい。1110^101。2番目の1が被っているので、答えは1011になる。


#名詞
**intager** = 整数
**float** = 小数点のある数字
**decimal point** = 小数点
**parentheses** = ()←コレ。
**braces** = {}←コレ。
**string substitution** = 文字列に代入。`print "%02d" % (now.month)`みたいなやつ
**comparators** = 比較( <, >, ==, <=, >=など)
**boolean** = 真偽値
**conditional statements** = 条件文(if, elifなど)
**even number** = 偶数
**odd number** = 奇数
**prime number** = みんな大好き素数。プライムって響きいいですね
**duplicate** = 重複
**variance** = 分散
**standard deviation** = 標準偏差
**syntax** = 構文
**equilateral** = 正三角形


#計算
**mean** = 平均
**median** = 中央値。与えられた数字が７個なら４番目の数字。codecademyでは[1, 3, 8, 10, 17]のmedianを求めろみたいな問題で出てくる。この場合は8。平均と描かれてるサイトもあるけど平均とは全く違う。
**square** = 二乗。四角の面積を求めると考えると覚えやすい。`n ** 2`
**cube** = 三乗。cube（正方形）の体積を求めると考えると覚えやすい。`n ** 3`
**square root** = 平方根。 `n ** 0.5`
**factorial** = 階乗。1からnまでの数の積。
**bitwise** = ビット演算。使い所さん！？と思ったけどゲームの状態管理ってのが一番なるほどなぁと思いました。
**base two** = 2進数
**binary** = 2進数
MYSQL: PHP から認証できない場合

PHP で MySQL に接続しようとすると、 次のようなエラーが出ることがあります。

```
PDOException in Connector.php line 55:
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
```

## 環境

MySQL の バージョン 8 からこのようなエラーが出るようになりました。 私がこのエラーを出した MySQL のバージョンは、 8.0.11 でした。

* macOS High Sierra version 10.13.6
* MySQL 8.0.11 Homebrew

## MySQL 8 からの 2種類の認証プラグイン

MySQL 8 から、 2種類の認証プラグインが使えます。

* mysql_native_password
    * 従来からあった認証プラグインです。
* caching_sha2_password
    * MySQL version 8 から導入された新しい認証プラグインです。

caching_sha2_password は、 安全なパスワードの暗号化、 キャッシュを用いた認証処理のパフォーマンスの向上等のメリットが多いそうで、 MySQL 8 ではデフォルトで caching_sha2_password が使われるようになっています。

しかし、 PHP で新しい接続プラグインがサポートされていないので(いずれサポートされるとは思いますが)、 caching_sha2_password で管理されているパスワードを使って接続しようとするとエラーが出ます。

## PHP で接続できない場合の解決策

どの認証プラグインを使うかはユーザごとの設定です。 次のようにして、ユーザごとの設定を確認できます。

```
mysql> select User, Plugin from mysql.user;
+------------------+-----------------------+
| User             | Plugin                |
+------------------+-----------------------+
| sample_user      | mysql_native_password |
| mysql.infoschema | mysql_native_password |
| mysql.session    | mysql_native_password |
| mysql.sys        | mysql_native_password |
| root             | caching_sha2_password |
+------------------+-----------------------+
5 rows in set (0.01 sec)
```

そのため既存のユーザで接続できるようにする場合は、既存ユーザの設定を変更する必要があります。 新しく mysql_native_password を使うユーザを作成して、そのユーザを使って接続することもできます。

### 既存ユーザの認証プラグインを変更する

次の SQL を実行します。

```sql
ALTER USER sample_user@localhost IDENTIFIED mysql_native_password BY 'PASSWORD';
```

### mysql_native_password を利用する新しいユーザを作る

次のようにして、 mysql_native_password を使うユーザを作成します。

```sql
CREATE USER another_user@localhost IDENTIFIED mysql_native_password BY 'PASSWORD';
```

## サーバのデフォルト設定を変える

新しいユーザを作成する場合、 認証プラグインを指定する必要があり、 デフォルトでは caching_sha2_password が設定されます。 これを、デフォルトで mysql_native_password を利用するよう設定すれば、 認証方式を指定せずにユーザを作成しても mysql_native_pasword が使われます。

my.cnf に次のように記述し、 サーバを再起動します。

```
[mysqld]
default_authentication_plugin=mysql_native_password
```

<small>この記事は[拙ブログ](https://improve-future.com/mysql-php-the-server-requested-authentication-method-unknown-to-the-client.html)からの転載です。</small>