OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 18.04にDockerをインストールする(+docker-composeも)

## アジェンダ

+ 公式ドキュメント
    + https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-repository
    + 上記に沿って作業していく
+ 注意点
    + インストール作業は `iganari` という sudo 可能なユーザで行い、最終的にsudo無しで `docker` を使えるようにする

## repositoryをアップデートする

+  `apt` パッケージのアップデート

```
sudo apt update
```

+ HTTPS経由でrepositoryをやりとり出来るようにするためのパッケージをインストール

```
sudo apt install -y \
     apt-transport-https \
     ca-certificates \
     curl \
     software-properties-common
```

+ Dockerの公式GPG keyを追加する

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

+ repository( stable ) を追加する

```
sudo add-apt-repository \
     "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
     $(lsb_release -cs) \
     stable"
```

+ 再度 `apt` パッケージのアップデート

```
sudo apt update
```

## docker をインストールする

+ インストール・起動

```
sudo apt install -y docker-ce
```

+ 起動確認

```
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-07-09 17:51:00 JST; 58s ago
     Docs: https://docs.docker.com
 Main PID: 3920 (dockerd)
    Tasks: 16
   CGroup: /system.slice/docker.service
           tq3920 /usr/bin/dockerd -H fd://
           mq3935 docker-containerd --config /var/run/docker/containerd/containerd.toml
```

+ プロセスの確認(sudo有)

```
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```


## 指定の一般ユーザでも sudo 無しでdockerを使えるようにする

+ 初期設定では出来ない

```
$ whoami
iganari
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.37/containers/json: dial unix /var/run/docker.sock: connect: permission denied
```

+ 一般ユーザ( `iganari` )をDockerグループに追加する

```
### 確認
$ cat /etc/group | grep docker
docker:x:999:


### 追加
sudo gpasswd -a iganari docker


### 確認
$ cat /etc/group | grep docker
docker:x:999:iganari
```

+ dockerが使用するソケットを一般ユーザでも読み込み出来るようにする

```
sudo chmod 666 /var/run/docker.sock
```

+ プロセスの確認(sudo無)

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

## docker-composeをインストール

+ 最新のバージョンを確認
    + [リリース・ノート](https://github.com/docker/compose/blob/master/CHANGELOG.md)

```
export compose='1.21.1'
```


+  `/usr/local/bin/` 配下にダウンロード

```
sudo curl -L https://github.com/docker/compose/releases/download/${compose}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```

+ 実行権限の付与

```
sudo chmod 0755 /usr/local/bin/docker-compose
```

+ 確認(sodo無)

```
$ docker-compose -v
docker-compose version 1.6.2, build 4d72027
```

以上でやりたいことが出来ました 😉
MacのScreenCaptureをJPEG形式で保存する



# 概要
- Macのスクショって自動的にPNGで保存されちゃうから重いですよね…
- MacのScreenCaptureをJPEG形式で保存したい。
- 割と簡単に保存形式をJPEGに設定できるらしいのでやってみました。

# 設定方法
ScreenCaptureの保存形式の設定はターミナルから行います。
この2行実行するだけです。

```
defaults write com.apple.screencapture type jpg
killall SystemUIServer
```

「デフォルトに戻したい」ってときはこっちです。

```
defaults write com.apple.screencapture type
killall SystemUIServer
```
PostgreSQLで個人的によく忘れてしまうコマンドメモ

以下は備忘録です。MySQLを使うことが多いので、PostgreSQLを久々に使って忘れていたコマンドのメモです。

## データのセーブ、ロード

`\COPY`メタコマンドと`COPY`コマンドを使った方法がありますが、違いとしては、以下です。

* `\COPY`コマンドはデータベース接続したクライアント側でファイルの入出力がされる
* `COPY`コマンドは、PostgreSQLが稼働しているサーバー上のファイルの入出力がされる。


### `\COPY`コマンドを使う場合
* テーブルからファイルにデータを出力する
    * この場合は、すべての項目をダブルコーテーションでくくって、ヘッダーありのcsv形式で出力してくれる。

```
\COPY テーブル名 TO '/path/to/file.csv' WITH CSV HEADER FORCE QUOTE *

# 以下のように任意のSQLを記述してもよい。
\COPY (SELECT カラム名1, カラム名２， FROM テーブル名 WHERE ...) TO '/path/to/file.csv'  WITH CSV HEADER FORCE QUOTE *
```

* ファイルからテーブルにデータを読み込む

```
\COPY テーブル名 FROM '/path/to/file.csv' WITH CSV HEADER
```

### `COPY`コマンドを使う場合

* テーブルからファイルにデータを出力する
    * この場合は、すべての項目をダブルコーテーションでくくって、ヘッダーありのcsv形式で出力してくれる。

```
COPY テーブル名 TO '/path/to/file.csv' WITH CSV HEADER FORCE QUOTE *;

# 以下のように任意のSQLを記述してもよい。
COPY (SELECT カラム名1, カラム名２， FROM テーブル名 WHERE ...) TO '/path/to/file.csv'  WITH CSV HEADER FORCE QUOTE *;
```

* ファイルからテーブルにデータを読み込む

```
COPY テーブル名 FROM '/path/to/file.csv' WITH CSV HEADER;
```

## パスワード設定

* 既存ユーザにパスワード設定

```
ALTER USER ユーザ名 WITH PASSWORD '設定するパスワード';
```

* 新規ユーザ作成時にパスワード設定

```
CREATE USER ユーザ名 WITH PASSWORD '設定するパスワード';
```

## アクセス権限の設定

* 権限の付与(GRANT)

```
GRANT {ALL | SELECT | INSERT | DELETE | UPDATE} ON テーブル名 TO ユーザ名;
```

* 権限の剥奪(REVOKE)

```
REVOKE {ALL | SELECT | DELETE | UPDATE} ON テーブル名 FROM ユーザ名;
```

* 権限の確認

`\dp`メタコマンドで確認。

```
postgres=# \dp
                                    Access privileges
 Schema |    Name    | Type  |      Access privileges      | Column privileges | Policies
--------+------------+-------+-----------------------------+-------------------+----------
 public | hoge_table | table | test=arwdDxt/test+          |                   |
        |            |       | hogehoge=ar/test            |                   |
(1 row)
```

## 起動/停止、設定リロード

* 設定のリロード

```
$ /usr/local/bin/pg_ctl reload
```

* 停止

```
$ /usr/local/bin/pg_ctl stop
```

* 起動

```
$ /usr/local/bin/pg_ctl start
```

* 再起動　

```
$ /usr/local/bin/pg_ctl restart
```
WSLをつかえるようにするまで

# WSLを使いたい!
Windowsのアプリケーションとして, **Windows Subsystem for Linux**(通称 WSL)というものが誕生しています.

## 何ができるの?
Windowsでコンソールというと*コマンドプロンプト*や*Windows PowerShell*などがあげられますが, 
その独特の使用感から, できることならLinuxベースのコンソール(BashやZsh)を使いたい! という方は非常に多いと思います. その希望を叶えてくれるツールがWSLです.

## どんな人におすすめ?
- Bashでの操作に長けている方
- パッケージ管理システムを利用したい方
- 試しにLinux(Ubuntu)のコンソールを使ってみたい方
- etc...

## インストール
### Windowsの設定
WSLをインストールするための前準備として, Windowsの設定を書き換える必要があります.
1. 管理者でWindows PowerShell を開く.
2. 次のコマンドを実行する.

   ```:PowerShell
   Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
   ```
このあとコンピュータを一旦再起動してください.



### WSLをインストール
1. Microsoft Store からUbuntu 18.04をインストールする.  
   [https://www.microsoft.com/ja-jp/p/ubuntu-1804/9n9tngvndl3q?activetab=pivot%3Aoverviewtab](https://www.microsoft.com/ja-jp/p/ubuntu-1804/9n9tngvndl3q?activetab=pivot%3Aoverviewtab)
2. Ubuntu 18.04を起動する.(数分待つ必要あり)
3. ユーザー名とパスワードの入力を要求されるので, これから用いるユーザー名とパスワードを入力する.

### パッケージ管理システムの更新
WSL上で次の二つのコマンドを入力してください.

```
sudo apt update
```
```
sudo apt upgrade
```

これでWSLが使えるようになりました.

## Windows上のファイルの場所
先程作成したユーザーのディレクトリは**/home/UserName/~**に存在しています.
Windowsのフォルダを操作する際には, **/mnt/c/~**にCドライブがマウントされているので,
ここまで移動してから操作を開始してみてください.

# 関連記事
[WSLでmatplotlibやgnuplotでプロットができない](https://qiita.com/ryoi084/items/c4339996c50c0cf39df4)
[VSCode] change-case拡張機能の設定

[change-case](https://marketplace.visualstudio.com/items?itemName=zhengxiaoyao0716.intelligence-change-case)のデフォルト設定で十分に使えるのですが、たまには特別のニーズがある場合は、個別設定で簡単に実現できます。

- change-caseのショートカットキー
  `Ctrl+U`をクリックすると、定義された順番で単語のケースが変わる。
  >例：hogeFuga → HogeFuga → HOGE_FUGA → hoge_fuga → hogeFuga ...

- 設定画面を開く
  Code → 基本設定 → 設定 → ユーザ設定またはワークスペースの設定で下記の設定内容を追加

- change-caseの設定値の確認
  設定画面の設定の検索フィールドに「change-case」を入れると、デフォルト設定が表示される

  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/123446/7dbc1cd4-890f-d5d4-7298-5b53c018c6af.png)

- change-caseの可能な設定値一覧

```
[
    "snake_case",
    "param-case",
    "camelCase",
    "PascalCase",
    "CONST_CASE"
]
```

意味は設定値の見た目のである。

- jsxファイルに下記Ctrl+Uで下記４書類のケース変更を行う

```
"change-case.jsx": [
    "snake_case",
    "camelCase",
    "PascalCase",
    "CONST_CASE"
],
```
DonkeyCar の製作（SunFounder Smart Video Car kit）（旧バージョン2.5.1）

#車体
SunFounder
Smart Video Car Kit for Raspberry Pi with Android App
https://www.sunfounder.com/robotic-drone/smartcar/smart-video-car-kit/rpi-car.html
![RIMG0246.JPG](https://qiita-image-store.s3.amazonaws.com/0/263672/3997a47d-abc2-001f-e980-a1023f2b9dc8.jpeg)
![RIMG0247.JPG](https://qiita-image-store.s3.amazonaws.com/0/263672/a46bbc35-9419-290e-a810-a995b86d48c0.jpeg)
#改造
標準構成のUSBカメラは非対応なのでMIPI-CSI接続の広角カメラに交換
カメラのパンチルト部分を樹脂スペーサで高くする
標準の５V電源ボードは容量不足でラズパイ3の動作が安定しないためレギュレータを増設（写真のラズパイ３の下段の基板）
#プロジェクトの生成
筆者のgitubからファイル一式を入手
$ git clone https://github.com/mituhiromatuura/donkey
テンプレートにpicarを指定
$ donkey createcar --template manage_picar ~/mycar
設定ファイルもpicar用をコピー
$ cp donkey/donkeycar/templates/config_picar.py ~/mycar/config.py
oracle CLOBの項目のバイト数を計算するテクニック

oracle 11g 
# CLOBの項目のバイト数を取得する
## LENGTHB関数を使うと

``` sample.SQL
SELECT 
 LENGTHB(CLOB_COLUMN)
FROM
 TABLE
```
**ORA-22998: マルチバイトのキャラクタ・セットのCLOBまたはNCLOBはサポートされていません**
CLOB型に対するLENGTHBはサポートしていないとのこと

## CHAR型に変換してからLENGTHBを使うと
``` sample.SQL
SELECT 
 LENGTHB(TO_CHAR(CLOB_COLUMN))
FROM
 TABLE
```
**ORA-64203: 宛先バッファは、キャラクタ・セット変換後のCLOBデータを保持するには小さすぎます。**
CHARに変換しようとしたが、LOBサイズがCHAR型のバッファ制限を超えているとのこと

## ならばSUBSTR関数で区切って計算してしまえばいい
``` sample.SQL
SELECT 
 LENGTHB(TO_CHAR(SUBSTR(CLOB_COLUMN,1,1000))) + 
 LENGTHB(TO_CHAR(SUBSTR(CLOB_COLUMN,1001,1000))) + 
 ...
FROM
 TABLE
```
これでうまくいった




# なおCLOBの文字数はこちらで取得できる
``` sample.SQL
SELECT 
 DBMS_LOB.GETLENGTH(CLOB_COLUMN)
FROM
 TABLE
```

残念ながら
DBMS_LOB.GETLENGTHBはサポートされていない

あと文字数*2でいいじゃんっていう記事を見つけたけど
マルチバイト・キャラクタセット的に間違いだと思う
https://www.shift-the-oracle.com/config/multibyte-characterset.html
jsのeventを簡単に登録・削除できるプラグインを作成してみた

# はじめに
プラグインは[こちら](https://github.com/t4chibana/event-switch)
利用例もsample/index.htmlにあるのでよろしければ

# 作成したきっかけ
最近jQuery無しで実装することもそれなりにあり、addEventlistener/removeEventlistenerを毎回書くのもしんどいなと思っていました。
そんな中とある実装で無名関数のremoveEventlistenerを実装しようとしたところ少し詰まりました。jQueryなら.off()を使っているところですね。

色々と調べていたところ、stackoverflowのこの課題にたどり着きました。
[javascript - How to removeEventListener that is addEventListener with anonymous function? - Stack Overflow](https://stackoverflow.com/questions/5660131/how-to-removeeventlistener-that-is-addeventlistener-with-anonymous-function#answer-5660165)

中身を見るとクロージャーを使って無名関数や諸々の設定を保存しておくことによって解決を図っているようです。
しかし、こんなよく使いそうな関数をクロージャーによる管理でいいのかな？と思い至り、面倒に思っていたことも相まって、無名関数も容易に扱えてeventlistenerの記述も簡単にかけるものを作ってみようと思い今回のミニプラグインを作成しました。

# 実装方法や使い方など
stackoverflowの回答にあった方法論は理解できたので、これを参考にしつつ保存しておく関数やイベントタイプはコンストラクタに持たせ、event登録処理などはprototypeに登録することで作成しました。

ただ、このままでは元を少し書き直したくらいで自分で作る意味もないのでqueryselectorAllの対応、add/removeの別オプション対応、イベントの状態情報提供などを追加した上で最適化しjQueryライクに書けるよう作成しました。
核となる部分は以下のような感じです、まぁごくごく普通のクラス作成で特に小難しいテクニックなどはありません。

```js
  var EventSwitch = function(target, type, listener, option){
    this.listener = listener;
    this.target = target;
    this.type = type;
    this.option = option || false;
    this.isActive = true;
    this.switch('on');
  }
  EventSwitch.prototype.switch = function(order){
    var _this = this;
    var option = _this.option;
    var listenerType = order === 'on' ? 'addEventListener' : 'removeEventListener' ;
    _this.isActive = order === 'on' ? true : false ;
    if(_this.option.isArray){
      option = order === 'on' ? _this.option[0] : _this.option[1] ;
    }
    if(typeof _this.target === 'string'){
      Array.prototype.slice.call(document.querySelectorAll(_this.target)).forEach(function(element){
        element[listenerType](_this.type, _this.listener, option);
      });
    }else{
      _this.target[listenerType](_this.type, _this.listener, option);
    }
  }
```

実際の使い方は以下のような形で一応目標にしていた簡易的な管理は出来るようになったかなと思います。

```js
//登録
var clickEvent = esw('.trigger','click',function(event){ console.log(event); });

//削除
clickEvent.switch('off')

//再登録、アタッチ
clickEvent.switch('on')

//イベントが機能しているかどうか（boolean）
clickEvent.isActive
```


# おわりに
最近OSSに興味があり、あまり大層なものは書けないですが普段つまづく事が多い内容はこまめにアウトプットして作れていけたらなと思います。
もしイベント管理面倒だなと思ったらぜひ使ってみてください。
JS初心者のメモ：パラメータ

ES6からパラメータ定義に新たな機能が加わった。

## Rest Parameters
```javascript
function sumParameters(...parameters) {
    let sum = 0;
    for(let i = 0; i < parameters.length; i++) {
        sum += parameters[i];
    }

    return sum;
}

sumParameters(1,2,3); // 6
```
`...`をパラメータ名の前につけることで不特定数のパラメータを配列として関数内で使用することが可能。ただし*rest parameter*はパラメータ定義の最後尾でないといけない。

```javascript
function sumParameters(first, ...parameters) {
    // コード
}

sumParameters(1,2,3); // 5

function sumParameters(first, ...parameters, last) {
    // コード
}

sumParameters(1,2,3); // SyntaxError
```

## Default Parameters
他の言語同様、パラメータに既存値を設定することが可能。

```javascript
function greet(name, greeting = 'Hello') {
    message = greeting + ' ' + name;
    console.log(message);
}

greet('John');           // Hello John
greet('George');         // Hello George
greet('Ringo');          // Hello Ringo
greet('Paul', 'Thanks'); // Thanks Paul 
```
Python + h5py で HDF5 ファイルの読み書き

```python
# encoding: utf-8


import h5py


# 書き込むデータ
x = 100
a = [1, 2, 3, 4, 5]

# 書き込み
with h5py.File('output.h5', 'w') as f:

    f.create_dataset('x', data=x)
    f.create_dataset('a', data=a)

# 読み込み
with h5py.File('output.h5', 'r') as f:

    print(f.keys())      # => ['a', 'x']
    print(f['x'].value)  # => 100
    print(f['a'].value)  # => [1 2 3 4 5]
    print(f['a'].shape)  # => (5,)
    print(f['a'].dtype)  # => int64
    

# グループを作成する
with h5py.File('output_group.h5', 'w') as f:

    f.create_group('hoge')
    f['hoge'].create_dataset('x', data=x)
    f['hoge'].create_dataset('a', data=a)

    # これで以下のようなグループとデータセットが作成される
    #
    # output_group.h5 --- Group 'hoge'
    #                      |
    #                      +- Dataset 'x'
    #                      |
    #                      +- Dataset 'a'

    # 他の書き方
    f.create_group('fuga')
    f.create_dataset('/fuga/x', data=200)
    f.create_dataset('/fuga/a', data=[10, 20, 30, 40, 50])
    # この場合 create_group は省略可
    # '/fuga/x' の先頭のスラッシュは省略可 ('fuga/x' で OK)
    
with h5py.File('output_group.h5', 'r') as f:

    print(f['hoge']['x'].value)  # => 100
    print(f['hoge']['a'].value)  # => [1 2 3 4 5]

    # 他の書き方
    print(f['fuga/x'].value)  # => 200
    print(f['fuga/a'].value)  # => [10 20 30 40 50]
    # ここでも '/fuga/x' の先頭のスラッシュは省略可 ('fuga/x' で OK)
```

- h5py は pip でインストールする。公式ドキュメントは <http://docs.h5py.org/en/latest/index.html>。
- コンテキストマネージャ (with 文) を使わない場合、自分で `f.close()` する。書き込み時にはクローズする前に `f.flush()` してメモリバッファの内容をストレージに書き込む (`close()` 実行時に暗黙に呼ばれるらしいけど、未検証)。
- `File` のモードと挙動

| モード   | 挙動 | 既存ファイルあり | 既存ファイルなし |
|---------|---|---|---|
| r       | リードオンリー |       | エラー |
| r+      | 読み書き      |       | エラー |
| w       | 書き込み      | 上書き | 新規作成 |
| w- or x | 書き込み      | エラー | 新規作成 |
| a       | 読み書き      | 上書き | 新規作成 |

- HDF5 の詳細は <https://support.hdfgroup.org/HDF5/>、<http://yukisakamoto.hatenablog.com/entry/20130413/1365825028>、<http://villageofsound.hatenadiary.jp/entry/2014/10/29/021605> を参照。
YYPHP#42「フレームワークどれがいい？OSSでissue･PRを送る、PHPでファイル圧縮したZIPファイルが解凍できない、Google Mapの使い方、PWA・SSR、テストコードを美しく書く方法」

これは2018年06月29日に開催したPHPerイベント[YYPHP#42]のイベントレポートです。

[YYPHP]は一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催はほぼ**毎週**、高田馬場にて。

[YYPHP#42]:  https://yyphp.connpass.com/event/90139/
[YYPHP]: https://yyphp.connpass.com/
YouTubeでの配信映像はこちら-> [YYPHP #42【PHPの情報交換・ワイワイ話そう・仲間作り・ゆるめ・にぎやかめ】 - https://youtu.be/Mb6LCjjYSVM)

![](https://qiita-image-store.s3.amazonaws.com/0/889/0051f99f-b555-6064-fcc9-3280e5543a1a.png)

# 参加者11名(リモート7名)
* 1年未満: 4名
* 1年: 1名
* 2年未満: 2名
* 5年: 1名
* 10年以上: 3名

## フレームワークどれがいいですか？
* 導入しようとしているフレームワークの候補は？
    * CakePHPはいいのかなと思って本を買った
    * Laravel
* どっちが初心者にとっつきやすいか？
    * フレームワークアンケート
        * Laravel
        * 独自フレームワーク
* Laravel
    * はじめはドキュメントを読み込んだ
    * なれてくると直感的な書き方ができるというだけあって、読みやすいコードになると思う。(1年くらい使った感想)
    * これまでのYYPHPで出てきた意見で多かったのは
        * 「Laravelでいいのでは」
    * ウェブアプリでよく必要になりがちな機能が最初から入ってるので早い
        * Railsは自分でgemを探して入れないといけない
            * 認証とか
* CodeIniter
    * これはフレームワークではなくライブラリ

## OSSでissue/PRを送ると半年くらい放置されることがあるが、どうしたらいいと思う？
* php本体
* 一度閉じてもう一回openする
    * GitHubはメールが飛ぶから

## PHPでファイル圧縮したZIPファイルが解凍できない→解決
* PHPエラーメッセージがZIPファイル(出力)に出ていたため、ダウンロードしたファイルがZIPファイルになっていなかった。
    * https://gootablog.com/php-zip-download
* 画面じゃなくてログにエラーを出すようにした方がデバッグしやすい
## Google Mapの使い方でソースコード見てほしい
* Google Mapでルートを出す地図を実装した。2ルート出したいが1個しか出ない。
* 変数のスコープと非同期処理

## PWA・SSR
* PWAとは？
    * スマホからウェブサイトにアクセスできるけど、ウェブサイトらしさがぬけないが、それをアプリっぽく見せて、UXを上げるためのもの
* PWAで大事なこと
    * SSL(Secure Socket Layer)化
    * manifest.jsonを追加してホーム画面に追加できるようにすること
    * Service Workerでキャッシュ化とオフライン対応
    * SSR(Server Side Rendering)
* 他にGoogleがチェックリストが出してるが、全部やらなくてもいい
* Google Chromeの開発者ツールでLight Toolが実装されているので、簡単のチェックできる。
* Push通知はSafari対応がされていない

## コードレビュー
* 利害関係があるときのコードレビュー
    * 受発注関係があるとき
* ミャンマーは人件費が安い(1ヶ月1万円)
    * 技術レベルは3年プログラミングをやったことある人
* Laravelの機能を上手に使ってない
    * Authを使って下さい
    * 教えてくれないと分からないので、ネイティブな書き方になります
* php-cs-fixer
* php Code Sniffer
* 形式的なことはわりとカバーできる
* 設計能力とコーディング能力は別もの
* [PSR-2に準拠した PHP コードを書いてみて気づいたこと | バシャログ。](http://bashalog.c-brains.jp/15/08/13-100000.php)
* 最近のはやり
    * もみ消された例外をどうやってあぶり出すか

## テストコードどうやったら美しく書けるか
* [あなたのPHPのコード品質を高めるテストツール8選【2017年版】 - WPJ](https://www.webprofessional.jp/8-must-have-php-quality-assurance-tools/)
* PHPUnit 2人
* Behat 1人
* Laravel Dusk 1人
* Kahlan 良さそう
* テストコードを先に書いてレビューしてから実装したほうがいいかも
* テストコードにも事前に設計が必要かも
    * 無策で書いていくとあとあと重りになってしまう

## YYPHPは毎週やってます

PHPについてワイワイ話したい方は、[YYPHPのイベント情報](https://yyphp.connpass.com/)をチェックしてみて下さい。

以上、YYPHPのレポートでした。次回もワイワイやっていきたいと思います！ では、また来週！
DonkeyCar の製作（TAMIYA TT-02）（旧バージョン2.5.1）

#シャシ
![RIMG0255.JPG](https://qiita-image-store.s3.amazonaws.com/0/263672/4ab4c41c-b17b-9cd9-7644-6550d510a8c8.jpeg)
ユニバーサル基板は秋月電子通商の片面ガラス310mm×228mmをカット
基板上の部品はGF-01と同じ
#ボディ
![RIMG0238.JPG](https://qiita-image-store.s3.amazonaws.com/0/263672/6acc8f5d-48a7-8b78-b2e3-f367e483626b.jpeg)
タミヤ 1/10RC ポルシェ911 GT3カップカー タイプ997 塗装済みボディセット （ブラック）

#プロジェクトの生成
筆者のgitubからファイル一式を入手
$ git clone https://github.com/mituhiromatuura/donkey
テンプレートにtt-02を指定
$ donkey createcar --template manage_tt-02 ~/mycar
設定ファイルもtt-02用をコピー
$ cp donkey/donkeycar/templates/config_tt-02.py ~/mycar/config.py
PHPとJavascriptとMySQLの曜日コード

#MySQLで日付型から曜日を取得する

MySQL上で日付型から曜日を取得できる関数は２つあります。

##DAYOFWEEK(date)

戻り値

|code|曜日|
|---|---|
|1|日曜日|
|2|月曜日|
|3|火曜日|
|4|水曜日|
|5|木曜日|
|6|金曜日|
|7|土曜日|

##WEEKDAY(date)

戻り値

|code|曜日|
|---|---|
|0|月曜日|
|1|火曜日|
|2|水曜日|
|3|木曜日|
|4|金曜日|
|5|土曜日|
|6|日曜日|

#JavascriptのDate.getDay()の戻り値

戻り値

|code|曜日|
|---|---|
|0|日曜日|
|1|月曜日|
|2|火曜日|
|3|水曜日|
|4|木曜日|
|5|金曜日|
|6|土曜日|

#PHPのdate('w')の戻り値

戻り値

|code|曜日|
|---|---|
|0|日曜日|
|1|月曜日|
|2|火曜日|
|3|水曜日|
|4|木曜日|
|5|金曜日|
|6|土曜日|

#曜日コードを揃えたい場合（PHP,Javascriptベース）

|言語等|関数|
|---|---|
|php|date('w')|
|Javascript|Date.getDay()|
|MySQL|DAYOFWEEK(date) - 1|

※ただし下記のビット演算を使用したい場合は全てに+1しておいた方が好都合。

#曜日コードを揃えたい場合（複数選択のビット演算想定ベース）

|言語等|関数|
|---|---|
|php|date('w') + 1|
|Javascript|Date.getDay() + 1|
|MySQL|DAYOFWEEK(date)|


#やりたいこと = 曜日を複数選択して保持したい & 該当曜日かどうか判定したい

やりたいことはよくある定休日とかの曜日判定ですが、上記は全部ばらばら。。

* SQLにあまり頑張らせたくないのでJavascript側で加工は頑張る想定でコードはMySQLベースで考える。
* 複数選択された曜日はholidaysとしてMath.pow(2, [1:日曜日~7:土曜日] - 1)の和を保持する。
* MySQLのWEEKDAY(date)はコードの最小値が月曜日なので面倒。対応しない。

で、こうやってみる

```javascript:dateが複数選択された曜日か判定.js
!!(holidays & Math.pow(2,date.getDay()))
```

MySQL上だとこんな感じ

```SQL:MySQLでsysdate()が複数選択された曜日か判定.sql
set @holiday := 7;  // 1:日曜日、2:月曜日、4:火曜日が複数選択された想定。
select @holiday & (dayofweek(sysdate()) - 1);  // 0なら複数選択外。0以外なら複数選択内。
```

色々書いてみたけど結局ビット演算の使用例でしかないのかなこれ。。
Go のテストで Spanner を使う

現時点では Spanner のエミュレータが提供されていないので、e2e テストやレポジトリレベルのテストを書く際は実際に Spanner に接続してテストしており、その覚書がこちら。
また `Abort` など Spanner を叩いて初めて得られる問題もあるのでエミュレータ提供されてもやはり実際の Spanner を使ったテストは必要そう。

## TL;DR

手元でテストする際は開発者ごとに専用のデータベースを払い出しておき、それを使う。
スキーマは必要に応じて開発者自身がリセットする。

テストコードで作成したデータは、`tearDown` の処理で全削除する。

CI でテストする際も同様だが、データベース作成の時間を短縮したい場合はスキーマのハッシュとデータベースを紐付け払い出すような管理ツールを仕込んでおくと良い。

## セットアップ

```go

func (c *AdminClient) CreateDatabaseWithStatement(ctx context.Context, name string, statements []string) error {
	operation, err := c.admin.CreateDatabase(ctx, &admindbpb.CreateDatabaseRequest{
		Parent:          c.config.Parent(),
		CreateStatement: fmt.Sprintf("CREATE DATABASE `%s`", name),
		ExtraStatements: statements,
	})
	if err != nil {
		return err
	}
	if _, err := operation.Wait(ctx); err != nil {
		return err
	}

	return nil
}
```

CreateDatabase の CreateStatement に DDL を渡してデータベースと同時にテーブル作成も行う。ここを個別の RPC コールでやると待ち時間が増加するので同時にやる。

tear down に使う truncate を用意する。

``` go
func (c *AdminClient) Truncate(ctx context.Context) error {
	var m []*spanner.Mutation

	for _, t := range Tables {
		m = append(m, spanner.Delete(t, spanner.AllKeys()))
	}
	_, err := c.client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
		return txn.BufferWrite(m)
	})
	if err != nil {
		return err
	}

	return nil
}
```

```go
defer require.NoError(t, client.admindb.Truncate())
```

テストで必要となるデータを map で定義して突っ込めるような関数もあると便利。

```go
func MustCreateMutation(table string, structs interface{}) []*spanner.Mutation {
	var ms []*spanner.Mutation
	switch k := reflect.TypeOf(structs).Kind(); k {
	case reflect.Map:
		mrv := reflect.ValueOf(structs)
		for _, k := range mrv.MapKeys() {
			v := mrv.MapIndex(k)
			m, err := spanner.InsertStruct(table, v.Interface())
			if err != nil {
				panic(err)
			}
			ms = append(ms, m)
		}
	case reflect.Slice:
		rv := reflect.ValueOf(structs)
		for i := 0; i < rv.Len(); i++ {
			m, err := spanner.InsertStruct(table, rv.Index(i).Interface())
			if err != nil {
				panic(err)
			}
			ms = append(ms, m)
		}
	default:
		msg := fmt.Sprintf("unsupported type: %s", k)
		panic(msg)
	}
	return ms
}
```

## クレデンシャル

ローカルでは個人の Application Default Credential を使う。

CI 環境ではサービスアカウントを使う。
発行した Service Account のクレデンシャルを CI にシークレットとして埋め込んでおき実行時に渡す。

```yaml
  environment:
      GOOGLE_APPLICATION_CREDENTIALS: /etc/google/application-credentials.json
# ..略..
  - &set_project_credential
    name: Set Project Credential
    command: |
      mkdir -p /etc/google/
      echo ${DEV_CREDENTIALS} > ${GOOGLE_APPLICATION_CREDENTIALS}
```

## おまけ

### os.Exit と defer

`os.Exit` が呼ばれると defer が実行される前に終了する。
次のようにすると回避できる。

```go
func TestMain(m *testing.M) {
	// ...
	os.Exit(func() int {
		defer func() {
			// here's termination processes
		}()
		return m.Run()
	}())
}
```

### 並列実行とデータの食い合い

テストはパッケージ毎に並列実行されるので複数で `TestMain` を呼んで Spanner に書き込み、削除を行うような規模にテストが広がると並列で実行されるテストがそれぞれ同時にデータを書き込み / 削除し始め、動作が壊れ始める。

`-p 1` にしてシリアルに実行させると現象が収まるので確認に使える。
実際の回避方法として現実的なのはデータベースを分ける、データベースへの読み書きを必要とするテストはひとつ所に押し込めて単一パッケージ内でテストを行う、といったのもになる。
Active StorageのN+1問題を解決する

## はじめに
Active Storageを用いて画像を呼び出す際にN+1問題に直面したんで、解決方法を書き残しておきます。Active Storageの概要は[こちら](https://railsguides.jp/active_storage_overview.html)からどうぞ。

## with_attached_attachment_nameを使う
Active Storageには`with_attached_attachment_name`というスコープが存在します。
`with_attached_attachment_name`内では`includes("#{name}_attachment": :blob)`のように関連付けられたblobをincludeしています。**以下のbookを例に見ていきましょう。**

```model/book.rb
class Book < ApplicationRecord
  has_one_attached :book_image
end
```

`has_one_attached`メソッドを使ってActive Storageに`book_image`をアタッチメントしました。これにより`with_attached_book_image`というスコープが作成されます。この`with_attached_book_image`を`all`の代わりに使用します。

### `all`でBookを全件取得した場合
```controller/book_controller.rb
class BooksController < ApplicationController
  def index
    @books = Book.all
  end
```
![スクリーンショット 2018-07-09 16.19.25.png](https://qiita-image-store.s3.amazonaws.com/0/81341/8f5ec46d-8d8f-8ff6-e70f-fb504ca276d0.png)
案の定N+1問題があります。

### `with_attached_book_image`でBookを全件取得した場合
```controller/book_controller.rb
class BooksController < ApplicationController
  def index
    @books = Book.with_attached_book_image
  end
```
![スクリーンショット 2018-07-09 17.16.40.png](https://qiita-image-store.s3.amazonaws.com/0/81341/74ecc924-c8d2-fcd4-d241-4b69c5683c04.png)
N+1問題が解決します。

## まとめ
Active Storageを扱う際は関連付けられたblobをincludeする`with_attached_attachment_name`を使いましょう。
JS初心者のメモ：Javascript関数

Javascriptに於いて関数はとても重要なコンセプト。他の言語とは異なる特徴や使い方を持つ。まず初めに関数定義にもいくつか方法があるので紹介したいと思います。

## Function declaration
```javascript
function logMemo(memo) {
   console.log(memo);
}
```
もっともシンプルな定義の仕方。`function`キーワードの後に関数名、カンマ区切りでパラメータを定義、そして`{}`内に処理を入れる。同ステートメント内に定義以外のステートメントは入れられない。他の言語でも使われている定義の仕方。

## Function expression
```javascript
document.body.addEventListener('click', function() {
    console.log('Clicked!');
})
```
や

```javascript
return function() {return true;};
```
または

```javascript
var myFunc = function() {};
```
これらを*function expression*と呼ぶ。*Function declaration*との大きな違いは別ステートメント内に存在することだ（return ステートメント内に定義されてるなど）。またfunction declarationと違って関数名がオプショナル。

## Arrow function
ES6から*arrow function*が登場しました。*fat arrow*（=>）と飛ばれるオペレータを使うことで関数をより端的に定義することが可能です（他にも利点はある）。

```javascript
// パラメータなし
var func1 = () => console.log('Func1');
// パラメータが一つ
var func2 = message => console.log(message);
// パラメータが二つ以上
var func3 = (message1, message2) => console.log(message1+message2);
// 処理がブロックコードの場合
var func4 = (message1, message2) => {
    var message = message1 + message2;
    return message;
}
```
インクルーシブなモーダルダイアログの5つの条件

#インクルーシブなモーダルダイアログの5つの条件
1. モーダルダイアログが立ち上がったら、そのモーダルダイアログにフォーカスが移動する
2. モーダルダイアログに適切な名前がついていて支援技術がそれをモーダルダイアログだと認識できるようになっている
3. 閉じるボタン、escキーやモーダルダイアログの外側をクリックやタップすることでモーダルダイアログを閉じることができる
4. モーダルダイアログによって隠されているコンテンツはアクセス不可能な状態になっていてフォーカスが移動しない
5. モーダルダイアログが閉じられた時には、フォーカスがコンテツ上の元あった場所に戻る

# 実装サンプル

* [WAI-ARIA Authoring Practices 1.1 Modal Dialog Example](https://www.w3.org/TR/wai-aria-practices/examples/dialog-modal/dialog.html)
* [Modal · Bootstrap](https://getbootstrap.com/docs/4.0/components/modal/?)
MSX VRAM

パターンジェネレータに登録し、パターンネームを表示する。

- MSX-BASIC

```smile1.bas
10 defint a-z
20 dim g(7)
30 for i=0 to 7:read d$:g(i)=val("&b"+d$):next
40 data 00111100
41 data 01000010
42 data 10100101
43 data 10000001
44 data 10100101
45 data 10011001
46 data 01000010
47 data 00111100
50 screen 1
60 for i=0 to 7:vpoke i,g(i):next
70 vpoke &h1800,0
```

- z88dk

```smile1.c
/*
zcc +msx -lndos -create-app smile1.c
bload"cas:",r
*/

#include <msx/gfx.h>

#define BYTE unsigned char

void main()
{
	BYTE g[] = {0x3c, 0x42, 0xa5, 0x81, 0xa5, 0x99, 0x42, 0x3c};

	set_mode(mode_1);
	vwrite(g, 0, 8);
	vpoke(0x1800, 0);
}
```

- MSX-BASICの実行例

![WMSX Screen.png](https://qiita-image-store.s3.amazonaws.com/0/257554/fc6be12b-82de-bc40-87ab-82617f0ca124.png)
boxのファイル権限付与方法

## はじめに

box([https://www.box.com/ja-jp/home](https://www.box.com/ja-jp/home))の権限付与の方法を記載いたします。

## boxの権限の種類

boxにはフォルダやファイルに付与できる権限は以下の３つがあります。
a) このフォルダ内のユーザ
b) 会社のユーザ
c) リンクを知っている全員

「a) このフォルダ内のユーザ」は、フォルダに参照権限があるユーザしか参照できません
「b) 会社のユーザ」は、企業でboxを契約している場合、その会社のユーザは全て参照することができます
「c) リンクを知っている全員」は、そこのフォルダやファイルのリンクを知っていれば、boxにログインしなくても（boxのユーザがなくても）アクセスすることができます

## 共有用のリンク
フォルダやファイルをシェアするリンクは、以下の画面の赤四角の箇所をクリックすることで参照できます。

I)フォルダの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239309/2a0c2697-7b4b-5146-f70b-c7369b92b413.png)

II)ファイルの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239309/89ba423a-9b4a-d87e-8156-83d152faf489.png)

上記のボタンを押すと、下の画面が出てきて、共有用のリンクが確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/239309/32b0a366-7975-836f-cd40-bdf5230cc90c.png)

以下が共有用のリンクになります。
```
https://XXX.box.com/s/XXXXXXXXX
```
なお、注意する点として、
<font color="Red">ブラウザで表示されているリンクを使っても、他の人は参照することができないケースがありますのでご注意ください。</font>

## 権限の付与

先ほどの共有用のリンクの画面上で、「このフォルダ内のユーザー」ボタンをクリックすると、
アクセスの種類を選択することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/239309/32b0a366-7975-836f-cd40-bdf5230cc90c.png)

ここで「会社のユーザ」や「リンクを知っている全員」など他の権限方式に変更することができます。

## 「リンクを知っている全員」権限について
「リンクを知っている全員」に設定した場合、その共有用のリンクを知っていれば誰でもアクセスできてしまい、機密データの場合セキュリティ上問題になるケースがございます。<font color="Blue">boxユーザを持たないメンバーと機密データをやり取りする場合は、セキュリティの観点でzipファイルなど暗号化ファイルを利用してファイルを共有し、パスワードは別途メールで送るなど工夫したほうがいいかもしれません。</font>

## さいごに
boxは大容量のファイルを共有する際とか、ファイルのバージョン管理とかいった観点で非常に有益ですので、ぜひ権限付与方法をマスターして、チーム内のドキュメント管理を効率化しましょう。
参考になりましたら、幸いです。
fopen: failed to open stream: Is a directory

## 環境
* Amazon Linux 2
* PHP 7.2.5
* Apache/2.4.33

## 発生状況
ブラウザからサーバにファイルをアップロードした際に発生

## 今回の発生原因
アップロード対象データが、
1. POSTデータに許可される最大サイズを超えていたため
2. アップロード可能なファイルの最大サイズを超えていたため

## 今回の解決策
php.iniを以下を満たすよう修正
memory_limit > post_max_size > upload_max_filesize > アップロード対象データのサイズ

## 参考
http://php.net/manual/ja/ini.core.php

## その他
エラーが解消されたら是非いいねお願いします
強化学習をKeras-RLで実装したい(mac環境)

##前段階として最低限のものをインストール
**pythonのバージョンは3.5.0を使用しています
python 2系だと僕はうまく稼働しなかったので参考にしてください**
以下のサイトを参考にさせていただきました
<https://qiita.com/takeruw/items/3540c1c618d5459195ad>

###基本的にホームディレクトリで実行する

1. **openAIGym**
2. **Keras-RL**

注）terminalでcd ~と実行して移動した先がホームディレクトリです
##1 openAIGymのインストール
terminalで以下を実行

    git clone https://github.com/openai/gym.git
    cd gym
    pip install -e .
ここで**terminalでpythonを起動**し

    import gym

で問題なければOK！
ここまででopenAIGymをインストールできた．

##次に2 Keras-RLをインストールする
keras-rlを使用する際に**keras,tensorflow,keras-rl**が必要となる
terminalで以下を実行

    pip install keras

    pip install tensorflow

    git clone https://github.com/matthiasplappert/keras-rl.git
    pip install ./keras-rl

実行後に

    python keras-rl/examples/dqn_cartpole.py

でエラーなく動作ができたらOK!
AmazonLinuxでGethをソースコードからコンパイルする

# AmazonLinuxでGethをソースコードからコンパイルする
AmazonLinuxで開発環境を構築をする際、
Gethがyumに対応していないため、ソースコードからコンパイルする方式の手順まとめ。

* OS:Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type - ami-9c9443e3
* インスタンスタイプ：t2.micro （t2.nanoで実施するとメモリ不足になるので要注意）
* Golang：v1.10.3（2018/7/9 最新stable）
* Geth：v1.8.11（2018/7/9 最新stable）


## yumリポジトリをupdate

```
sudo yum update
```

## ソフトウェアのコンパイル準備
make、gccなどの開発ツールをインストール。

```
sudo yum groupinstall "Development Tools"
```

## go インストール
最新版を取りたかったため、wgetでバイナリを落とす。(バージョンの違いはhttps://golang.org/dl/)

```
wget https://storage.googleapis.com/golang/go1.10.3.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz
cd /usr/local/
ls
```

## pathの設定
```
export PATH=$PATH:/usr/local/go/bin
echo $PATH
```

## gethのインストールとコンパイル

```
mkdir src
cd src
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
git checkout refs/tags/v1.8.11
make geth
sudo mv ~/src/go-ethereum/build/bin/geth /usr/bin/
geth version
```

この時、t2.nanoでやったら以下のエラー発生

```
/usr/local/go/pkg/tool/linux_amd64/link: signal: killed
util.go:45: exit status 1
exit status 1
make: *** [geth] エラー 1

```
メモリが足りないようですのでt2.micro以上にスケールアップして、再度makeコマンドを実行する。


## プライベートネットへの接続
gethのインストールが完了したので、プライベートネットへ接続を試す。
データ保管用のディレクトリ作成。

```
cd ~
mkdir eth_private_net
cd eth_private_net
```

json形式の記述したmyGenesis.jsonファイルをeth_private_netに配置。

```
{
  "config": {
    "chainId": 15
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}
```

## genesisブロックの初期化
```
geth --datadir ~/eth_private_net init ~/eth_private_net/myGenesis.json
```

## gethの起動
```
geth --networkid "15" --nodiscover --datadir "~/eth_private_net" console 2>> ~/eth_private_net/geth_err.log
```

プライベート・ネットのGenesisブロックがmyGenesis.jsonに記載されたものになっているのかを確認

```
eth.getBlock(0)
```

既に起動したGethプロセスの操作

```
geth --datadir "/home/ec2-user/eth_private_net" attach ipc:/home/ec2-user/eth_private_net/geth.ipc
macOS でよく見かける拡張属性や ACL

# はじめに

ホームディレクトリで ls -l をしたとき、Linux ではあまりお目にかからないが、macOS ではファイルモードの項目 (所有者・グループ・他ユーザのパーミッションを表す文字列のところ、と言えば理解が早いかもしれない) の末尾にプラス「+」やアットマーク「@」がついているのを目にする。これは ls の man の The Long Format の項目にしっかり書かれてあって、

> If the file or directory has extended attributes, the permissions field printed by the -l option is followed by a '@' character.  Otherwise, if the file or directory has extended security information (such as an access control list), the permissions field printed by the -l option is followed by a '+' character.
> (ディレクトリに拡張属性があるなら、ls -l したときの出力でパーミッションの後に @ がつく。ファイルあるいはディレクトリに拡張セキュリティ情報 (たとえば Access Control List: ACL) があるなら同様にパーミッションの後に + がつく。)

とのことである。なので @ は拡張属性、+ は ACL なのだとまずは理解することができる。となると次に、どのような拡張属性が、あるいは ACL がそこにかかっているのか、が気になるだろうし、それらをどうすれば操作することができるのだろうか、ということが気になるだろう。

# 拡張属性

前述の man にもあるように、拡張属性はファイルもしくはディレクトリにつく。ls -l をディレクトリに対して行うとその下のファイルまで表示されてしまうが、d オプションを指定すると指定したディレクトリの情報のみが表示される。@ オプションをさらにつけると拡張属性を表示してくれる。

```shell
% ls -ld@ Documents
drwx------@ 25 reo  staff  800  7  9 13:46 Documents
        com.dropbox.attributes   82
        com.dropbox.attrs        28
```

同様のことは xattr コマンドでもできる。ls コマンドでは拡張属性を表示するだけだが、xattr コマンドでは拡張属性の操作も可能である。

```shell
% xattr Documents
com.dropbox.attributes
com.dropbox.attrs
```

xattr コマンドで行う拡張属性の修正は xattr のマニュアルを参照していただくとして、これらの拡張属性はアプリケーションによって与えられている場合があるので、xattr コマンドで属性を剥ぎ取ったりせず、アプリケーションの操作 (アンインストールや設定の変更) により属性を変化させることが望ましいかもしれない。

# ACL

ACL も拡張属性と同様にファイルもしくはディレクトリにつく。ACL の内容を表示させるためには ls で e オプションをつければ良い。

```shell
% ls -lde Documents
drwx------@ 25 reo  staff  800  7  9 13:46 Documents
 0: group:everyone deny delete
```

ACL を操作するのは意外にも chmod コマンドである。+a オプションで追加、-a オプションで削除である。たとえばこのように。

```shell
% chmod -a "group:everyone deny delete" Documents
% ls -lde Documents
drwx------@ 25 reo  staff  800  7  9 13:46 Documents
% chmod +a "group:everyone deny delete" Documents
% ls -lde Documents
drwx------@ 25 reo  staff  800  7  9 13:46 Documents
 0: group:everyone deny delete
```
TypeError: _firebase2.default.storage is not a function

# TypeError: _firebase2.default.storage is not a function というエラー発生

import firebase from 'firebase'しているし　firebase.auth()も動くのに

firebase.storage()　だけエラーを吐く


#解決策
import 'firebase/storage'; を追加

npm の firebaseの docsには

```
When using the firebase npm package, you can require() just the services that you use:
```
と書いてあった。

import firebase from 'firebase'だけではrealtime database以外を使えないかもしれない
ABC102（中央値舐めてたらやっつけられた件）

#Atcoder ABC102
7月1日のABC102に出場したので書く。
<b>結果：C問解けなかったよおおおお</b>
そういう訳です。嘆いていてもアレなので書きます。
#問題を解いていた最中
まず、b = 0として、次の式を考えた。理由としては、bを無視してみたらどうなるか見てみたかったから。

```math
f_0=\sum 
\bigl|
A_i - i
\bigr|
```
次に、サンプルを入れて絶対値の中身を項ごとに見ていき、平均とったらいいのかなとか思っていた。
しかし、平均を取ってみてもうまくいかず、色々と迷走した後時間切れとなってしまった。結局中央値という単語すら思い浮かばなかった。
#中央値とは
競技が終わって解説を読んだ僕は、なぜ中央値なのか納得が行かなかったので調べてみた。

```math
\sum
\bigl|
X_i - t
\bigr|
```
突然だが中央値の定義は、上式を最小化するtの事である。また、Xは分布である。
日本語にすると「ある代表値ｔと分布に含まれる各値との距離の和が最小となるときの代表値ｔが中央値」である。

そんな定義だったんだ...数えて真ん中の奴!!!ぐらいの認識でしかなかった...
<b>（完全に中央値舐めてる、タイトル回収）</b>
#中央値の定義を踏まえて問題を解く
さて、中央値についてもちょっとだけ詳しくなったので問題にチャレンジしてみる。
問題の式をfとおく、以下、式変形。

```math
f=\sum
\bigl|
A_i - b - i
\bigr|
```
```math
=\sum
\bigl|
(A_i - i) - b
\bigr|
```

ここで、A_i - i = X_iと置くと、

```math
f = \sum
\bigl|
X_i - b
\bigr|
```
なんか変形していくと上で見た中央値の定義式が出てきましたね。
さて、問題の目的はfを最小化することでした。fを最小化した場合bは中央値になることは定義から明白です。
あとはコードに起こすだけですね、頑張りましょう。

#書いたコード
```c++
#include<bits/stdc++.h>
using namespace std;
const int limit = 200050;

int main(){
	int n;
	cin >> n;

	int a[limit];
	for(int i = 0; i < n; i++){
		cin >> a[i];
		a[i] = a[i] - i - 1;
	}

	sort(a, a + n);

	int b = (n % 2 == 0) ? a[n / 2 - 1] : a[(n + 1) / 2 - 1];

	long long f = 0;
	for(int i = 0; i < n; i++) f += abs(a[i] - b);

	cout << f << endl;

	return 0;
}

```
無事、上記のコードでAC出来ました。
次はもっと頑張りたいですね。
Rails と Vue.js でWebサービスの環境を作ってみた

# はじめに

Railsを勉強し始めて、そろそろオリジナルでWEBサービス（比較サイト）を作ろうと思い、色々と調べつつ構築していったら勉強になったのでメモしていきます。今回は、Rails,Vueを使って開発したかったので、それに合わせた環境になっています。

# 環境

この記事では以下の環境（2018年7月9日時点）で動作確認できました。

- Ruby: 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
- Rails: 5.2.0
- mysql2: (>= 0.4.4, < 0.6.0)
    - mysqlはdockerに作成してあります
    - Docker version 18.03.1-ce
- yarn: 1.7.0
- webpacker: (~> 3.5)
- vue: ^2.5.16

# 参考にしたレポジトリ

プロジェクトを作る上で参考にした、サービスのレポジトリは以下です

- https://github.com/annict/annict
- https://github.com/ogontaro/musom

# プロジェクトの作成

```bash
$ rails new programming-school --database=mysql --skip-test-unit --skip-sprockets
```

- `--database=mysql` : DBはMysqlに指定
- `--skip-test-unit` : testをRSpec使うためにskipします（Rails5 で有効なオプション）
- `--skip-sprockets` : アセットのコンパイルをしてくれるやつ。ビルドツールはwebpackがやるのでスキップ

# DB接続を確認

`config/database.yml`を編集

共通部分（一番上にある設定）にある設定の中の、passwordとhostを任意のに変更しましょう。hostは、`127.0.0.1`だと思います。`127.0.0.1`は自分自身を指す特別なIPアドレスです。

データベースを作成

```bash
$ rails db:create
```

実際に作成されたことが確認できるかと思います。

# slim

## slimの導入方法

```rb:Gemfile
...
gem 'slim-rails'
...
```

他の記述は省略しています。そして、`bundle install`を実行します。

その後、`.erb`を手で、`.slim`に変えました。

# Rubocop

RailsではRubocopというgemを使うことで、プロジェクト全体のコーディング規約のルール化をすることができます。

## Rubocopの導入方法

```rb:Gemfile
...
gem 'rubocop'
...
```

他の記述は省略しています。そして、`bundle install`を実行します。

```bash
bundle exec rubocop -v                                                                                                                                                                                      master
0.58.0
```

確認できました。

## Rubocopの実行

```bash
$ bundle exec rubocop
```

おそらく何個か、`C`と出力されると思います。そこは`Convention`という意味で、修正が必要な箇所を指します。その他に深刻度順で、W（Warning）、E（Error）、F（Fatal）があります。Fが一番深刻です。W以上の警告は必ず対応したほうがいいみたいです。

Rails導入時にデフォルトで配置されているファイルも警告されるので、Rubocopのルールの範囲から除外することもできます。

詳しくは、

http://vdeep.net/rubyonrails-rubocop

# webpacker

Vueを導入するために、webpackerを導入していきます。

## Webpackerとは

Webpackerとは、Webpackを用いてRails上でJavaScript開発をするために必要なモノを提供してくれるgemです。Rails上でVueを実装しようと思うと、YarnやWebpackを使ったりすると、結構手間でったのが問題だったそうです。そこで、Webpackerを用いると、ある程度Railsの開発プロセスにのったJavaScriptの開発ができるみたいです。

これを導入するにあたって、参考になった記事があったので紹介します。

https://techlife.cookpad.com/entry/2017/03/27/161706

## webpackerの導入方法

```bash
bundle exec webpacker:install
```

その後、Vueをインストールします。

```bash
bundle exec rails webpacker:install:vue
```

その後、プロジェクトのルートディレクトリに移動して、

```bash
$ bin/webpack-dev-server
```

を、　`$ Rails s`と並行して実行しておけば、フロント面のコンパイルが早くなります。

---

以上です！

# この記事を読んだ方に

この記事を読んで、誤っている箇所をみつけたり、追記した方がいい内容などありましたら、編集リクエストやコメント欄で指摘していただけると助かります。

# 参考
- https://blog.toshimaru.net/rails-new-options/
- http://vdeep.net/rubyonrails-rubocop
- https://techlife.cookpad.com/entry/2017/03/27/161706
mac0S で LAN 内の使用 IP アドレスを調べる

## arp-scan コマンドのインストール

```bash:
brew install arp-scan
```

## arp-scan コマンドの実行

```bash:
sudo arp-scan -I en0 -l
```

注意1：macOS と linux とでは、インターフェイス名が異なるので注意する
macOS: en0
linux: eth0

注意2：sudo　で実行
ユーザーの権限では、エラーになるので注意する
ionicを業務レベルで使うとどうなるか

昨年に引き続き[あら便利カレンダー](https://benri2018.rnd.cloudpack.jp/)はじめました。
早速ちょっとサボり気味だけどできる範囲でやっていこうと思います。


## 顧客の要望

諸君らにはアプリをつくってもらう！
納期はなる早だ！

まずはiOS、Android対応も今後対応する予定である！
我が社のつくったSDKを組み込んでつくってくれ！
なおデザイン変更は頻繁に入るものとする。
ただし検証用アプリとして作成してもらうため、パフォーマンスなど細かいことには多少は目をつぶろう

というわけで[ionic](https://ionicframework.com/)の導入を決意し、業務レベルで使ってみたので所感を書いていきます。


## よかったこと一覧

| よかったこと | なんでよかったか |
| --- | --- |
| iOS/Android/WindowsPhone/Webに対応 | Web対応が副作用的にレビューにいきてきた |
| ネイティブ連携が容易 | ブリッジ的なコードをちょろっと書くだけでネイティブのコードも実行可能 |
| 中身がAngular on Cordova | 各お作法みたいなものはそれぞれのベースを学ぶことで習得可能 |
| デザイン変更に対応しやすい | HTML/CSSでかけるのでWebエンジニアに優しい |
| ionic native apiが豊富 | カメラやBLE接続など、豊富なプラグインが用意されている |

特筆すべきはWeb対応。
デザインレビューや動作レビューの際にわざわざ配布することなくS3かなんかにぽいってしておけば、そのままレビュー可能！


## わるかったこと一覧

| わるかったこと | なんでわるかったか |
| --- | --- |
| ハマるときはとことんハマる | 日本語はもちろんドキュメントが少ない（特にPluginまわり） |
| プラグイン周りがややこしい | package.jsonやconfig.ymlが汚れやすい |
| IDE２つひらく必要がある | Nativeプラグインを作成する場合、WebStorm or VSCode / Xcode が必要 |
| パフォーマンス調整の幅がせまい | どうしてもWebViewなので、調整できる範囲が極めて狭くなってしまう |

上ではよかったことに書いてるくせに一番ネックになったのは、プラグイン周り。
覚えちゃえばあとは楽だけど、覚えるまでがめちゃくちゃ大変だった...。このあたりはまた別記事かきます。
あと怖いのは、パフォーマンス問題。
今回は起きなかったけど、直面した場合はパフォーマンス改善にほとんど時間もっていかれそうな気も...。


## 結果

導入してみてよかったです！
今回ionicに携わった人がVue.jsしか触ってこなかったけどすんなりと環境構築・開発開始できたし、
何より[Component Documation](https://ionicframework.com/docs/components/)に感動しまくって即導入きめちゃいました。

※ ぜひPCでひらいてみてね
LibreOffice の Calc で Excel ファイルを開いたら、行列のマージでエラーになったので修正する

LibreOffice の Calc で Excel ファイルを開いたら、
以下の様な SMALL 関数でエラーになった。

`=IF(G$1<ROW(),"",SMALL((B:B,E:E),ROW()))`

Excel で上記の様に記載すると、
LibreOffice の Calc で開くと、

`=IF(G$1<ROW(),"",SMALL((B:B~E:E),ROW()))`

と勝手に変換されて、再度 Excel で開くと、エラーとなる。

なかなか情報がなくて困りましたが、
なんとか解決出来たので、シェア。

「,」でも、「~」でもなく、「:」とすると、
うまくいきました。

`=IF(G$1<ROW(),"",SMALL((B:B:E:E),ROW()))`

以上。
DjangoのUnit Testでcsvをmockとして読み込ませる

以下のようにcsvを扱っているコードがあるとする

```python:/hoge/management/commands/example_command.py
import csv
from django.core.management.base import BaseCommand


class Command(BaseCommand):
    
    def handle(self, *args, **options):
        with open(options['file'], 'r', encoding='utf-8') as f:
            reader = csv.reader(f)
            for row in reader:
                // 処理色々
```

この部分のテストコードを書きたい時、わざわざcsvファイルを用意して、っていうのはアレなのでmockでなんとかする必要がある
やり方は色々あるみたいだけれど、自分は以下のような感じでやってみた

```python:/hoge/management/commands/tests/test_example_command.py
import io
from django.test import TestCase
from mock import patch


class ImportHogeHogeTest(TestCase):

    @patch("hoge.management.commands.example_command.open", create=True)
    def test_example_command(self, mock_open):
        mock_open.return_value = io.StringIO(dummy_csv_1)
        // テスト色々


dummy_csv_1 = """1,hoge,hoge_value
2,fuga,fuga_value
3,piyo,piyo_value
4,foo,foo_value
"""
```
上記のようにすると文字列が入った変数 `dummy_csv_1` をcsvファイルとして、 `with open` の返り値とすることができる。
このようにすると、`/hoge/management/commands/example_command.py` の `処理色々` の部分で例えば `print(row[2])`とすると`hoge_value`が返ってくる
SOSL の隠された検索上限件数

[SOSL クエリによって取得されるレコードの合計数はガバナー制限により 2000 件](https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apexgov.htm) となっていますが、
実はドキュメントにも載っていない 250 件という暗黙的な制限も存在します。
検索結果が想定と違う場合は確認してみてください。

##250 件という壁
例えば SOSL で、特定の文字列を含む取引先の ID を取得する場合、

```SQL
FIND 'ここに検索文字列' IN ALL FIELDS RETURNING Account(Id)
```

となりますが、実行すると最大250件の取引先しか取得できません。

##最大 2000 件への道
最大 2000 件取得したい場合は Where 句か ORDER BY 句を記述する必要があります。​

```SQL
FIND 'ここに検索文字列' IN ALL FIELDS RETURNING Account(Id WHERE Id = '000ZZZZZZZZZZZZZZZ')
FIND 'ここに検索文字列' IN ALL FIELDS RETURNING Account(Id ORDER BY Id)
```
RaspberryPiをROM化する

# ファイルシステムをROM化する
組込み用途でRaspberryPiを使うときに考慮すべきなのが、SDカードの摩耗と、正規のシャットダウン手順を踏まない強制的な電源断です。SDカードへの書き込みは、SDカード内のフラッシュメモリの寿命を縮め、強制的な電源断は、最悪、ファイルシステムの破損を起こします。

LinuxのファイルシステムをROM化する方法は色々あるようですが、とりあえず簡単に導入できそうな、overlayfsを使用する方法です。以下のコマンドを淡々と打ち込んでください。カーネルの再構築など不要で、あっという間にできます。

```:INSTALL
cd /home/pi
sudo bash
apt-get install git rsync gawk busybox bindfs
dphys-swapfile swapoff
dphys-swapfile uninstall
update-rc.d dphys-swapfile disable
systemctl disable dphys-swapfile
git clone https://github.com/josepsanzcamp/root-ro.git
rsync -va root-ro/etc/initramfs-tools/* /etc/initramfs-tools/
mkinitramfs -o /boot/initrd.gz
echo initramfs initrd.gz >> /boot/config.txt
reboot
```

再起動が済んだら既にROM化されています。この状態でファイルに書き込むと、RAMを消費してtmpfs（所謂RAMディスク）上に書き込まれるので要注意です。ログファイルなどを無駄に出力しないように設定しておきましょう。

書き込み可能に切り替えるには以下のスクリプトを使います。

```:WR-ENABLE
#!/bin/sh

if [ -e /mnt/boot-ro/config.txt ]; then
    sudo mount -o remount,rw /dev/mmcblk0p1
    sudo grep -v initramfs /mnt/boot-ro/config.txt >/tmp/config.txt
    sudo cp /tmp/config.txt /mnt/boot-ro/config.txt
    sudo reboot
else
    echo Already write enabled
fi
```

書込み禁止に切り替えるには以下のスクリプトを使います。

```:WR-PROTECT
#!/bin/sh

if [ -e /mnt/boot-ro/config.txt ]; then
    echo Already write protected
else
    sudo grep -v initramfs /boot/config.txt >/tmp/config.txt
    sudo echo initramfs initrd.gz >> /tmp/config.txt
    sudo cp /tmp/config.txt /boot/config.txt
    sudo reboot
fi
```
Microsoft Azure 全体価値訴求資料 v3.0

**[更新 2018.08.08]** 以前掲載していた内容 (1～5章) の一部に、最新の情報ではなく、正確性に欠ける部分がありましたので、公開は、Azure サービス内容の説明に限定致しました。

こんにちは、ドクです。
Microsoft Azure 全体価値訴求資料というのを４年くらい前から作っております。

最新バージョン v3.0 についても、一人でコツコツと作成してきましたが、かなり出来上がってきましたので、公開したいと思います。

月に１度くらいは、資料の Update をしておりますので、陳腐化しないのがウリです(笑)...　と言っても、メイン業務が他にありますので、限界はあります…ご容赦ください。

**Microsoft Azure 全体価値訴求資料 v3.0 - 6章 カテゴリー別のサービス説明**
[６章の01　Compute](https://sepub.blob.core.windows.net/doc/Microsoft_Azure_Value_6-01_v3.0.pdf)
[６章の02　Networking](https://sepub.blob.core.windows.net/doc/Microsoft_Azure_Value_6-02_v3.0.pdf)
[６章の03　Storage](https://sepub.blob.core.windows.net/doc/Microsoft_Azure_Value_6-03_v3.0.pdf)
[６章の04　Web & Mobile](https://sepub.blob.core.windows.net/doc/Microsoft_Azure_Value_6-04_v3.0.pdf)
[６章の05　Containers](https://sepub.blob.core.windows.net/doc/Microsoft_Azure_Value_6-05_v3.0.pdf)
[６章の06　Databases](https://sepub.blob.core.windows.net/doc/Microsoft_Azure_Value_6-06_v3.0.pdf)
[６章の07　Analytics](https://sepub.blob.core.windows.net/doc/Microsoft_Azure_Value_6-07_v3.0.pdf)
[６章の08　AI & Machine Learning](https://sepub.blob.core.windows.net/doc/Microsoft_Azure_Value_6-08_v3.0.pdf)
[６章の09　Internet of Things](https://sepub.blob.core.windows.net/doc/Microsoft_Azure_Value_6-09_v3.0.pdf)
画像の領域塗りつぶし

いきなり必要になった画像の領域塗りつぶしのアルゴリズム。

stack じゃなくて queue でも良いはず。
最初再帰で処理した名残。再帰で処理すると stack over flow で死んだ。

```cpp
void fill(int x, int y) {
  struct POINT {
    int x;
    int y;
  };

  std::stack<POINT> stack;
  stack.push(POINT({x, y}));

  while (stack.empty() == false) {
    auto point = stack.top();
    stack.pop();

    // すでに塗りつぶされている点であればスキップ
    if (isAlreadyProecssed(point)) {
      continue;
    }

    // 塗りつぶしが必要か判定
    if (needProcess(point) == false) {
      continue;
    }

    // 塗りつぶし
    process(point);

    stack.push(POINT({point.x - 1, point.y}));
    stack.push(POINT({point.x + 1, point.y}));
    stack.push(POINT({point.x, point.y - 1}));
    stack.push(POINT({point.x, point.y + 1}));
  }
}
```
dockerコンテナ内のタイムゾーンを変更する

# Docker コンテナのタイムゾーンの変更
Docker コンテナでタイムゾーン設定は Dockerfile で特定のタイムゾーンへ変更するよりも、実行時に環境に合わせて外から変更できる方が移植性が高い状態を保つことができます

そのために、コンテナ起動時に ```/etc/localtime``` へ任意のタイムゾーンファイルをアタッチすることで設定します

## タイムゾーンの設定の仕方
タイムゾーンは ```/etc/localtime``` で定義されています
このファイルはシンボリックリンクになっていて、向き先を任意のタイムゾーンファイルに変えることでタイムゾーンが変更されます

```
$ ls -l /etc/localtime
lrwxrwxrwx 1 root root 32 May 29 14:22 /etc/localtime -> ../usr/share/zoneinfo/Asia/Tokyo
```

# Docker コンテナのタイムゾーンを外から設定する
## Docker ホスト側と同じタイムゾーンに設定する
Dockerコンテナを起動するホスト側の ```/etc/localtime``` をコンテナ側に読み取り専用でアタッチすると、ホスト側のタイムゾーンと同じにすることができます

```
$ sudo docker run -it --rm -v /etc/localtime:/etc/localtime:ro ubuntu:16.04 date
Wed Jun 8 20:50:16 JST 2018
```

## Docker ホスト側と別のタイムゾーンを設定する
ホストと別のタイムゾーンに設定したい場合でも、ホスト側に持っている定義ファイルを ```/etc/localtime``` にアタッチすれば OK

```
$ sudo docker run -it --rm -v /usr/share/zoneinfo/America/Los_Angeles:/etc/localtime:ro ubuntu:16.04 date
Tue Jun 8 20:54:16 PDT 2018
```

※元ネタはこちらを参考にしました
https://stackoverflow.com/questions/22800624/will-docker-container-auto-sync-time-with-the-host-machine/22820278#22820278
おすすめWordPressプラグイン

## とりあえず入れとく


- Custom Post Type UI

　カスタム投稿をかんたん作成

- Advanced Custom Fields

　カスタムフィールドをかんたん作成

- Intuitive Custom Post Order

　記事、カテゴリを何でも並び替え。フロントにも反映される

- Custom Post Type Permalinks

　カスタム投稿のパーマリンクをデフォルトから変更

- Default featured image

　「noimage」をかんたん設定

- TinyMCE Advanced

　ビジュアルエディタ拡張　pタグを勝手に外さなくする

- Admin Menu Editor
　ダッシュボードのメニューを自由にカスタマイズできる


## 必要に合わせて


- qTranslate X

　かんたん多言語化

- Contact Form 7

　かんたんフォーム制作

- Contact Form 7 add confirm

　フォームに確認ボタンを加える

- Really Simple CSV Importer

　かんたん記事インポート

- RS CSV Importer Media Add-On

　記事インポート時にアイキャッチも投稿可能。

- Event Organiser

　かんたんカレンダー

- EWWW Image Optimizer

　かんたん画像圧縮　
　※要php5.4以上　5.3以下の場合はCompress JPEG & PNG images
　(API KEY: wqW7oxEaZP64E613Go6CEpxEDaZpryqm)

- WP Admin UI Customize

　ユーザ権限ごとに管理メニューのカスタマイズをするのに便利

- Adjust Admin Categories

　カテゴリをradioボタンにしたり、親カテゴリを選択不可にしたり、必須化する　カスタム投稿にも対応！

- Radio Buttons for Taxonomies

  WordPress（Gutenberg）のカテゴリーやタグをラジオボタンに変更できるプラグイン

- Admin Columns

  管理画面に任意のカラムを追加できる
【UnityEditor】RenderPipelineAssetのインスペクタにGraphicsSettingsを開くボタンを表示させてちょっと快適なSRPライフを

# はじめに
Unity2018.1で<a href="https://blogs.unity3d.com/jp/2018/01/31/srp-overview/">SRP(Scriptable Render Pipeline)</a>が実装されました。

SRPを利用するときに RenderPipelineAssetアセットを使うことになりますが、
これを実際にプロジェクトに反映させるには Project Settings/Graphicsを開くことになります。

<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/c6c53aec-1dc4-fc09-4c6d-cf1c0f7f0359.gif" width = 500>
クリック数が多くて**面倒くさい**ですね。

# Graphicsを開くボタンを表示させよう！　Inspectorに
Graphicsを開くボタンを表示させてみました。<br>

<a href = "https://gist.github.com/rngtm/6e78524280f40b770c020825fc273105">AssetPipelineInspector.cs</a>


<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/fde2aae9-c16a-3e62-464e-520f51531aff.gif" height = 300>

1クリックでGraphicsが開けますね。　**快適**なSRPライフを送れそうです。

<br>

<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/66dad030-6219-7642-d2b2-e8a8ffb5a271.gif" width = 400>

# Editor拡張ノウハウ
インスペクタ拡張を行うときに必ず使用するCustomEditorですが、 第2引数にtrueを指定することで子クラスの拡張ができるようになります。

```
    [CustomEditor(typeof(RenderPipelineAsset), true)]
```

<br>
例えば、以下のようなCustomEditorを書くとMonoBehaviourを継承するすべてのクラスのInspectorを拡張することができます。

```
    [CustomEditor(typeof(MonoBehaviour), true)]
```