OmniAICreator/Qiita-1.07M huggingface dataset:
GoLand のGOROOTにanyenv(goenv)内のgolangを指定する．

## Introduction

友人が atCoder で色々とやっているらしく，誘われたので始めようと思いました．
どうせなら触ってみたい言語の練習もしたいなと思っていたので， "python" か "golang" で迷ったのですが，
今回は "golang" を学んでいきたいと思います．

開発環境は Mac です．

## Problem

[anyenv](https://github.com/riywo/anyenv)を利用して[goenv](https://github.com/kaneshin/goenv)をインストールし，
IDEにはおなじみJetBrains社の[GoLand](https://www.jetbrains.com/go/)を利用します．

ここまでは順調に進みましたが，
プロジェクトをOpenした後，`GOROOT`の設定でつまづきました．

```golang
GOROOT is not defined 
```

この`GOROOT`，通常は自動的に読み込まれるはずなのですが，
私の場合，読み込まれませんでした．
そのため，anyenv の golang を GOROOT に指定しようとしたところ，
Macのファイル選択画面では隠しフォルダにアクセスできません．

## Purpose

そんな時には `Command + Shift + g` を押しましょう．
以下のような画像が現れます．
ここで`anyenv`のパスを指定すれば OK です．

```sh
/Users/[username]/.anyenv/envs/goenv/versions/X.Y.Z
```

![スクリーンショット 2018-03-18 17.19.39.png](https://qiita-image-store.s3.amazonaws.com/0/97131/4bca4f7f-7e5d-d761-69b8-390f5f433829.png)

## Conclusion

解決策を見つけるまでかなり時間がかかりました．
この設定方法，隠しディレクトリを指定したい時に使える便利なコマンドだと思うので，覚えておくといいかもしれません．

### References

- [Macの「開く・保存」ダイアログから、不可視フォルダに移動する隠れ技](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-use-move-to-folder-command-in-a-open-or-save-dialog-in-macos.html)
- [Gogland - Go 言語用 IDE - を使ってみた (2016年12月版)](https://qiita.com/pankona/items/380f8b08e39d469ca94d)
【RSpec】先にallow to receiveを書いて、後から"呼び出されたか"を確認する方法

あるメソッドが「呼び出されたかどうか」をテストする場合、

```rb
it '...' do
  expect(...).to receive(...)

  # 処理
end
```

のように書くと、「処理後に結果を確認する」という一般的なテストの順序と逆になり、「beforeが他のテストと共有できない」「なんだか気持ちわるい」といった問題が発生します。

そんなときは `have_received` を使うとスッキリ書けるかもしれません。

```ruby
class Foo
  def hoge; end

  def fuga
    hoge
  end
end

RSpec.describe Foo do
  let(:foo) { Foo.new }

  describe "Foo#fuga" do
    subject { foo.fuga }

    before do
      allow(foo).to receive(:hoge).and_return("test")
      subject
    end

    it "fugaメソッドを呼び出したとき、hogeが呼び出されること" do
      expect(foo).to have_received(:hoge)
    end
  end
end
```

# 参考URL

https://relishapp.com/rspec/rspec-mocks/docs/basics/spies
dashでプロセス置換を再現する

## 使用例
```
$ diff `pr_sbs echo hoge` `pr_sbs echo fuga`
1c1
< hoge
---
> fuga
```

書き込みの場合

```
$ echo hoge | tee `pr_sbs -w wc -l \> test`
hoge
$ cat test
1
```

エスケープがいる場合

```
$ echo hoge | tee `pr_sbs -w cat \| awk \''{print $1" "$1}'\' \> test`
hoge
$ cat test
hoge hoge
```

## コード
/dev/shmが使えない場合は適当に変更する。
関数化する場合はmktempを使ったほうが良さそう。

```bash:pr_sbs
#!/bin/dash

f=/dev/shm/pr_sbs.$$
rm -f $f
mkfifo $f
echo $f

exec >&-
{
  case "$1" in
  -r) shift
      eval "$@" > $f ;;
  -w) shift
      eval "$@" < $f ;;
  *)  eval "$@" > $f ;;
  esac

  rm -f $f
} &
```

標準出力を閉じないとコマンド置換が突き放し処理を待ってハングする。
仕組み上標準出力はできない。
[node.js]node.js/expressでBASIC認証の実装

# 概要
Herokuにデプロイしたアプリに認証をかけてみたかったのでやってみた。
[Express](http://expressjs.com/ja/) + [Node.js](https://nodejs.org/ja/)を使ったアプリケーションに、BASIC認証を実装します。

# 環境

## Node.js
v9.3.0

## Express
v4.15.5

## npm
v5.7.1

# パッケージをインストールする
まず、[basic-auth](https://www.npmjs.com/package/basic-auth)パッケージをインストールします。

```bash
$ npm install basic-auth
```

# 実装

`auth.js`を作成し、必要に応じてusernameとpasswordを変更します。

```auth.js
const auth = require('basic-auth');

const admins = {
  'username': { password: 'password' },
};

module.exports = function (request, response, next) {
  const user = auth(request);
  if (!user || !admins[user.name] || admins[user.name].password !== user.pass) {
    response.set('WWW-Authenticate', 'Basic realm="example"');
    return response.status(401).send();
  }
  return next();
};
```

`server.js`で呼び出します。

```server.js
const auth = require('./auth');
const app = express();

app.use(auth);
```
【vimめも】 9. 設定(set)系

## 参照

`set` : 規定値と違う値のオプションを全て表示

`set all` : すべてのオプションを表示

`set` + ${オプション} + `?` : 特定のオプションの値を表示

## 設定

`set` + ${オプション} + `&` : 既定値を設定する（既定値に戻す）

`set all&` : すべてのオプションに既定値を設定する（既定値に戻す）

#### ***切り替えオプション***

`set` + ${オプション} : オンにする
`set` + no${オプション} : オフにする

```vim
" 行番号を表示したい時
set number

" 行番号を非表示にしたい時
set nonumber
```

#### ***数値オプション***

`set` + ${オプション} + ` =` ${値} : 値を設定する
`set` + ${オプション} + ` +=` ${値} : 値の分増やす
`set` + ${オプション} + ` -=` ${値} : 値の分減らす

```vim
" タブの画面上での幅
set tabstop=2

set tabstop+=1 " 1増加し3になる
set tabstop-=1 " 1減少し2になる
```

#### ***文字列オプション***

`set` + ${オプション} + ` =` ${値} : 値を設定する
`set` + ${オプション} + ` +=` ${値} : 値を追加する
`set` + ${オプション} + ` -=` ${値} : 値を取り除く

```vim
" <BS>で削除できる対象を設定
set backspace=indent,eol

set backspace-=eol "indentになる
set backspace+=start,eol "indent,start,eolになる
```

## 現在のバッファにのみ適用したいとき

`set`ではなく`setlocal`を使用することで、現在のバッファにのみに適用ができる

```vim
" 該当バッファのみ折り返しなしにする
setlocal nowrap
```

前回:[【vimめも】 8. vimrc](https://qiita.com/r12tkmt/items/e0ee07a478fa37f565ae)
次回:[【vimめも】 10. マッピング](https://qiita.com/r12tkmt/items/b89df403f587216802f1)
【vimめも】 8. vimrc

vimrcとは
起動時に読み込まれる設定ファイル
1行ずつExコマンドとして実行される

## 設定ファイルの設置場所は？

下記の順番で探索され、最初に見つかったものが適用される

#### Windows
1. $HOME/_vimrc
2. $HOME/vimfiles/vimrc
3. $VIM/_vimrc

#### Linux
1. $HOME/.vimrc
2. $HOME/.vim/vimrc

unixとwinでファイルパスが違う....
シンボリックリンクを貼って解決

どういう内容を書くのか、、、
大まかに分けると

- 設定系

```vim
" 行番号を表示
set number
" 行の折り返しをしない
set nowrap
```
- マッピング系

```vim
" 無名レジスタを貼り付け
cmap <S-Space> <C-r>"
" クリップボードを貼り付け
cmap <C-Space> <C-r>*

" 挿入モードを解除
imap <C-Space> <ESC>
" ビジュアルモードを解除
vmap <nowait> <C-Space> <ESC>
```
- 関数系

変数・関数など、自分で好きな機能を用意することができる

```vim
" 関数
function s:foo()
  " 変数
  let l:test = 1
endfunction
" Exコマンド
command! Test call s:test()
```

## 設定方法や設定内容が分からない時

helpを引こう
すべての説明が記載されている

```vim
help 'number'
help :map
help i_CTRL-A
```

## ファイルを切り出すには？

`source` + ${ファイルパス} : Exコマンドをファイルから読み込む

```vim
" set系
source $XDG_CONFIG_HOME/rc/options.rc.vim
" map系
source $XDG_CONFIG_HOME/rc/mappings.rc.vim
```

前回:[【vimめも】 7. コマンドモード](https://qiita.com/r12tkmt/items/d70eaae28160ee9f4d83)
次回:[【vimめも】 9. 設定(set)系](https://qiita.com/r12tkmt/items/f5a99573c80d558aaa43)
汎用バイナリサーチ（二分探索） in PHP

## 目的
初投稿です。よろしくお願いします。

内容は、二分探索自体の説明ではなく、一つの実装の話になります。

なぜPHPで二分探索のような、基本のアルゴリズムを自分で書く、みたいな記事を書くのか、という理由から説明すると、仕事ではWebエンジニアなので、アルゴリズムを自分でフルスクラッチする、ということはほとんどないのですが、最近ちょっとブームに乗って？Atcoderで競プロを初めてみて、何度も書くようなアルゴリズムが上手く整理できてなくて、これじゃダメだ！ということで、自分が使えるはずのアルゴリズムを整理していました。

その中で、二分探索、ソートの条件が変わった時とかに毎回既存のコードからちょこちょこいじるのなんとかならないかなー・・・と思っていたときに、海外のブログ記事で、汎用的なものをみつけて、これいいんじゃない？と思ったので、僕みたいな英語のサイトは毎回後回しにする人向けに記事にしてみようか、と思いました。

## 実装
前置きはここまでで、実装の話に移ります。
内部は普通の二分探索の実装ですが、大小関係を関数内で定義する代わりに、ユーザー定義の比較関数(フォーマットは[usort](http://php.net/manual/ja/function.usort.php)と同じ）を引数に渡すことで、ソートされた配列のソート条件を設定できます。

```php
<?php
/**
 * 汎用binary_search
 *
 * @param array $haystack ソートされた配列
 * @param $start_index - 検索対象の配列のfirst index
 * @param $end_index - 検索対象の配列のlast index
 * @param $needle - 検索したい値
 * @param callable $value_compare_func - ユーザー定義の比較関数
 * @return int　- 見つかったneedleのindex or  -(needleより大きい最小の要素のindex + 1)
 */
function binary_search(array $haystack, $start_index, $end_index, $needle, callable $value_compare_func)
{
    $low = $start_index;
    $hi = $end_index - 1;

    while ($low <= $hi) {
        $mid = (int)(($hi - $low) / 2) + $low;
        $compare = call_user_func($value_compare_func, $haystack[$mid], $needle);

        if ($compare < 0) {
            $low = $mid + 1;
        } elseif ($compare > 0) {
            $hi = $mid - 1;
        } else {
            return $mid;
        }
    }
    return -($low + 1);
}
```


## 使用例
宇宙船演算子の貴重なusageなので積極的に推していくスタイル。
PHP5.6などで使えない場合などは3項演算子などを使っても良いと思いますが、あるものは使いましょう。
下記の例は、ascとdescだけなので、この程度なら関数内で書いても良いですが、特殊なソート条件の時はより有効になると思います。

```php
$asc = [2, 4, 6, 8, 10, 12, 14];

//存在する要素
$idx1 = binary_search($asc, 0, sizeof($asc), 6, function ($a, $b) {
    return ($a <=> $b);
});

//存在しない要素
$idx2 = binary_search($asc, 0, sizeof($asc), 5, function ($a, $b) {
    return ($a <=> $b);
});
echo $idx1 . "\n";  //2 →　asc[2]=6である。
echo $idx2 . "\n";  //-3 →　asc[2] が5より大きい最大の要素である。（0の時に区別できないので-1されている。）

$desc = [14, 12, 10, 8, 6, 4, 2];

$idx3 = binary_search($desc, 0, sizeof($desc), 6, function ($a, $b) {
    return -($a <=> $b);
});

echo $idx3 . "\n";  //4 →　desc[4]=6である。
```

## 参考
All purpose binary search in PHP
https://terenceyim.wordpress.com/2011/02/01/all-purpose-binary-search-in-php/

## まとめ
比較関数を引数として渡すのと、見つからなかった時に`null`とかではなく、境界値をちゃんと返却するのが実装のポイントになっていますね。
連想配列のキーに関するソートだったり、特殊な比較条件のソートだったり、目的の値自体が存在しなくても境界値とりたかったり、等の要件を満たせたりして、わりと便利なのではないでしょうか。
当たり前のことかもしれないですが、汎用的なモジュール(今回は関数一つですが）を作っておくと、他でベタに実装しているコードをコピペしてちょっと直せば使える！って感じで雑に中を書き換えて上手く動かない！ってことがなくなって便利ですね

PHPで競プロ(\*´ω｀\*)ﾊﾔﾙ？
SourceTreeでコミットログを変更する方法

## 方法

1. 上部のツールバーから「コミット」を選択
2. コミットログ入力欄右上の「コミットオプションを指定…」を選択
3. 「最新のコミットを修正」を選択
4. コミットログを修正して「コミット」ボタンを押下

![1_コミットを選択.png](https://qiita-image-store.s3.amazonaws.com/0/165884/b77ed006-9c2b-e59d-3675-d77a3105a354.png)

![3_最新のコミットを修正.png](https://qiita-image-store.s3.amazonaws.com/0/165884/98bd3606-8ea0-c63e-6694-0c60fb23be39.png)

## 雑記

随分前からだと思うのですが、「対話形式でリベース」してコミットを取りまとめた場合にコミットログの日本語が文字化けする状態になっています。

SourceTree上でコミットログを変更する方法(--amend)相当の操作を知らなかったので、リベース後にGitBashを使って都度変更してました。
今は上記方法にてSourceTreeだけで操作が完結出来るようになりました。

…というか、「対話形式でリベース」した時に文字化けしなければそれが一番良いのですが…
どなたか解決方法をご存じの方が居ましたらご教授頂けると助かります。
csv-stringifyを使用するとdatetimeがエポック秒(UNIX時間)になる

#csv-stringifyを使うとエポック秒(UNIX時間)になる
##背景
lambdaがサポートしているnodeがv6.10のためそれを使用
csv形式で共有したい
sequelizeを使用していたためcreatedAt,updatedAtカラムがあり両方ともdate型
それ以外のカラムは日付情報を持っていない

## csv-stringifyの基本的な書き方
```
const stringify = require('csv-stringify')
stringify([data], [options], [callback])
 
//例
stringify(data, (err, output)=>{
  console.log(output)
}
```

##エポック秒(UNIX時間)からYYYY/MM/DD形式への変換
```
require('date-utils');
const stringify = require('csv-stringify')

stringify(
    data,
    {
        formatters: {
            date: function(value) {
               return value.toFormat("YYYY/MM/DD")
            }
        }
    },
    (err, output)=>{
         console.log(output)
    }
);
```
###注意点
returnのあとを変更すればmomentも使うことができる
今回はdate-utilsを使用してくれという指示だったので使用
option:formattersのオプションdateを使いvalueのformatを指定していく
dateはカラム名ではない
date型全て変換してしまうためこの方法では個別指定はできない

####個別指定をしたい場合
option:columnを使用してoutputをゴニョゴニョするしかない
DeepLearning勉強用メモ

自分用のメモ．あまり参考にはなさらぬよう...

# 何を勉強するか
これを勉強しようとしている
https://www.oreilly.co.jp/books/9784873117584/

## 環境構築
### 概要
homebrew環境下にpyenvを導入し，python3.xを導入．
### Python3.X on MacOS
pyenv, python3.6.4のインストール

```shell
$ brew install pyenv
```

パス・環境変数の設定

```shell
$ echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```
標準でpython3.Xが動作するように設定．


```shell
$ pyenv install 3.6.4
$ pyenv global 3.6.4
```

### ライブラリのインストール
Numpyのインストール

```shell
$ pip install numpy
```
すると，下記メッセージが出力された．

```
You are using pip version 9.0.1, however version 9.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```
ので，思考停止して下記を実行

```shell
$ pip install --upgrade pip
```
pipのバージョンが古かったようだ．
【vimめも】 7. コマンドモード

コマンドモードとは`:wq`などの`:`を押した際のコマンドを入力するモード
コマンドモードでの実行コマンドのことを**Exコマンド**と呼ぶ

## コマンドモード

- `<C-b>` : 行頭へ移動
- `<C-e>` : 行末へ移動
- `<C-h>` or `<BS>` : カーソルの前の文字を１文字削除
- `<Del>` : カーソルの後の文字を１文字削除
- `<C-w>` : カーソルの前の単語を削除
- `<C-u>` : カーソル位置から行頭までを削除
- `<C-r>` ${レジスタ} : レジスタの内容を貼り付け
- `<C-c>` : コマンドモードを終了

## 過去のコマンド

#### コマンドモード

- `<Up>` : 1つ前のコマンドを表示（入力）
- `<Down>` : 1つ後のコマンドを表示（入力）
- `his` or `history` : Exコマンドの履歴を一覧表示（閲覧のみ）

#### ノーマルモード

- `q:` : 過去のコマンドを一覧表示し<CR>で実行。編集を行うことも可能

## 外部ファイル

設定やマッピングなどもExコマンドから行う
例)
`set number`
`nnoremap d "_d`

前回:[【vimめも】 6. 複雑な繰り返し処理](https://qiita.com/r12tkmt/items/4f48da7a0154dbc5ad38)
次回:[【vimめも】 8. vimrc](https://qiita.com/r12tkmt/items/e0ee07a478fa37f565ae)
[Ruby]コメントアウトとバックスラッシュ記法

#コメントアウトの書き方とバックスラッシュの書き方を忘れるのでメモっとく
##コメントアウトの書き方（Mac）
commandキー ＋ /キー　で # シャープが出ます。
##バックスラッシュ記法（Mac）
ortionキー ＋ ¥キー　で \ バックスラッシュが出ます。
##バックスラッシュの使い方
\n　で改行
\t　でタブ
\n　でバックスペース
\ \　でバックスラッシュ
##参考文献
[[Ruby]バックスラッシュ記法によるエスケープとは？](https://i-b-c.jp/how/ruby/ruby%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E8%A8%98%E6%B3%95%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%81%A8%E3%81%AF%EF%BC%9F/)
MESHハブからwebhook経由でshellを叩いてラズパイ版のソフトウェアタグを実現する

# はじめに
スマホのMESHアプリには、カメラタグ等のスマホの機能が使えるソフトウェアタグがありますが、Raspberry Pi版では、ソフトウェアタグはないので、Raspberry Pi版ソフトウェアタグを、MESHハブでも実現させる。

# 準備
MESHハブのセットアップ済みRaspberry Pi 3
iPhone or iPad

## bottleのインストールと実行
node.jsでもよいのですが、手っ取り早く、bottleを使いました。

```
$ pip3 install bottle
```
今回は、http://localhost:8080/cameraを叩いたら、camera.shが起動するようにしてみました。

```server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from bottle import route, run, template
import requests
import subprocess


@route('/camera')
def camera():
    cmd = u'/home/pi/camera.sh'
    subprocess.call(cmd.split())
    return template('/camera requested')


run(host='localhost', port=8080)

```

サーバーを起動して、MESHレシピからのリクエストを待ちます。

```
$ python3 server.py
```

## MESHカスタムタグの作成
次に、呼び出す、MESHの準備です。
カスタムタグを作成します。

```
var localhost = 'http://localhost:8080' + properties.path;
ajax({
  url: localhost,
  type: 'get',
  timeout: 5000,
  success: function(contents) {
    log(contents);

    callbackSuccess({
      resultType: 'continue',
    });
  },
  error: function(request, errorMessage) {
    log('ERROR: ' + errorMessage);
    callbackSuccess({
      resultType: 'continue',
    });
  }
});
return {
  resultType: 'pause'
};
```

## MESHレシピの作成
parameterに、パスを指定するようにしてます。

![2018-03-18 14.47.26.png](https://qiita-image-store.s3.amazonaws.com/0/33647/835c8d0e-020c-5b83-34a6-ca900c529351.png)




# まとめ
MESHレシピからRaspberry Piのシェルを叩けるので、いろいろなことが可能となります。
MESHアプリをスマホで動かすよりもとにかく安定してますし、MESHタグのバッテリーが少なくなったら通知も来るし、ラズパイ版を使いだしたら、やめられませんね。
ぜひ、お試しください。
Firebase(Angularfire2)でビルドした時だけinvalid-api-keyエラーが出る場合

`ng serve`で動作している際は問題なく、buildしてそこから起動すると以下のようなエラーが出ました。

```text
ERROR Tr {code: "auth/invalid-api-key", message: "Your API key is invalid, please check you have copied it correctly."}
ERROR Error: Uncaught (in promise): Error: Your API key is invalid, please check you have copied it correctly.
```

<img width="835" alt="D8E6DB7221E95C778BA8A0335903CAB9.png" src="https://qiita-image-store.s3.amazonaws.com/0/39233/49200c06-7f2a-dca6-6c94-14d50cc5c9b9.png">

firebaseの設定も特に問題なくキーなどが間違っているということもありません。
解決には以下のissueがヒントになりました。

<https://github.com/firebase/quickstart-js/issues/145>



Angularfire2ではenvironment.tsにキーを記載するようにドキュメントに書かれているのでその通りに従っています。
なのでenvironment.tsに記述するのですが、HMR用にenvironment.hmr.tsや本番用にenvironment.prod.tsなどと複数のファイルにまたがっていて、同じ記述を複数の箇所にする必要があります。

なので一つのファイルにキーをまとめてそれをimportするようにしていました。

```typescript:firebase.ts
export default {
  apiKey: "xxx-xxx",
  authDomain: "xxx.firebaseapp.com",
  databaseURL: "https://xxx.firebaseio.com",
  projectId: "xxx",
  storageBucket: "xxx.appspot.com",
  messagingSenderId: "xxx"
};
```

```typescript:environment.ts
import firebase from './firebase';

export const environment = {
  production: true,
  hmr: false,
  firebase
};
```

このようにしていたのですがこれだと前述したエラーが発生しました。



ネットワークのリクエストを見る感じFirebaseへリクエストをかけて認証が弾かれたのでエラーを出しているという感じではなく一切のリクエストをせずにエラーが出ているようでした。
何らかの静的解析で弾かれているだろうということで、一旦importではなく直接以下のように変更したところ問題なく動作するようになりました。

```typescript:environment.ts
import firebase from './firebase';

export const environment = {
  production: true,
  hmr: false,
  firebase: {
    apiKey: "xxx-xxx",
    authDomain: "xxx.firebaseapp.com",
    databaseURL: "https://xxx.firebaseio.com",
    projectId: "xxx",
    storageBucket: "xxx.appspot.com",
    messagingSenderId: "xxx"
  }
};
```



調べにくく結構何時間もハマりました
【Blockchain】dein.vimでSolidityにシンタックスハイライトを適用する

イーサリアムでスマートコントラクトを作成する際に使われる`Solidity`ですが、`dein.vim`でシンタックスハイライトを付けようとしても意外と文献が見つからなかったのでメモ。

`.vimrc`に以下を追記して、`vim`を立ち上げるだけでいけます。

```vim
  call dein#add('tomlion/vim-solidity')
```

※使用しているパッケージのgitは以下から。
- [tomlion/vim-solidity](https://github.com/tomlion/vim-solidity)
 
※本記事は`dein.vim`を入れている前提なので、まだ導入していない方は下記リンクを見ながら`dein.vim`を入れてください。
- [dein.vimを使ってみる](https://qiita.com/yoza/items/2f8bd33a18225754f346)
Reloadしたモジュールについての注意点

インポートしたモジュールのソースを変更して、その変更を実行しているセッションに反映したいとき、モジュールを `importlib.reload()` (Python3) でリロード出来ますが、

* リロードした前後のモジュールは同一オブジェクトですが、
* リロードした前後のモジュールで定義されていた関数は別オブジェクト
* リロードする前の関数が実行されるグローバル変数は更新後

となる点に注意が必要です。以下、サンプル例です。

更新前が次のコードだったとします。

```python:reloadtest.py

def foo(n):
    """Return 0 for all n >= 0"""
    if n == 0:
        return n
    else:
        return foo(n - 1)

def baz(n):
    """Return True"""
    return True
```
インタラクティブセッションで、次のように`foo`を調べておきます。

```
>>> import reloadtest
>>> dir(reloadtest)
['__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 'baz',
 'foo']

>>> foo = reloadtest.foo
>>> baz = reloadtest.baz
>>> foo(0)
0
>>> foo(2)
0
```
次に、先ほどのモジュールを更新して、下記の変更をくわえます。

```python:reloadtest.py

def foo(n):
    """Return 1 for all n >= 1"""
    if n == 1:
        return n
    else:
        return foo(n - 1)


def bar(n):
    """Return 2 for all n >= 0"""
    if n == 2:
        return n
    else:
        return foo(n)
```
次からは、モジュールのリロードとその後の挙動を調べたセッションです。
更新前後のモジュールオブジェクトは同一であることが次から分かります。

```
>>> from importlib import reload
>>> newmodule = reload(reloadtest)
>>> newmodule is reloadtest
True
```

``reloadtest``モジュールのグローバルには、更新後のソースにはない`baz`が残っていることが分かります。

```
>>> dir(reloadtest)
['__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 'bar',
 'baz',
 'foo']
```
更新前後の``foo``は、異なる関数オブジェクトであることが分かります。

```
>>> foo is reloadtest.foo
False
```

最後のポイントですが、古い``foo``を実行すると、古いコードオブジェクトが実行されていますが、
``foo(2)``は、新しい関数の結果です。つまり、古い関数の中の``foo``は、新しい``foo``
を指していることがわかります。

```
>>> foo(1)
0
>>> foo(2)
1
```

特に`inspect`ライブラリのを用いて`getsource`など、オブジェクトのソースを取得する関数は、オブジェクト自体にはソースは保存されておらず、呼ばれた時点で保存されているファイル名と行番号を頼りにソースファイルを見に行くためリロード前に定義されていた古いオブジェクトに使用すると、更新後ソースを見に行き、オブジェクトに保存されているcode objectとは対応しなくなります。

``__main__``の``foo``、``baz``は、ともに更新前の古い関数ですが、``foo``は更新後のソース
``baz``は、更新前にあった場所に定義された別の関数``bar``をとってきてしまっています。

```
>>> import inspect
>>> print(inspect.getsource(foo))
def foo(n):
    """Return 1 for all n >= 0"""
    if n == 1:
        return n
    else:
        return foo(n - 1)
>>> print(inspect.getsource(baz))
def bar(n):
    """Return 2 for all n >= 0"""
    if n == 2:
        return n
    else:
        return foo(n)
```
【vimめも】 6. 複雑な繰り返し処理

キーの一連の操作を記録して実行できる機能（マクロのようなもの）

## 記録を開始する
- `q` + ${0-9a-zA-Z"} : 記録状態になりタイプした文字をレジスタに記録する

## 記録を終了する
- `q` : 記録状態を解除する（記録の終了）

## 記録を実行する
- `@` + ${0-9a-z".=*+} : レジスタの内容を実行する。`3@a`のように前に数字をつけることで、複数回連続して実行もできる

## 注意点!!
レジスタに登録するため、ヤンクなどで同じレジスタを使用すると上書きされてしまう。
どのレジスタを何に使うかなどは考えながら使おう

## 【使用例】

#### ***各行に同じ操作を行いたい時***

```ruby
foo #<=ここの行頭にカーソル(normalモード)
bar
baz
qux
```

`qa` : aレジスタでレコーディング開始

`0` : 行頭に移動
`v` : ビジュアルモード
`e` : 単語の末に移動
`y` : ヤンク
`<S-i>` : 行頭から挿入モード
`def ` : 文字を挿入
`<C-[` : 挿入モードを抜ける
`o` : 1行追加し挿入モード
`  p "` : 文字を挿入
`<C-r>"` : 無名レジスタの内容を貼り付け
`<C-[` : 挿入モードを抜ける
`end` : 文字の挿入
`<C-[` : 挿入モードを抜ける

`q` : レコーディング終了

```ruby
def foo
  p "foo"
end #<=カーソルここの行末
bar
baz
qux
```

`j` : 次の行に移動
`@a` : aレジスタに記録した内容を実行

```ruby
def foo
  p "foo"
end
def bar
  p "bar"
end #<=カーソルここの行末
baz
qux
```

`j` : 次の行に移動
`@@` : 前回と同じ記録を実行
`j` : 次の行に移動
`@@` : 前回と同じ記録を実行

```ruby
def foo
  p "foo"
end
def bar
  p "bar"
end
def baz
  p "baz"
end
def qux
  p "qux"
end
```

前回:[【vimめも】 5. insertモード・visualモードの基本的な操作](https://qiita.com/r12tkmt/items/185a32637c1d7463d728)
次回:[【vimめも】 7. コマンドモード](https://qiita.com/r12tkmt/items/d70eaae28160ee9f4d83)
[WIP]実装の自由度を確保して配列シャッフルの事後条件を書けるか？

「[配列のランダムシャッフルと形式的証明](https://qiita.com/ryohji/items/caf3c313b48fca1e265f)」で、１以上の要素を格納する配列（と乱数列）を渡すと、その配列要素から生成しうる順列のうちいずれかを返す関数（と、その実装）を示した。

しかし著者は、先の記事に掲げた事後条件は **制約が強すぎる** と考えている。

本記事では著者が感じている問題を述べる。そして、いつかこの問題を解決したい。

#配列シャッフルの形式的仕様
まず先行記事に掲げた配列シャッフルの事前条件と事後条件およびプログラムを再掲する。

```text
{P: b=B ∧ |r|=|b|-1 ∧ |b|>0}
n:= |b|
do n≠1 →
  p:= r[n-2] mod n
  b[p], b[n-1]:= b[n-1], b[p]
  n:= n-1
od
{Q: b=foldr (λ(r,n) b → swap(b, n-1, r mod n)) B (zip r [2..])}
```

ここで `swap(b, i, j) = (b; i:b[j]; j:b[i])` であり `foldr` は Haskell の関数定義を借用しているものとする。

このプログラムは配列要素を並べ替える範囲を _後ろから_ 順に狭めていく。

##別のシャッフル定義
前掲のプログラムとは逆に、配列要素を並べ替える範囲を _前から_ 狭めていくことができる。

```text
{P: b=B ∧ |r|=|b|-1 ∧ |b|>0}
i:= 0
do i≠|b|-1 →
  o:= r[i] mod (|b|-i)
  b[i], b[i+o]:= b[i+o], b[i]
  i:= i+1
od
{Q: b=foldl (λb (r,i) → swap(b, i, i + r mod (|b|-i))) B (zip r [0..])}
```

前から後ろから、交互に範囲を狭めていくような別の定義も考えられる。

#実装の自由度を含めた事後条件

**TBD**

友人からは決定的には記述しにくいので確率を含めて定義してみてはどうか、といった提案をもらっている。

`{Q: b=perm(B)}` としつつ以下のような制約を別途掲げてはどうか、というアイデアももらっている。（これで証明がどうなるのかは、まだ考察できていない）

```text
bool v[|b|]
v[i]:= false for all i
while (v[i] = false for some i)
    v[random()] := true
```

前の章に掲げた `Q` は実装の詳細を規定してしまっている。つまりプログラマーの設計の楽しさを奪っている、ような気がしている。

全ての順列のうち、いずれかを返すという制約を明示しつつ、しかし実装の詳細までは縛らない、そのような事後条件の書き方を探していきたい。

#参考書籍
- The Science of Programming（プログラミングの科学）
PowerPointで背景画像を固定したいとき

#毎回背景画像を設定するのが面倒...
LTやるときに資料を作ると思いますが、
私はPowerPointを使ってLT資料を用意しています。

最近はLTやることがだんだん多くなって来たというか、
LTをやる数を増やしていて、
毎回0から作るのは面倒だからMyTemplateを作っていまして、
その際にいくつか調べてやっと見つけた**背景固定**をちょっとメモとしてまとめておこうかと。

## 環境

* **MacBookPro** / macOS Siera: 10.12.6
* **PowerPoint for Mac** / Version: 15.30

## スライドマスターとやらを使う

* どこかわからんから検索
![スクリーンショット 2018-03-18 13.59.18.png](https://qiita-image-store.s3.amazonaws.com/0/82601/0fa41a6a-5f15-99aa-2ee4-ced92b836aa0.png)

手取り早いのは、ヘルプから検索してツール見つけるのが早いですね。
検索するときは、**スライドマスター**ではなく、**スライド マスター**と「スライド」と「マスター」の間にスペース入れて検索しないとちゃんと出てこなかった。

* 「スライド マスター」を選択

![スクリーンショット 2018-03-18 13.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/82601/78c8c4bd-d71a-e6c0-439d-d8ed8cec84bd.png)

　

* 背景の画像を固定する

![スクリーンショット 2018-03-18 13.59.30.png](https://qiita-image-store.s3.amazonaws.com/0/82601/897efdfa-2314-6b10-8492-758e6e8a9e2f.png)

* 右クリから「背景の書式設定...」を選択

![スクリーンショット 2018-03-18 13.59.37.png](https://qiita-image-store.s3.amazonaws.com/0/82601/265213ff-b497-76c6-e0f2-54f30f833690.png)

* 「図の挿入元」を選択して好きな背景画像を選ぶ

![スクリーンショット 2018-03-18 13.59.56.png](https://qiita-image-store.s3.amazonaws.com/0/82601/9b2b8cb3-18cb-adfe-4f20-82de6d5a65d7.png)

* 「すべてに適応」を選択して、各スライドに同じように設定させる。

![スクリーンショット 2018-03-18 14.00.00.png](https://qiita-image-store.s3.amazonaws.com/0/82601/053742ec-3541-160b-86c0-bc878be6d97e.png)

* 「マスターを閉じる」で適応

![スクリーンショット 2018-03-18 14.00.15.png](https://qiita-image-store.s3.amazonaws.com/0/82601/2cf789b7-48df-afb8-e9e1-73252da34954.png)



## MyTemplateを保存
「ファイル」>「テンプレートとして保存...」を選択して、資料のテンプレートを増やしていこー！


## まとめ
もう資料を0から作りたくはない...w
[Ruby]メソッドputs、p、printの戻り値について

#puts、p、printの戻り値が違うのでメモっとく
##putsの実行結果
```
2.4.1 :001 > puts "hoge"
hoge
 => nil 
```
##pの実行結果
```
2.4.1 :001 > p "hoge"
"hoge"
 => "hoge"
```
##printの実行結果
```
2.4.1 :001 > print "hoge"
hoge => nil
```
以上
gistの認証header 3種

### basic、gisttoken、oauth。
```js
 let u='gnjo',p='XXXXXXXXX'
 ,basic=`basic ${btoa(u+":"+p)}`
 ,gisttoken=`token a04f631c476b4b54e131XXXXXXXXXXXXXXXXXXX`
 ,oauth2=`bearer df6322210478ec2b91fb5XXXXXXXXXXXXXXXXXXX` 
 //getist token is https://github.com/settings/tokens
 //quick oauth2 is https://oauth.io/
 ; 

...
 ,opt={headers:{'authorization':authstr}}

```

### oauthは特にアクセスするサイトも制限される、その分信頼性は高くなる。
oauthの認証フローは https://oauth.io/ を使うとoauth.ioに委ねることができ、chrome:extensionでも可能となる。

### 全部　
認証し、ユーザ情報を取得する。

```html
<button onclick="a()">user</button>
<pre></pre>
```

```js
let fn={}
fn.q=(d=>document.querySelector(d))
fn.jsy=(d=>JSON.stringify(d,null,2))
;
function user(authstr){
 let url='https://api.github.com/user'
 ,opt={headers:{'authorization':authstr}}
 ;
 return fetch(url,opt).then(d=>d.json())
}
;
function a(){
 let u='gnjo',p='XXXXXXXX'
 ,basic=`basic ${btoa(u+":"+p)}`
 ,gisttoken=`token a04f631c476b4b54e131XXXXXXXXXXXXXXXXXXX`
 ,oauth2=`bearer df6322210478ec2b91fb5XXXXXXXXXXXXXXXXXXX` 
 //getgist token is https://github.com/settings/tokens
 //quick oauth2 is https://oauth.io/
 ;
 let draw=(d=>{fn.q('pre').innerHTML=fn.jsy(d);return d})
 ,log=(d)=>{console.log(d);return d}
 ;
 user(basic).then(log).then(draw)
 //user(gisttoken).then(log).then(draw)
 //user(oauth2).then(log).then(draw)
}
```
PHP on Google App Engineを、PhpStormを使用してサクッとデバッグする

PHP standardバージョンのGoogle App Engineを利用するお仕事があったので、手順を簡単にまとめました。
デバッグで調査しなくても挙動が全て理解できるような作りになっているのが一番なんですが、
世の中そうそう上手くは行ってくれないので……デバッグ実行可能な環境をサクッと用意しました。

# 必要なもの
* PhpStorm
* glocudでインストールしたGAEのphp版環境
* python 2.7
* hello worldで構わないのでローカルで動くプログラムを

php版環境についてはgcloudコマンドさえ入っていれば、下のコマンドで用意できます。
プログラムはなければ[ここ](https://github.com/GoogleCloudPlatform/appengine-php-guestbook/tree/phase0-helloworld)から。

```
gcloud components install app-engine-php
```

# PhpStormの設定
まずはGAEをPhpStormで管理できるように設定します
<img width="1118" alt="e709988b-febe-6b02-47fb-dbdc6f89065b.png" src="https://qiita-image-store.s3.amazonaws.com/0/235100/8297e554-f25d-f90d-761e-402dff0cd03c.png">


# Debugの設定
次はデバッグの設定を……簡単！
![e4ff63b3-93c1-cf16-1283-16f397469078.png](https://qiita-image-store.s3.amazonaws.com/0/235100/71e21945-68d9-86b7-1e99-1bf9241b8fbe.png)


# いざ実行
break pointを設定してデバッグを押すと、dev_appserver.pyをデバッグが有効になるように起動してくれます。
そうするとこんな感じで止まります！
![f263f96d-b1c7-9e11-5119-22deef40107f.png](https://qiita-image-store.s3.amazonaws.com/0/235100/fc7e79f8-5301-95a8-df67-baf1653bd08e.png)


デバッグを駆使して是非エンジョイな開発ライフを
制約について自分なりに基礎をまとめてみました！

制約について自分なりに説明できそうだと思ったら書くんだ！っと思って今日基礎編の説明ができそうなので早速qiitaに投稿してみました!:sunny:

主人公は僕と亀さんです。

##まず、制約をつける時に基本となるのが以下の感じでxとy決めて大きさ決めると言う感じだと思います。実際はx,yでなく左からと上からですが…
<img width="1280" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/77c30f50-f9b3-0eb9-88ea-efb53a6d9e6f.png">

##しかし、途中下からの制約をつけたいとなります。
<img width="1280" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/91a66cd7-011a-23ba-8f96-b9fa792aeff0.png">

##そうするとエラー亀さんが出てきます。
<img width="1280" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/6482fabd-29c4-b8e3-f887-c20ba9f95a65.png">

##亀さんの言う通りにすれば、エラー解消、制約もつけれました！
<img width="1280" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/2f1b13d4-6fcd-dd9f-2e8c-5afd02f690d6.png">

##今度は右から1の制約をつけたいとします。
<img width="1280" alt="7.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/25844ccc-0b3a-d9fb-d433-6ec870703e0f.png">

##またしてもエラー亀さんの登場です。
<img width="1280" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/b4b8bd08-517d-ff9a-126a-114c1602dcf8.png">

##亀さんの言う通りにすれば、エラー解消、制約もつけれました！
<img width="1280" alt="9.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/fba9548f-2529-363e-c34d-ca58e34a2b87.png">

##今度は図を真ん中にしたいと思いました！またしてもエラー亀さんの登場。さっきとはうって変わって、色々言ってきます。うんざりです。
<img width="1280" alt="10.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/b3a79656-45fe-5745-e355-99cd187343f7.png">

##考えます。亀さんの言う通りにすると僕の制約はうまく行かないよ…考えたすえの結論が出ます！
<img width="1280" alt="11.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/f78579eb-2c45-09d0-9dfe-160386aac47b.png">

##亀さんと和解することができました！
<img width="1280" alt="12.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/2f330c75-1436-bf98-9546-41aa5c1a2bee.png">


で、これを実際に行うと以下のようになります。

![イメージsample.gif](https://qiita-image-store.s3.amazonaws.com/0/133940/08601749-304d-0579-aa25-d6c0a1cb0842.gif)

しかし、これだと少しおかしいのに気づかれると思います。上を　safeAreaからとってます。ですから、それをしないように上部のViewからの位置を取るようにとしたのが以下となります。

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/133940/81f5f05f-1cd1-f718-a3ea-3944cffd388c.gif)


基礎編でした。

ちなみに、このあとに真ん中にする制約をつけてもエラーになりません。
それは全く同じになるからと言うこと。
エラーにはなりませんが、つける意味はないと言うことです。
それならと、上下、左右の制約外して、真ん中の制約にしたらどうでしょうか？エラーが出ます。それは大きさが特定できないから、位置がわかっても大きさがわからないので大きさを決めてとなります。
【vimめも】 5. insertモード・visualモードの基本的な操作

##　インサートモード

- `<C-a>` : 前回入力した値を挿入
- `<C-r>` + ${レジスタ} : レジスタの内容を挿入
- `<C-h>` : １文字削除
- `<C-w>` : １単語削除
- `<C-u>` : １行削除
- `<C-t>` : インデント（右）
- `<C-d>` : インデント（左）
- `<C-o>` + ${コマンド} : ノーマルモードのコマンドを実行し、挿入モードに戻る
- `<C-n>` or `<C-p>` : 入力補完。補完の候補を前に：(n) 後ろに(p)
- `<C-r>` + ${レジスタ} : レジスタの内容を貼り付け

## ビジュアルモード

- `y` : ヤンク
- `d` or `x` : ヤンク＋削除
- `c` or `s` : ヤンク＋削除＋挿入モード
- `>` : インデントを右にずらす
- `<` : インデントを左にずらす
- `~` : 大文字小文字入れ替え
- `u` : 小文字に変換
- `U` : 大文字に変換
- `p` : or `P` ペースト（上書き。選択していた元の値がヤンクされる）
- `<C-a>` : 数字をインクリメント
- `<C-x>` : 数字をデクリメント 
- `g<C-a>` : 数字をインクリメント。複数行あるときは行カウントの数だけインクリメント
- `g<C-x>` : 数字をデクリメント。複数行あるときは行カウントの数だけデクリメント

## 【使用例】

#### ***連番を作りたい時***

```ruby:元のテキスト
1
```

`v` : 選択
`y` : ヤンク
`4p` : 4回ペースト

```ruby
1
1 #<-カーソルここ
1
1
1
```

`<C-v>` : 短形選択
`G` : 1番下まで移動

```ruby
1
1 #<-ここから
1
1
1 #<-ここまで選択
```

`g<C-a>` : 連続してインクリメント

```ruby
1
2
3
4
5
```

---

#### ***行頭に同じ文字を挿入したい時***

```ruby:元のテキスト
name #<= カーソルここの行頭(normalモード)
kana
height
width
```

`<C-v>` : 短形選択モード
`G` : 1番下まで移動
`<S-i>` : 選択範囲の前から挿入モード
`self.` : 任意文字の入力
`<C-[` : 挿入モードを抜ける

```ruby
self.name
self.kana
self.height
self.width
```

---

#### ***行末に同じ文字を挿入したい時***

元のテキスト

```ruby:元のテキスト
p "1" #<= カーソルここの行頭(normalモード)
p "1a"
p "a"
p "a1"
p "1a2"
p "&"
```

`<C-v>` : 短形選択モード
`G` : 番下まで移動
`$` : 行末まで移動（各行の行末）
`<S-a>` : 選択範囲の後ろから挿入モード
`.to_i` : 任意文字の入力
`<C-[` : 挿入モードを抜ける

```ruby
p "1".to_i
p "1a".to_i
p "a".to_i
p "a1".to_i
p "1a2".to_i
p "&".to_i
```

前回:[【vimめも】 4. テキストオブジェクト](https://qiita.com/r12tkmt/items/0c1f84c0b64356cfbbff)
次回:[【vimめも】 6. 複雑な繰り返し処理](https://qiita.com/r12tkmt/items/4f48da7a0154dbc5ad38)
【Ruby】times, uptoの小さなメモ


```ruby
###########
# times
10.times{|i|
  p "times: #{i}"
}

10.times{
  p "times"
}


10.times do |i|
  p "times: #{i}"
end

10.times do
  p "times"
end


#########
# upto

10.upto(15){
  p "upto"
}

10.upto(15){ |i|
  p "upto: #{i}"
}


10.upto(15) do
  p "upto"
end


10.upto(15) do |i|
  p "upto: #{i}"
end
```


```sh:結果
"times: 0"
"times: 1"
"times: 2"
"times: 3"
"times: 4"
"times: 5"
"times: 6"
"times: 7"
"times: 8"
"times: 9"
"times"
"times"
"times"
"times"
"times"
"times"
"times"
"times"
"times"
"times"
"times: 0"
"times: 1"
"times: 2"
"times: 3"
"times: 4"
"times: 5"
"times: 6"
"times: 7"
"times: 8"
"times: 9"
"times"
"times"
"times"
"times"
"times"
"times"
"times"
"times"
"times"
"times"
"upto"
"upto"
"upto"
"upto"
"upto"
"upto"
"upto: 10"
"upto: 11"
"upto: 12"
"upto: 13"
"upto: 14"
"upto: 15"
"upto"
"upto"
"upto"
"upto"
"upto"
"upto"
"upto: 10"
"upto: 11"
"upto: 12"
"upto: 13"
"upto: 14"
"upto: 15"

Process finished with exit code 0
```
リポジトリ内のソースに書かれた TODO や FIXME をざっと見るコマンド

# Setup

```bash
# leasot というライブラリを入れる
npm i -g leasot

# git todo というコマンドを定義
git config --global alias.todo '!leasot --skip-unsupported $(git ls-files)'
```

# 実行例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200/923bb40d-33b8-9295-e5ef-385f758c27d0.png)

# 注釈

このコマンドは、あくまでカジュアルに手元でざっと確認するためのもの。

TODO や FIXME が忘れ去られないようにガチで管理したい場合は [JasonEtco/todo](https://github.com/JasonEtco/todo) のような、TODO, FIXME を Github issue 化してくれるライブラリを導入すれば良い。
Azure PortalからAzure 仮想マシン(Windows)のユーザパスワードの変更・追加を追加する方法について

#結論
### 方法1
- [サポート + トラブルシューティング] － [パスワードのリセット]

### 方法2
- [設定] － [拡張機能] － [Custom Script Extension]

#経緯
Azure 仮想マシンにおいて、Azure Portalからのユーザのパスワードの変更、新規ユーザの追加には、「方法1」でのやり方が一般的だと思います。
しかしながら、この[パスワードのリセット]機能は一般的なマシンに対し有効であり、
例外として[Active Directory]機能を提供しているマシンについてはこの機能はサポートされていません。
実行するとこのようなエラーがでます。
> VMAccess Extension does not support Domain Controller.

そこで、[Custom Script Extension]機能を用いれば、ユーザの追加ができるのではないかと試したところできてしまったので備忘として残します。
ぶっちゃけ上記エラーでぐぐれば一発で以下のDeveloper Networkで出てきますが、見たところ英語での記事は見つけたのですが日本語記事がなかったのでもしものときのために。
[Error message: "VMAccess Extension does not support Domain Controller." ](https://social.msdn.microsoft.com/Forums/en-US/881ac109-fd53-48df-8582-74171104002b/error-message-vmaccess-extension-does-not-support-domain-controller?forum=WAVirtualMachinesforWindows)

##方法1について
割愛

##方法2について
[Custom Script Extension]機能について、そもそもは作業用のマシンで書いたスクリプトをAzure 上の仮想マシンに送りつけて、そのスクリプトを仮想マシンに実行させます。
使い方としては、手動での設定等々を全てスクリプトに落とし込み、多数のマシンへ流すことで作業の簡略化が図れるものと理解しています。

そこで、この機能を利用してActive Directoryにユーザを追加できれば、
Active Directory機能を提供している仮想マシンにユーザが追加できるというわけです。

方法は単純で、Active Directoryにユーザを追加するコマンドを記載した.ps1ファイルを作成し、[Custom Script Extension]機能で仮想マシンに送りつけるだけです。
`net user <Username> <Password> /add /domain`

ただし、このままですと単にユーザを追加しただけですので、適当にグループに所属させるコマンドも追記して送りつけてあげましょう。
`net group <Groupname> <Username> /add /domain`

##後記
もともとは、Active Directoryにて、何らかの影響でユーザやパスワードが不明確になった場合の措置を考えていたところ、思いついた方法でした。
基本はActive Directoryは複数台構成で冗長化されますが……
また、今回のことで[Custom Script Extension]機能は意外と何でもできると思っており、Azure Portalにサインインさえできれば悪意ある行為をいくらでも実行できそうでした。
まぁ、Azureにサインインできる時点でMFAの設定をしていればある程度のリスク回避にはなると思いますが。
Firefox + Markdown Viewer + GolangでMarkdownをプレビューする

[Chrome + Markdown Viewer + LiveReloadでリアルタイムにMarkdownをプレビューする](https://qiita.com/sky_jokerxx/items/3566dfe71c7472ae0252)で使ったMarkdown ViewerですがFirefoxでも試したので、そのメモを残しておきます。

# Markdown Viewer

Firefox版のMarkdown Viewerです。

[Markdown Viewer](https://addons.mozilla.org/en-US/firefox/addon/markdown-viewer-chrome/)

# 試した時のつまりポイント

* Firefoxはデフォルトで `file://` でアクセスしたファイルをブラウザから開けないようになっている
* Markdown Viewerでmdファイルを開くにはWebサーバ経由でアクセスする必要がある

# 解決策

* ここでは、Goで簡易Webサーバを作ってブラウザからローカルサーバにアクセスしファイルを開くやり方を試して見ました

# 手順

## Firefox Add-onインストール

(1) Markdown Viewerをインストールします。

## Webサーバの立ち上げ

(1) 以下の `公開するパス` にDocumentRootになるパスを指定します。

```go:main.go
package main

import (
        "net/http"
)

func main() {
        dir_path := "公開するパス"
        http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir(dir_path))))
        http.ListenAndServe(":8000", nil)
}
```

(2) 実行します。

```
$ go run main.go
```

## Markdown Viewerの設定

(1) 画面右上のMarkdown Viewerアイコンをクリックして `ADVANCED OPTIONS` をクリックします。

![スクリーンショット 2018-03-18 13.01.11.png](https://qiita-image-store.s3.amazonaws.com/0/180118/b381b1df-c6d4-1c15-7f57-e22428a97c2f.png)

(2) `HTTP://` に変更して `localhost` を入力し `ADD` をクリックします。

![スクリーンショット 2018-03-18 13.03.28.png](https://qiita-image-store.s3.amazonaws.com/0/180118/f3b99df3-6df2-5bfb-6eff-05dc2e5146e8.png)

![スクリーンショット 2018-03-18 13.03.36.png](https://qiita-image-store.s3.amazonaws.com/0/180118/01b099b3-109c-d47a-9b74-4ec737d99321.png)

(3) あとはブラウザのURL欄に `localhost:8000/mdまでのパス` を入れて開けばMarkdownがプレビューできます。

![スクリーンショット 2018-03-18 13.05.00.png](https://qiita-image-store.s3.amazonaws.com/0/180118/dbe1e555-cc72-8b6d-e9a0-f8cbee97c9b2.png)

![スクリーンショット 2018-03-18 13.06.50.png](https://qiita-image-store.s3.amazonaws.com/0/180118/942eea59-0771-103a-06e9-19327b508317.png)
PHPでファイルのアップロードが2MB以上出来ないとき

# 事例
なんかphpで2M以上のファイルをアップロードしようとするとエラーになったりNULLになったりする。
# 原因
```php:php.ini
upload_max_filesize = 2M
```
php.iniでファイルサイズの上限が決められているようです。
これを変更しましょう。
# 解決策
解決策としては.htaccessを変更したりとか、phpのコード内に書く方法などがあるようですが今回はphp.iniを変更する方法を使います。

## php.iniの場所を探す
環境によってphp.iniの場所が違うので以下のコマンドで確認してください。

```bash
$ php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/php/lib
Loaded Configuration File => /usr/local/php/lib/php.ini
```
## 書き換える
```bash
$ sudo vim /usr/local/php/lib/php.ini
```

```php:php.ini
//以下の2つの値をupload_max_filesizeよりも大きい値に設定してください。
//メモリ使用量の制限
memory_limit = 128M
//POSTデータに許可される最大サイズ
post_max_size = 10M

//1つのファイルアップロードに許可される最大サイズ
upload_max_filesize = 10M
```
## 再起動
`reboot`するなりapacheを再起動するなりして、`phpinfo()`を実行して変更されていることを確認してください。


# 参考文献
http://tweeeety.hateblo.jp/entry/20121218/1355802787
https://mypacecreator.net/blog/archives/508
python の Pillow をインストール中にエラーが出た時の対処メモ

Pillow を `pip install` しようとしたら以下エラーがでたので対処。

```
The headers or library files could not be found for jpeg,
a required dependency when compiling Pillow from source.```
```

どうやら jpeg 関連のライブラリが足りなくて怒られているらしい。

```
sudo apt-get install libjpeg-dev
```

でインストールできるようになった。
MacにNode.jsをインストール

## はじめに
特に大した事ないんだけど、すぐに忘れちゃうから(汗)、メモを残しておくことに。
よくEclipseで開発をしていて、gradleを使用していますが、JavaScriptの記述がES6などで書くと、後でES5に変換・・・とか色々手作業が多くてめんど臭いのです。
そこで最終的にgradle + glup + babelで、簡単にリリース用のモジュールを作れるようにしたら便利じゃないかなぁと思って環境を作ることにしました。
その第一弾で、まずはNode.js入れないと始まらないのでここからスタートです。
nodeとnpmまでインストールが確認できれば今回は終了です。

## 環境
インスストール環境と入れたNode.jsはこんな感じです。

|os module|version|
|:--:|:--:|
|Mac OS X|10.13.3|
|Homebrew|1.5.10|
|nodebrew|1.0.0|
|node.js| 9.8.0|
|npm|5.6.0|

※ 前提として、Homebrewはインストール済みとします。

## インストール手順

### 1. brewの更新
お約束で、まずはbrewのアップデートから。

``` bash:brewのupdate
$ brew update
```
### 2. nodebrewのインストール
nodebrewなるものを先にインストールします。

``` bash:nodebrewのinstall
$ brew install nodebrew
```

### 3. Node.jsのインストール
本命Node.jsをインストールします。
nodebrewを使ってインストールしますが、Node.jsのバージョンの確認方法から。

``` bash:nodebrewでインストール可能なNode.jsを確認
$ nodebrew ls-remote
```

うねうねバージョンが出てきます。
v9.8.0が最新ということがわかります。(2018/03/17現在)

それでv.9.8.0をインストールすると、エラーになりました・・・。

``` bash:nodebrewでのエラー
$ nodebrew install-binary v9.8.0
Fetching: https://nodejs.org/dist/v9.8.0/node-v9.8.0-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/xxxx/.nodebrew/src/v9.8.0/node-v9.8.0-darwin-x64.tar.gz: No 
Warning: such file or directory
                                                                           0.0%
curl: (23) Failed writing body (0 != 1017)
download failed: https://nodejs.org/dist/v9.8.0/node-v9.8.0-darwin-x64.tar.gz
```
どうも、ユーザディレクトリの.nodebrew/srcにファイルを置こうとして失敗しているみたいです。
そこで、先にフォルダを作ってあげてインストールしたら成功しました。

``` bash:先にフォルダを生成してインストール
$ mkdir -p ~/.nodebrew/src
$ nodebrew install-binary v9.8.0
```
## 4. Node.jsを使えるようにする
まず、ちゃんとインストールされたかを確認します。

``` bash:Node.jsのインストール確認
$ nodebrew ls
v9.8.0

current: none
```
インストールされていますが、current: noneです。
そこで、currentを設定します。

``` bash:nodebrewのカレントを設定
$ nodebrew use v9.8.0
use v9.8.0
```
これでセット完了。
早速バージョンを確認します。

``` bash:Node.jsのバージョン確認（失敗）
$ node -v
-bash: node: command not found
```
・・・（汗）
意外と手のかかるやつです。
.bashrcか.bash_profileに以下のPATHを追加します。

**/Users/xxx/.nodebrew/current/bin**

※"xxx"は、ユーザ名なので読み替えて設定してください。

``` bash:Node.jsのバージョン確認（成功）
$ node -v
v9.8.0
```
さてnpmも・・・と思ったら自動的に入っちゃってるんですね。

``` bash:npmのバージョン確認
$ npm -v
5.6.0
```
これで今回は終了です。
ATtiny85で外部割込みが正しく動作しない

ATtiny85で、外部割込み3(PCINT3)からの割り込みをしたが、割り込みが起こった時にリセットされてしまう。

``` C:問題のコード
ISR(PCINT3_vect){
    //何らかの動作
}

int main(void){
    cbi(DDRB,PB3);//PB3入力
    sbi(PORTB,PB3);//PB3内部プルアップ有効
	
    sbi(GIMSK,PCIE);//5 外部割り込み一般許可
    sbi(PCMSK,PCINT3);//3 外部割り込み3許可

    sei();

    while(1);
    return 0;
}
```
AtmelStudioから(スペル間違ってませんか)って警告されるのがずっと気になっていた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/74419/7bd4aeb1-3bc3-21d3-15ce-db1897e9521e.png)

そこで`PCINT3_vect`を`PCINT0_vect`に書き換えると、警告も消え正常に動作した。

``` C:改善後
ISR(PCINT0_vect){
    //何らかの動作
}

int main(void){
    cbi(DDRB,PB3);//PB3入力
    sbi(PORTB,PB3);//PB3内部プルアップ有効
	
    sbi(GIMSK,PCIE);//5 外部割り込み一般許可
    sbi(PCMSK,PCINT3);//3 外部割り込み3許可

    sei();

    while(1);
    return 0;
}
```

なぜかは分からないが、`PCINT_vect`もダメらしい。
railsで中間テーブルから配列を取ってリストを作る方法

# この記事の目的

railsでpostに申し込みをした人のリストを生成。

```
  create_table "follow_users", force: :cascade do |t|
    t.integer "follow_user_id"
    t.integer "post_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "posts", force: :cascade do |t|
    t.integer "user_id"
    t.text "content"
    t.text "title"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "users", force: :cascade do |t|
    t.string "provider"
    t.string "uid"
    t.string "nickname"
    t.string "image_url"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```

上記のような構成でfollow_usersが中間テーブルでここにpostと申込みを入れたユーザー（follow_user_id）が入っている。これを通してusersからnicknameを取ってくる。

# pluckを使って配列を作成

```ruby:post_controller.rb

  def show
    follow_user_list = FollowUser.where(post_id: @post.id)
    follow_user_list_id = follow_user_list.pluck(:follow_user_id)
    @follow_user = User.where(id: follow_user_list_id)
  end

```

ただFollowUser.whereで取ってくると配列じゃないので@follow_user = User.where(id: follow_user_list_id)が通らない。なので.pluck(:follow_user_id)で配列に変更してから変数に代入する。
Flutterアプリでカスタムフォントを使う

# フォントの使用
Flutterアプリでフォントを使うには2ステップ必要です。まずアプリにフォントが含まれることを保証するため、それらを`pubspec.yaml`に宣言します。次に`TextStyle`プロパティを用いてそのフォントを使います。

## フォントの宣言
1. アプリのプロジェクトに使いたいフォントをコピーします
    - `(your_project)/assets/font/NotoSansCJKjp-Black.otf`
        - 今回はGoogle Noto FontsからNoto Sans CJK JPをお借りし、こんな感じで置いておきました
2. `pubsec.yaml`の`flutter`セクションに宣言文を追加

```yaml:pubspec.yaml
fonts:
    - family: NotoSansCJK-Black
      fonts:
        - asset: assets/fonts/NotoSansCJKjp-Black
```

## フォントの使用
`FontStyle`を`Text`のプロパティに適用します

```dart:main.dart
const textStyle = const TextStyle(
  fontFamily: 'NotoSansCJK-Black',
);

new Text(
  "文字もじ",
  style: textStyle,
),
```

# アイコンフォントの使用
Flutterアプリプロジェクトを作った時にデフォルトで有効化されます。
もし使えなかったら`pubspec.yaml`を確認しましょう。

```yaml:pubspec.yaml
uses-material-design: true
```

文字コードも[material.io](https://material.io/icons/)で検索できるのでString内に混ぜ込むこともできます。
helmのbufferをVisualStudioの自動的に隠すウィンドウっぽくする

# ２画面分割とhelm
私のEmacsの使い方は、フルスクリーンで`C-x 3`で左右に分割した２画面固定スタイルです。
このとき、helmを使うとhelmの候補選択bufferが、既存のbufferを使いまわしたり、上下分割状態になったりと悲しい動きをします。（私の環境だけ？）
こんなかんじ:
![ezgif.com-optimize(1).gif](https://qiita-image-store.s3.amazonaws.com/0/242567/ca85a466-d8d6-de92-4f26-d6c94fa7c975.gif)

私の理想とする動きは、VisualStudioの自動的に隠すウィンドウのように、左右分割したbufferに乗っかって画面下からニョキっと出てくれると嬉しいのです。
こんなかんじ:
![ezgif.com-optimize(3).gif](https://qiita-image-store.s3.amazonaws.com/0/242567/35b8116f-43f9-6fc6-4b16-4f5e66d9a603.gif)

# 実現手段 : __popwin.el__を使う
__popwin.el__はEmacsのbuffer管理上でpopup windowのようなbufferを実現するパッケージです。
melpa-stableから`package install popwin`できると思います。
こいつを使うと指定のbuffer名のbufferが_display-buffer_されたとき、他のbufferに乗っかる形のbufferを作ってくれます。
詳しくは作者様のページへ[[Emacs] ヘルプバッファや補完バッファをポップアップで表示してくれるpopwin.elをリリースしました](http://d.hatena.ne.jp/m2ym/20110120/1295524932)

これで万事OKなのですが、もう１点。
helmの_display-buffer_は独自のものみたいで、popwinのフックに乗りません（詳しいことはわかりませんが）
なのでhelm独自の_display-buffer_を標準のに上書きします。
`(setq helm-display-function #'display-buffer)`

# 設定例
```emacs-lisp:helm-pop.el
;; helm bufferをpopupする
(setq helm-display-function #'display-buffer)
(when (require 'popwin)
  (setq display-buffer-function 'popwin:display-buffer)
  (setq popwin:special-display-config
	'(("*complitation*" :noselect t)
	  ("helm" :regexp t :height 0.4))))
;; helmをbuffer名に含んでたら良いので、これだけでhelm-M-x,helm-find-files等に対応できます
```

# おわりに
もしかしたらhelm使ってる皆様に於かれましては常識ですかね？
Deviseで独自のカラムを追加する

Deviseで独自のカラム（first_name, last_name）を追加するメモ

## View

### 登録

```erb:app/views/users/registrations/new.html.erb
<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>

  .
  ..

  <div class="field">
    <%= f.label :last_name %><br />
    <%= f.text_field :last_name %>
  </div>

  <div class="field">
    <%= f.label :first_name %><br />
    <%= f.text_field :first_name %>
  </div>

  ..
  .

<% end %>
```

### 更新

```erb:app/views/users/registrations/edit.html.erb
<h2>Edit <%= resource_name.to_s.humanize %></h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>

  .
  ..

  <div class="field">
    <%= f.label :last_name %><br />
    <%= f.text_field :last_name %>
  </div>

  <div class="field">
    <%= f.label :first_name %><br />
    <%= f.text_field :first_name %>
  </div>

  ..
  .

<% end %>
```

## Controller

```ruby:app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
  before_action :configure_account_update_params, only: [:update]

  ..
  .

  protected

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name])
  end

  def configure_account_update_params
    devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name])
  end

  ..
  .

end
```
Library not loaded: @rpath/libswiftDispatch.dylibの解決方法

※2018/03/18時点の情報です

1週間前まで、普通に動いていたbrewコマンドが、急に下記のエラーを吐き出してきました。

```
Dyld Error Message:
  Library not loaded: @rpath/libswiftDispatch.dylib
  Referenced from: /Applications/Xcode.app/Contents/MacOS/Xcode
  Reason: image not found
```

どうやらロードできてないそう。
ググってみたところ、Macに入れているAvastがXcode内のlibswiftDispatch.dylibをBitcoinのマイニングマルウェアと勘違いして、隔離しているのが原因っぽい。

Avastの公式フォーラムにも上記の情報が載っていて、ファイルを復元したら治ると書いていました。（私は復元ボタンを押したら、権限エラーが出たので、結局、Xcode入れ直したら、治りました）
[Review] Understanding the difficulty of training deep feedforward neural networks

## Info
Author:
Xavier Glorot
Yoshua Bengio

Year:
2010

## Agenda
Abstract

1. Deep Neural Networks
2. Experimental Setting and Datasets
    1. Online Learning on an Infinite Dataset: Shapeset-3x2
    2. Finite Datasets
    3. Experimental Setting
3. Effect of Activation Functions and Saturation During Training
    1. Experiments with the Sigmoid 
    2. Experiments with the Hyperbolic Tangent
    3. Experiments with the Softsign
4. Studying Gradients and their Propagations
    1. Effect of the Cost Function
    2. Gradients at Initialisation
        1. Theoretical Considerations and a New Normalised Initialisation
        2. Gradient Propagation Study
    3. Back-propagation Gradients During 
5. Error Curves and Conclusions

Evernote!!
https://www.evernote.com/l/ATRQQEYUnXtBTreAuqXoqRWKJjkZn7mNBV0

## Nice Material
http://www.ms.uky.edu/~qye/MA721/DL-presentation-Qiyue%20Wang%2010-27%20final.pdf
AWS SDK for PHPをComposerではなくzipで落として使う

AWS SDK for PHPの使用はComposerが推奨されていますが、zipを落として使用したい場合があるかと思います。そんな時用のメモ。

## 環境
- FuelPHP
- AWS SDK for PHP v2
- PHP5.3

AWS SDK for PHPの最新バージョンはv3です。v3ではPHP 5.5以上が必要になります。

## AWS SDK for PHP ダウンロード
公式サイトからzipファイルを落としてきます。
v3: https://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/installation.html
v2: https://aws.amazon.com/jp/releasenotes/release-aws-sdk-for-php-2-4-2/

## 解凍
zipファイルを落としたら解凍してサーバに設置します。設置場所はどこでも良いです。FuelPHPを使用している場合はpublic_html/fuel/vendor/あたりでしょうか。 

## ミニマムテストコード
sample.gifを作成してpublic_html直下に置いています。sample.gifがS3のtest/以下にアップロードされていれば成功です。なお、成功しても失敗しても画面に何も表示されません。

```public_html/fuel/app/classes/controller/s3.php 
<?php

require('fuel/vendor/aws/aws-autoloader.php');

use Aws\S3\S3Client;
use Aws\Common\Enum\Region; 

class Controller_S3 extends Controller {
    public function action_index() {

        // アクセスキー
        $key = 'XXXXXXXXXXXXXXXXXXXXXX';

        //シークレットアクセスキー
        $secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; 

        // s3のリージョン（日本の場合）
        $region = Region::TOKYO;

        // バケット名
        $bucket = 'test';

        // アップロードしたいファイルのパスとファイル名
        $input_file_path = DOCROOT.'sample.gif';

        // アップロード先 (S3) のパスとファイル名
        $output_file_path = 'sample.gif';

        $s3 = S3Client::factory(array(
            'key' => $key,
            'secret' => $secret,
            'region' => $region
        ));

        // アップロード
        $s3->putObject(array(
            'Bucket' =>$bucket,
            'Key' => $output_file_path,
            'Body' => file_get_contents($input_file_path)
        ));
    }
}
``` 

## 参考
- fuelphpからs3(aws)を利用する方法メモ  
http://kimagureneet.hatenablog.com/entry/2015/04/29/011828
dockerでpostgresql環境を構築してテストをする話

# dockerでpostgresql構築

```
docker run -d --name dev-postgres -e POSTGRES_PASSWORD=test -p 5432:5432 postgres:alpine
```

-d：バックグラウンドで起動する
--name dev-postgres：dev-postgresという名前をつける
-e POSTGRES_PASSWORD=test：スーパーユーザーのパスワードを指定
-p：ホストの5432ポートでアクセスしたら、コンテナの5432に転送する
postgres:alpine：alpineを利用したpostgresのイメージ

## 起動確認
この記事中は、起動させたままにします。

```sh
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
fc0dfbba334d        postgres:alpine     "docker-entrypoint..."   10 days ago         Up 12 seconds       0.0.0.0:5432->5432/tcp   dev-postgres
```

先ほどの設定が生きています。
IMAGEにはpostgres:alpine
PORTSでホストの5432からコンテナの5432に転送指定
NAMESにはdev-postgres

補足として、停止と削除は以下のコマンドから。

```sh
$ docker stop dev-postgres
$ docker rm dev-postgres
```

## アクセス

dev-postgresにアクセス

```
docker exec -it dev-postgres bash
```

dev-postgres内でpostgres

```
psql -U postgres
```

postgresの色々

```
// 終了
¥q

// DB一覧表示
¥l
```

それらを実行した時のコード

```sh
$ docker exec -it dev-postgres bash
bash-4.3# psql -U postgres
psql (10.1)
Type "help" for help.

postgres=# \q
bash-4.3# exit
exit
```

# テスト準備
npmでpgをインストールします。
typescriptを使いたいので、@types/pgもインストールします。

```
npm install pg @types/pg --save
```

## テストコード

```js
import * as pg from "pg";

describe( "Postgres", () => {
	before( async () => {
		const config = {
			user: "postgres",
			password: "test",
			port: 5432,
			host: "localhost",
			database: "postgres"
		};

		const client = new pg.Client( config );
		await client.connect();

		try {
			// testというdbが存在したら消す
			await client.query( "DROP DATABASE test" );
		} catch ( err ) {
			// 処理なし
		}

		// testというdbを作成
		await client.query( "CREATE DATABASE test;" );
	} );
	it( "1000件insert", async () => {
		const connectString = "tcp://postgres:test@localhost:5432/test";
		const client = new pg.Client( connectString );
		await client.connect();

		// テーブル作成
		await client.query( "CREATE TABLE users(id INTEGER, name CHAR(20) , PRIMARY KEY(id) )" );

		// 値挿入
		const text = "INSERT INTO users(id, name) VALUES($1, $2) RETURNING *";

		const len = 1000 | 0;
		let i = 0 | 0;
		console.time( "insert" );
		while ( i < len ) {
			await client.query( text, [ i, "name" + i ] );
			i = (i + 1) | 0;
		}
		console.timeEnd( "insert" );

		const res = await client.query( "SELECT COUNT (*) FROM users" );
		console.log( res.rows[ 0 ].count );
		await client.end();
	} );
} );
```