OmniAICreator/Qiita-1.07M huggingface dataset:
いろいろ構築メモ 

## 前提条件

| 項目名 |  内容 | 
|:----------------|:------------------|
| mac       |macOS High Sierra 10.13.6          |
| docker    |18.06.1        |
| os        |centos 7 |


### Docker起動
1. CentOSのイメージをダウンロード

```terminal
docker pull centos:7
docker run -itd --privileged -p 80:80 -p 443:443 --name app -v {ローカルディレレクトリ}:/share centos:latest /sbin/init

※localeにja_JP.utf8を追加する場合「/etc/yum.conf」の「override_install_langs」を”en_US.utf8,ja_JP.utf8”に変更して「yum -y reinstall glibc-common」

 Unable to find image 'centos:latest' locally
 latest: Pulling from library/centos
 Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
 Status: Downloaded newer image for centos:latest
> docker exec -it app /bin/bash
```



## Python開発環境構築
### １.  pythonをインストール
 
```terminal
sudo easy_install python
```

### ２. 以下をダウンロードしてpipをインストール

https://bootstrap.pypa.io/get-pip.py

```terminal
python get-pip.py
```

### ３. Django導入

```terminal
sudo pip install django
```

### ４. pythonのAPIモジュール作成(nginx + uwsgi+ flsk + sqlalchemy) ※CentOS7

#### 4.1 各種必要なモジュールのインストール

```terminal
yum install epel-release
yum install python python-devel python2-pip gcc nginx
sudo pip install --upgrade pip
sudo pip install flask SQLAlchemy flask-sqlalchemy PyMySQL psycopg2 uwsgi
```

#### 4.2 nginxの設定変更

pythonモジュールを格納するディレクトリを作成（※仮・・・本運用では格納先を考える必要あり）

```terminal
mkdir /usr/share/nginx/html/flask
```

#### 4.3 nginxの設定

```nginx
location / {
	include uwsgi_params;
	uwsgi_pass unix:///usr/share/nginx/html/flask/tmp/uwsgi.sock;
}
```

#### 4.4 uwsgiの設定

ディレクトリ作成

```
mkdir /usr/share/nginx/html/flask/tmp
chown nginx. /usr/share/nginx/html/flask/tmp
```

iniファイル作成

```text:/usr/share/nginx/html/flask/sample.ini
[uwsgi]
module = app
callable = app
master = true
processes = 1
socket = tmp/uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true
```

サンプルファイル作成

```python:/usr/share/nginx/html/flask/app.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!!"

if __name__ == "__main__":
    app.run()
```

#### 4.5 起動

nginxの起動

```terminal
nginx -t 
systemctl start nginx
```

uwsgiの起動

```terminal
cd /usr/share/nginx/html/flask/
uwsgi --ini sample.ini
```

#### 4.6　ブラウザにアクセス

http://localhost/ にアクセスして「Hello World!!」が表示されていれば成功。


### 5 Python+Postgres

#### 5.1 postgresqlインストール、sampleデータ登録
```terminal
yum install postgresql postgresql-devel postgresql-server
su -
systemctl start postgresql.service

su - postgres
initdb --encoding=UTF8 --no-locale
createuser sample
psql
postgres=# select * from pg_user;
postgres=# \q

createdb sample --o sample

psql
postgres=# \l
postgres=CTc/postgres
postgres=# \q
psql -U sample -d sample
sample=> create table sample
sample-> (id CHAR(4) NOT NULL,name TEXT NOT NULL,PRIMARY KEY (id));
sample-> insert INTO sample VALUES ( 1,'hoge');
```

#### 5.2 pythonライブラリインストール

```terminal
yum install python-psycopg2
python -c 'import psycopg2'
```

#### 5.3 その他

pythonで文字コード関係でエラーが出る場合
先頭に以下をつける

```python
# coding:utf-8
```

vimの設定を以下の通りにする

```vim
set encoding=utf-8
```
あなたの知らないasync/await。並列を例に。

# async/awaitとは。
awaitはpromiseの実行結果を待つ処理です。
待つ場所、つまりはawaitの場所で、処理は直列にも並列にもなります。

何を言っているか伝わらないと思いますので、コードを示します。

# サンプルコード

```js:parallel_serial.js
function waitASecond(message) {
    return new Promise((resolve) => {
        setTimeout(() => resolve(message), 1000);
    })
}
const num = ["one", "two", "three", "four"]
const result = [];
const parallel = () => {
    for (var i in num) {
        result.push(waitASecond(num[i]));
    }
    result.forEach(async (a) => console.log(await a));
};
const serial = async () => {
    for (var i in num) {
        result.push(await waitASecond(num[i]));
    }
    result.forEach((a) => console.log(a));
};
process.on('exit', function (code) {
    console.timeEnd("four");
});
console.time("four");
if (process.env.P) {
    console.log("parallel");
    parallel();
} else {
    console.log("serial");
    serial();
}

```

キモ
## waitASecond
waitASecondは処理に1秒かかる関数です。本番では、例えばDB接続だったり、他サーバへのHTTP通信だったりを想定してください。

## parallel / serial
双方の関数とも、waitASecondを4回呼びます。ただし、awaitする場所が違います。
parallelは、waitASecondの呼び出し時にはawaitせず、最後の出力時に待ちます。

```js:parallel
for (var i in num) {
    result.push(waitASecond(num[i]));
}
result.forEach(async (a) => console.log(await a));//←ここでawait
```

そして、serialはwaitASecondの呼び出し時にawaitします。

```js:serial
for (var i in num) {
    result.push(await waitASecond(num[i]));//←ここでawait
}
result.forEach((a) => console.log(a));
```

これが2つの関数の違いです。

# 処理実行
P=true node parallel_serial.js としたときは並列実行され、実行結果は以下、

```sh
parallel
one
two
three
four
four: 1012.967ms
```

1秒くらいで終わってますね。

node parallel_serial.js としたときは直列実行され、実行結果は以下です。

```sh
serial
one
two
three
four
four: 4019.300ms
```

4秒くらいかかってます。

# 解説
parallelは、waitASecondの呼び出し時にはawaitしていません。
したがって、waitASecondの呼び出しは並列で４つ実行が開始されます。
出力時に、awaitによって処理が終わった順に出力されます。
したがって、１秒くらいで処理が終わっています。

serialはwaitASecondの呼び出し時にawaitしているので、4回呼び出しの一回一回の完了まで待ちます。4回処理が終わってから、出力処理に入ります。
したがって、処理に4秒くらいかかります。

# まとめ
awaitは、関数の呼び出し時にしなければならないわけではありません。任意のタイミングで可能で、場所によっては並列処理に使えます。
awaitをどこですべきかを考えると、より良い実装につながることがあります。

ご参考ください。
JavaScriptの即時関数の書き方

## 即時関数とは何ぞや？

関数を記述すると同時に実行すること

## 書き方

```js
  var addition = (function (a,b){
    var result = a + b;
    return result;
  })(1,2);
  console.log(addition);
```

### 出力結果

```
3
```

以下の様に全体をカッコで囲んでも同じ


```js
  var addition = (function (a,b){
    var result = a + b;
    return result;
  }(1,2));
  console.log(addition);
```

## 参考

[JavaScriptで即時関数を使う方法【初心者向け】]
(https://techacademy.jp/magazine/5530)
[JavaScriptで即時関数を使う理由]
(https://qiita.com/katsukii/items/cfe9fd968ba0db603b1e)
Jupyter Notebookで再生ボタンを実行できなかったので、ipykernelのバージョンを変更した

# はじめに
機械学習を勉強するにあたり、「scikit-learnとTensorFlowによる実践機械学習」で学習を進めています。
ここで2章のとおりに「Jupyter Notebook」を入れてみましたが、再生ボタンをクリックしても実行できませんでした。
python3.5とjupyter関連に問題があったようなので、バージョン指定することでエラーを回避しました。（2018-09-30時点）
<p align="center">
<img src="https://www.oreilly.co.jp/books/images/picture978-4-87311-834-5.gif" alt="scikit-learnとTensorFlowによる実践機械学習" >
</p>

# 環境
- Mac OS High Sierra 10.13
- Python 3.5.5（書籍で3.5のバージョンを使用していたため）

- pipインストール

```
pip3 install --upgrade jupyter matplotlib numpy pandas scipy scikit-learn
```

# 実行内容
「scikit-learnとTensorFlowによる実践機械学習」2章のP.43にあるとおり、Jupyter Notebook内での画面出力を試しました。

```
print("Hello world!")
```

# 結果
- 画面出力されない
- セルが追加される

# Consoleの内容
```
ImportError: No module named 'prompt_toolkit.formatted_text'
```

# 解決策
Python3.5において、pip install jupyterでインストールされた「ipykernel」が原因のようでした。
https://github.com/jupyter/jupyter/issues/370

なので「ipykernel」のバージョンを、5未満にして対応しました。

```
pip uninstall ipykernel
pip install 'ipykernel<5.0.0'
pip uninstall jupyter-console
pip install 'jupyter-console<5.0.0'
```

これで、「Hello world!」が出力されるようになりました。

# さいごに
Pythonを詳しく分からず、書籍を読みながら勉強を進めています。
同じような事象になられた方の参考になれば幸いです。

# 参考
https://github.com/jupyter/jupyter/issues/370
コニュニティのリリース及び注意事項

###変更セットを使用した組織間のコミュニティの移行(覚え書き)

#####[参照資料](https://releasenotes.docs.salesforce.com/ja-jp/summer17/release-notes/rn_networks_changesets.htm)
----
####コミュニティの送信変更セットの作成
- コンポーネントの種類:<font color="Red">**ネットワーク**</font>
- コミュニティを変更セットに追加し、連動コンポーネントを含めます。表示されたすべての連動関係を選択することをお勧めします。

---
####変更セットを使用してコミュニティを移行するとき考慮事項と制限事項
- コミュニティでは、変更セットで<font color="Red">**更新のみ**</font>を行うことができます。つまり、受信変更セットから直接新しいコミュニティを作成することはできません。代わりに、対象組織で同じ名前のコミュニティを作成してから、受信変更セットをリリースします。
- 受信変更セットをリリースすると、対象組織のコミュティが完全に上書きされます。
- ナビゲーションメニュー項目がサポートされています。ただし、オブジェクトにリンクするメニュー項目の場合、リストビューはデフォルトのリストビューにリセットされます。また、標準オブジェクトのカスタムリストビューは連動関係として含まれません。(:frowning2:意味まだ不明です)
- ([ワークスペース] または [コミュニティ管理] の) 次の [管理] 設定のみがサポートされています。
 - パスワードの変更ページ
 - パスワードを忘れた場合のページ
 - ホームページ
 - ログインページ
 - ***[内部ユーザにコミュニティへの直接ログインを許可]*** オプション
- 次の項目はサポートされていません。
 - ページのバリエーションおよび利用者のターゲティング
 - ナビゲーショントピックおよび主要トピック
 - 言語
FaceBookのgraph apiでデータオーグメンテーションする

facebookのGraphAPIで様々なサイトのページの評価を得ることで、Webページのデータオーギュメントを行います。　　

例えば、毎日大量に投稿されるYahooNewsは記事によって大きくアクセス数が違うはずですが、アクセス数等が公開されていなく、 GraphAPIを用いると自動化した記事取得の中から、何が今よく参照されているのがよくわかったりします。  

何がよく参照されているかわからないまま、全体のコーパスを平等に用いるより、なんらかのデータオーギュメントしたものを用いるほうが一般的に良いです。

## 課題
Yahoo Newsを日々スクレイピングして、自然言語のコーパスとして、私的利用の範囲内で利用しているのでが、Yahoo Newsはページのアクセス数やSNSで共有した数などはわかりません。

そのため、日々膨大な記事が投稿されるYahoo Newsなどのサイトのいてコーパスだけでなく、何かのデータを拡張する手段が必須になってきます。

## 解決
Yahoo Newsの運営者でもなければ誰からどのようなアクセスがあったかなど、何もわからないのですが、幸いにしてYahoo NewsはURLでFaceBookに公開できるUIになっており、これが記事の間接的な人気度などと考えることができそうです。  

FaceBookのGraphAPIを利用することで、記事が書かているURLに対してFB内部でのイイネ数などの数値が表現されるので、これを用いることができます。  

GraphAPIを利用するには開発者登録と、アクセストークンの発行が必要です。  

### Facebook Developerの登録
[このURL](https://developers.facebook.com/?locale=ja_JP)から登録できます。

### Graph APIのアクセストークンの発行
[このURL](https://developers.facebook.com/tools/explorer?method=GET&path=me%3Ffields%3Did%2Cname&version=v3.1)から登録する

## サンプルクエリ
Python等でラップアップしているととても便利です

```python
import requests
import json

acc = input()
for url in ['https://headlines.yahoo.co.jp/hl?a=20180928-00000367-oric-ent']:
  query = f'https://graph.facebook.com/?id={url}&fields=og_object{{engagement}},engagement&access_token={acc}'
  r = requests.get(query)
  obj = json.loads(r.text)
  print(json.dumps(obj, indent=2))
```

## サンプル出力
このように、リアクションの個数、コメントの個数、シェアの個数がわかります

```json
{
  "engagement": {
    "reaction_count": 56,
    "comment_count": 14,
    "share_count": 28,
    "comment_plugin_count": 0
  },
  "id": "https://headlines.yahoo.co.jp/hl?a=20180928-00000367-oric-ent"
}
```

## プログラムの概要

**[GitHub](https://github.com/GINK03/facebook-graphapi-augment)**

**00-pooling.py**  
10-xml_parse.py, 20-darturl-clean.pyをラップして10分に一度、最新のYahoo Newsがを取得します

**30-facebook_scores.py**  
graph apiを通じて、Yahoo NewsのFBの反応をJSON形式で取得します。  
ご自身のFBアプリを登録してtokenをtokensというテキストファイルに書き出しておく必要があります  

**40-parse.py**  
graph apiの結果とYahoo Newsでスクレイピングした結果を突合して、一つのファイルにまとめます。  


ここまでやったら、株価でも、なんでもこの世の中の事象を学習すると多少の改善が見込めているはずです。
Rubyのブロック 色々試してみた

Rubyのブロックは、苦手意識があったので「プロを目指す人のためのRuby入門」を参考に、色々コードを打ってみた。

## yieldでブロックの処理を呼び出す

```ruby
def sports
  puts 'サッカー'
  yield
  puts '野球'
end

sports do
  puts 'バスケ'
end

```

### 結果

```
サッカー
バスケ
野球
```

`def sports`内の`yield`のところで`sports do 〜 end`内部の処理が呼び出される。

## ブロックに引数を渡す(1)

```ruby
def sports
  puts 'サッカー'
  yield 'バスケ'
  puts '野球'
end

sports do |sport|
  puts "#{sport}がしたいです"
end
```

### 結果

```
サッカー
バスケがしたいです
野球
```

yieldで`バスケ`を引数としてブロックに渡し、ブロックがブロック変数`sport`で受ける。変数sportと式展開で合体させた文字をブロック内で出力させる処理をすると、yieldのところで実行される。

## ブロックに引数を渡す(2)

```ruby
def sports
  puts 'サッカー'
  message = yield 'バスケ'
  puts message
  puts '野球'
end

sports do |sport|
  "#{sport}がしたいです"
end
```

### 結果
```
サッカー
バスケがしたいです
野球
```

ブロック内の`"#{sport}がしたいです"`と言う処理を、メソッド内でローカル変数messageに一旦代入し、それからputsで出力している。


## こんなやり方も(１)

```ruby
def sports
  sports_comics = ['キャプテン翼', 'SLUM DUNK', 'MAJOR']
  yield sports_comics
end

sports do |sports_comics|
  sports_comics.each {|comic| puts "#{comic}を読もう！"}
end
```

### 結果
```
キャプテン翼を読もう！
SLUM DUNKを読もう！
MAJORを読もう！
```

## こんなやり方も(2)

```ruby
def comics
  sport = '野球'
  comics = ['MAJOR', 'ドカベン', 'ROOKIES']
  yield sport, comics
end

comics do |sport, comics|
  puts "#{sport}の漫画と言えば#{comics.join('、')}でしょう！"
end
```


### 結果

```
野球の漫画と言えばMAJOR、ドカベン、ROOKIESでしょう！
```

自分で色々やってみないと、説明を読んだだけではよく分からない。
ゲームジャムでのUnity開発の進め方

前までゲームジャムで、うまく行かずまとまらなかったり、完成させることが出来ませんでした。
最近完成させることが出来るようになってきました。
その時にUnityの開発方法について話していきます。

# 私のスペック

私ですが普段はサーバーやインフラ系を中心にお仕事しています。
仕事ではUnityは全く触らないし、プライベートもそこまで時間を割いてUnityの学習をしているわけではありません。
レベルとしてはUnity初心者以上中級未満です。
なので、Unityは分かって来たけどゲームが上手く開発出来ないという方にも参考になると思います。

# 開発の流れ

注意ですが、あくまで私流でこのやり方が一番いいというわけではありません。
また、エンジニア目線なのでデザイナーやプランナーだとどう動けばいいかについては触れていません。
ちなみに製作時間は企画から始めて全部で8時間くらいを想定しています。

## 企画決め

企画を決めます。
たぶんテーマが与えられるので、それに沿ってチームで案を出して行くと思います。
この時、話が盛り上がって内容が膨れてしまいがち、なので適度に完成できる形に落とし込む必要があります。
以下のことを意識しながら形にしていくとまとまると思います。

- 画面はタイトル・インゲーム・リザルトのみ
- インゲームで使えるユーザーの操作方法は一種類のみ（タッチ、スワイプ、十字キーetc）

8時間での開発だとこれくらいが限度だと思います。
それ以上になると時間内に完成は難しくなります。本当に実装可能か一度見直してみる必要があります。
ゲームによっては調整しますが、だいたい上の２点を意識して形にして行きます。

あとこの段階で話し合いながら、Unityのバージョンや解像度、gitのリポジトリを決めておいた方がいいです。
時間も限られていますので、同時並行で出来ることはやっておいた方がいいです。
解像度はUIの調節等で一致している方が何かと便利です。

## 作業開始

開発時一番注意したいのは「コンフリクト」です。
コンフリクトで作業が巻き戻しになったり、手こずって時間がかかってしまします。
ただのタイムロスにつながるのでコンフリクトを起こさないように注意して開発していきましょう。

### 設計・共通部分の開発

まず、どのような設計にして、どうやって実現するかを話し合います。
ここできちんと話し合うことで開発方法の認識を合わせます。
ここで認識がズレていると、コンフリクトの元になります。

共通部分は同時に触るとコンフリクトする危険があるので、はじめは一つのPCでペア・モブプロ形式で作業をしていきます。
ドライバーとなる人はチームで一番Unityが出来る人がいいと思います。
私の場合はまずシーンの遷移を作ります。
どういう風にゲームが流れるかチームで共有できるし、作業分担をシーンごとに分けることが可能でコンフリクトの心配が減ります。

### 役割の分担・作業

共通部分が出来上がって来ると自然と割り振りが出来ると思います。
インゲーム部分は一人の人が作業した方がコンフリクトの心配がないので安心です。
少なくともシーンを触る人は一人にした方が無難です。
他の人でタイトルやリザルトなどを作成します。
プログラマーの人数が多い場合は素材集めやプレゼン作成に回りましょう。

コミットに関しては都度pushすることをおすすめします。
小さい範囲のコンフリクトならわりと解決できますが、範囲が大きいとコンフリクトをうまく解決できなく苦労します。
定期的にお互いに声をかけあいながらpush・merge・pullを細かく行いましょう。
共通で使うプレハブがある場合もコンフリクトしないように注意が必要です。

### 調整

ラスト１時間くらいになったら、もう一度ペア・モブプロ状態に戻ります。
ここからコンフリクトしたら、時間がない中修正しないといけなくなるので、焦りがちです。
なので、最後のブラシュアップは一つのPCでやることをオススメします。
作業が終わっておらず時間的に並列して作業する必要がある場合は、触るクラスやシーンをきっちり決めてコンフリクトがないようにしましょう。

## 発表

順調にいけば見せることが出来るものが出来ていると思います。

# ひな形プロジェクト

以上のことから次回以降に使えそうなUnityのテンプレートプロジェクトを作って見ました。
https://github.com/orange634nty/GameJamTemplate

どういったものかを軽く説明します。
ちなみに、もっと上手く作れるかもしれませんが、とりあえずゲームジャム用なので動けばOKということで勘弁してください……

ひな形の中身は随時更新していこうと考えています。

ちなみに、パッケージ化しようとしたらDataStoreのプレハブが壊れてしまい、正しくパッケージ化できません……

## シーン

シーンはTitle、Main、Resultの３つあります。
それぞれTitle->Main->Result->Titleの順番で遷移します。
Title->Mainはボタンを押すことで、Main->Result、Result->Titleはキーボードのスペースキーを叩くことで遷移します。

## アスペクト比の固定

### Cnavasのアスペクト比固定

TitleSceneにボタンをuGUIで実装してます。
Cnavasのアスペクト比を固定するためにデフォルトと異なる設定をしています。
こちらを参考に設定しています。
http://tsubakit1.hateblo.jp/entry/2014/12/11/223427

### カメラのアスペクト比固定

カメラもアスペクト比を固定する必要があります。
こちらのコードを参考に実装しています。
https://meideru.com/archives/556

## DataStore

シングルトンで実装しており、シーンをまたぐデータを一時的に入れておける箱的な感じです。
例えばMainシーンでの得点をResultシーンで表示させる際に使います。
今は中の実装がない空の状態です。

受け渡したいデータがある場合は、publicでプロパティを追加して使ってください。
本当は厳密にした方がいいですが、ゲームジャムなのでよっぽど複雑なデータの受け渡しをしない限り、これくらいシンプルに実装しても大丈夫でしょう。

# ゲームジャムに参加しよう！

といった感じで色々話しましたが、一番重要なのはゲームジャムに参加して場数を踏むことです。
慣れているとどれくらいに規模のゲームなら大丈夫か、どれくらいにペース配分で作業すれば間に合うか等の感覚が出来ます。
そういった感覚は実際にゲームジャムに参加して慣れていかないと難しいと思っています。
なので、臆せずどんどん参加していきましょう！
何より、開発する過程を楽しむのがゲームジャムの魅力だと思っています。
[Node] websocket + redis pub/subでサーバ発でclientに通知を送る

# Server発でclientにメッセージを送りたくなった
元々nodeで作ったwebsocket　serverでclient側と双方向通信をしていたんですが、別サーバやbatch処理などでの更新処理をトリガーとしてclient(の従来で使用しているchannel)にメッセージを送りたくなりました。
そこでいろいろ探してたら、redisにpub/sub機能というのがあり、それを使えば上手くいきそうなのでやってみました。

# 実装のイメージ
<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/90157/f2a16ab8-a4ff-b0b9-6938-fb2c05f5a9c6.png" width=50%>
</div>
# 使ったモジュール
* [redis pub/sub](https://redis.io/topics/pubsub)
    * 他のサーバでの変更を検知するために使用
* [socket.io-emitter](https://github.com/socketio/socket.io-emitter)
    * サーバ側からclientにメッセージを送るためのモジュール
* [socket.io-redis](https://github.com/socketio/socket.io-redis)
    * 異なるプロセスやサーバ間で動いているwebsocketサービスで接続先情報をredisで共有し、正常にemitやbroadcastを行えるようにするためのモジュール

# インストール
```shell

$ npm i -S redis
$ npm i -S socket.io
$ npm i -S socket.io-emitter
$ npm i -S socket.io-redis
```

#実装
まず、従来のsocketサービスの接続先を共有するために、socket.io-redisを入れる。

```js

// socket-server
const io = require('socket.io')();　// for socket server
const socketRedis = require('socket.io-redis');

// 接続先情報をredisに保存
io.adapter(socketRedis({
  host: 'localhost', //サンプルなので一旦ローカルのredisを参照
  port: 6379,
}));

// 〜〜〜従来のsocket処理〜〜〜
```

次に、サーバ発のメッセージを送るためにio-emitterを入れる。

```js
// 先ほどと同じredis情報を渡して起動することで、接続情報を共有
const emitter = ioEmitter({
  host: 'localhost',
  port:　6379,
});
```

最後にredisのsubscriberを作成し、それをトリガーとしてio emitterでclientにemitする。

```js
const redis = require('redis');
// subscribeする用のredis clientを作成
// ここではめんどくさかったので、接続情報を登録するものと同じものを使用
const Subscriber = redis.createClient(6379, 'localhost');

// redis-publisherからのメッセージを受け取るチャンネルを登録
Subscriber.subscribe('SUBSCRIBE_CHANNEL');

exports.register = (emitter) => {
  Subscriber.on('message', (channel, message) => {
    switch (channel) {
      // 該当のチャンネルにメッセージが飛ばされたら場合分けして処理
      case 'SUBSCRIBE_CHANNEL':
        emitter.to('CLIENT_CHANNEL').emit('Hello!! I am redis-subscriber.');
        break;
    }
  });
};

```

これで、別サーバにからredisのpublisherを使って「SUBSCRIBE_CHANNEL」にメッセージを送れば、フロントで「CLIENT_CHANNEL」を開いている全員に向けて「Hello!! I am redis-subscriber.」というメッセージを通知できる。

# 最後に
redisのpub/subとsocket.io-emitterを使ったら、他のサーバと同期を取りながらいい感じにフロントに通知を送ることができるようになりました。
サンプルは[ここ](https://github.com/ykmikan/websocket-redis-pub-sub-sample)に置いておきましたのでよろしければご参照ください。

間違い等あったら教えてくれると嬉しいです。
人工知能の学習

#人工知能の学習
講師　[我妻幸長（Yukinaga Azuma ）](https://www.udemy.com/user/wo-qi-xing-chang/)

##数学
- [【レクチャー: 人工知能と数学】](https://youtu.be/tZL1tC5h0S4)
- [【レクチャー: 累乗と平方根】](https://youtu.be/paNrjsQleA0)

##入門動画
- [はじめてのディープラーニング -Pythonで学ぶニューラルネットワークとバックプロパゲーション-](https://youtu.be/od7P50-ny1I)
-
gradle wrapper でバージョン指定せずに最新バージョンにする

基本は Gradle のバージョンは wrapper で固定しておきます。変更する場合は https://services.gradle.org/distributions/ でバージョンを確認して、gradleVersion や gradle-wrapper.properties を手で書き換えて。。。 いやいや、そうぢゃなくて、俺は常に最新版にしときたいんだ！ っていう人向け。

```gradle:build.gradle
import groovy.json.JsonSlurper

wrapper {
    doFirst {
        def versionService = new URL('https://services.gradle.org/versions/current')
        gradleVersion = new JsonSlurper().parseText(versionService.text).version
        print("gradleVersion: " + gradleVersion)
    }
}
```

```:実行
gradlew wrapper
```

ちょっとゴリゴリですが、これでバージョン指定せずに Gradle wrapper を最新に更新でき、更新後のバージョンは gradle/wrapper/gradle-wrapper.properties で確認することができます。IntelliJ などで bin.zip ではなく、all.zip が必要な場合は、distributionType = Wrapper.DistributionType.ALL を指定します。

wrapper タスクすら実行したくないっていう人は dependsOn とかで。
Laravelで発行されたSQLをUnitテストで確かめる

# 環境: Laravel 5.6

Laravel5系では、発行されたSQLを以下の手順で確認できます。
1. `DB::connection()->enableQueryLog();` 
2. データベースアクセスのメソッドを実行する。
3. `DB::getQueryLog();`

これを使ってPHPUnitでRepository層のテストを書くことが目標です。
例として、指定したUserIdで直近２週間の記事一覧を返すメソッドのテストを実装します。

# サンプルのテストコード
```
public function testQueryTest()
    {
        $article = new Article; //Eloquent Model
        $repository = new ArticleRepository($article);//コンストラクタイジェクション

        DB::connection()->enableQueryLog();
        $repository->listById(1);
        $queries = DB::getQueryLog();

        $this->assertEquals(
            $queries[0]['query'], 
        "select * from `articles` where `user_id` = ? and `created` >= ?"
        );
        $this->assertEquals(
            $queries[0]['bindings'], 
        [
            0 => "1", 
            1 => "2018-09-17 00:00:00"]
        );
    }
```
テストを実行
`vendor/bin/phpunit --filter=testQueryTest`
`OK (1 test, 2 assertions)`

# 解説

上記サンプルで`$queryies`をdumpするとこのようなデータが得られるので、assertEqualsに突っ込んでます。

```
array:1 [
  0 => array:3 [
    "query" => "select * from `articles` where `user_id` = ? and `created` >= ?"
    "bindings" => array:2 [
      0 => 1
      1 => "2018-09-17 00:00:00"
    ]
    "time" => 25.52
  ]
]
```

# 感想
DBアクセス層の仕様を表現するには生のSQL以上のものはないので、明快なUnitテストが書けました。また、テストコードにはWhatを記載せよとの教えの通り、ドキュメントとしての役割も持たせられたと思います。
ただ、これを全Repositoryのテストに導入するぞ！となったら作業コストやパフォーマンス面が心配です。
主にデバッグ用途に使って、変更が多い機能や、サービスのコアになる複雑な機能には導入すると安全なのかなと思いました。
ubuntu 18.10のdocker imageでgitがapt-getできないとき。

###なぜかubuntu 18.10のdocker imageでgitをapt-getしようとするとエラーでまくりになりました。
取得するサーバーをjaistに変えたらさくっと動くようになりました。

FROM ubuntu:18.10
RUN sed -i.bak -e "s%http://[^ ]\\+%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list \
&& apt-get update \
&& apt-get -y upgrade
RUN apt-get -y install git`

参考
- https://qiita.com/fkshom/items/53de3a9b9278cd524099
C#    Hello World!プログラム

using System;

namespace Hello
{
    class Program
    {
        static void Main(string[] args)
        {
            // 文字列の表示
            Console.WriteLine("Hello, World!");
        }
    }
}

●プログラムを実行●
Visual Studio2017で「デバッグ」→　「デバッグなしで開始」を選択する。
ビルドして実行したらMain{}の中に書いた命令が実行されます。
出力する文字列は「"」で囲みます。
Docker初心者のRuby開発環境構築

#はじめに
インフラの知識がなくても楽して環境が作成できると聞いたので使ってみたが、
実際にはかなり苦労したので自分なりにまとめました。

環境：centos7、Docker18.06.1
※Docker for Windowsでも確認済み

#Dockerの流れ
1. Docker HubまたはDockerfileからイメージを取得
2. イメージからコンテナを作成・実行

<img width="418" alt="zu4.png" src="https://qiita-image-store.s3.amazonaws.com/0/256753/ffc72119-64a7-fa52-2436-2c1a855f6e05.png">


#イメージ？コンテナ？？
イメージが湧かないので身近なものに当てはめて例えてみました。
####VirtualBoxで例えてみた
* イメージ → スナップショット
* コンテナ → 仮想マシン

スナップショットからスナップショット取得時点の仮想マシンを作成
同じ状態の仮想マシンを複数作成可能

<img width="222" alt="zu2.png" src="https://qiita-image-store.s3.amazonaws.com/0/256753/66a7ddde-d5a8-6981-5d77-c3d7ec2fd3dd.png">


####ゲームで例えてみた
* イメージ → セーブデータ
* コンテナ → ゲーム機＋ゲームソフト

セーブデータからセーブ時点のゲームを再開
同じゲーム状態を複数端末で作成可能

<img width="222" alt="zu3.png" src="https://qiita-image-store.s3.amazonaws.com/0/256753/3c1491f6-8ca8-ef42-ba7b-4fb0789a67ef.png">


#本題
Dockerを理解するために3種類の方法で環境構築を実施
####1. centOSのイメージから自分でRuby開発環境を構築
・イメージの取得、コンテナの作成・実行

```
docker pull centos
docker run -it --name centosRuby centos /bin/bash --login
```

・ここからはLinuxの話
以下の記事を参考にRubyをインストールしていく。
[CentOS 7.3にRuby 2.4.1をインストールする](https://qiita.com/micheleno13/items/c0f8160b0deb2984677f)

```
★rbenvのインストール
root@00:/# yum install -y git
root@00:/# git clone https://github.com/rbenv/rbenv.git ~/.rbenv
root@00:/# echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
root@00:/# ~/.rbenv/bin/rbenv init
root@00:/# source ~/.bash_profile

★ruby-buildのインストール
root@00:/# git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
root@00:/# ~/.rbenv/plugins/ruby-build/install.sh

★Rubyのインストール
root@00:/# yum install -y openssl-devel readline-devel zlib-devel 
root@00:/# yum remove bzip2
root@00:/# yum install -y bzip2 gcc make
root@00:/# rbenv install 2.5.0
root@00:/# echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
root@00:/# source ~/.bash_profile
root@00:/# rbenv global 2.5.0
```

・Rubyファイルの作成

```
root@00:/# vi hello.rb
```
```ruby:hello.rb
puts "Hello World"
```

・Hello World 出力

```
root@00:/# ruby hello.rb 
Hello World
```

####2. Dockerfileからイメージを作成
・1.の操作を元に作成したDockerfileをGitHubから取得する。
https://github.com/manchan13/centos_ruby25

```
ll -tr
合計 12
-rw-r--r-- 1 test test  42  9月 24 23:17 hello.rb
-rw-r--r-- 1 test test  16  9月 24 23:17 README.md
-rw-r--r-- 1 test test 962  9月 24 23:17 Dockerfile
```

・docker buildでイメージを作成

```
docker build -t centos_ruby_dockerfile .
```
・作成したイメージの確認

```
docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
centos_ruby_dockerfile           latest              46fa6e609251        2 minutes ago       555MB

```

・コンテナ作成・実行

```
docker run -it --name centosRubyDockerfile centos_ruby_dockerfile /bin/bash --login
```

・Heloo World 出力

```
[root@00 /]# cd ~/
[root@00 ~]# ruby hello.rb 
hello world!hello world!!
```

####3. Rubyのofficialイメージから作成
これが一番楽ちん

・イメージ取得、コンテナの作成・実行

```
docker pull ruby
docker run -it ruby /bin/bash
```
・rubyイメージにはvimが入ってないのでそのままHello World 出力

```
root@00:/# ruby -e 'puts "Hello World"'
Hello World
```
正規表現

####正規表現パターンは、/abc/ のような単純な文字、または /ab*c/ や /Chapter (\d+)\.\d*/ のような単純な文字と特殊文字との組み合わせからなります。
```javascript
var line = chunk.toString();
    var arr = line.split(' '); 
var item  = arr[i].replace(/\r?\n/g, '')
```
######? ... 直前の項目を０回または、１回だけ繰り返す。
######g ... グローバルサーチ。最初に一致したものだけでなく、一致するもの全てを検索する。
Elasticsearchで現在時刻を基準に範囲検索する

Elasticsearchでは現在時刻を基準に範囲検索することが可能です。
[公式ドキュメント](https://www.elastic.co/guide/en/elasticsearch/reference/6.4/query-dsl-range-query.html#ranges-on-dates)を見ながら範囲検索について少し検証してみたのでそのメモです。

# 環境
Elasticsearch 6.4.0

検索対象として以下のようなデータを準備しておきます。

```json
{"date": "2018-09-30T00:00:00+09:00"},
{"date": "2018-09-30T00:01:00+09:00"},
...
{"date": "2018-09-30T23:59:00+09:00"}
```

# 日付計算に利用できるパラメータ
日付計算には以下のパラメータを利用できます。

|パラメータ|意味|
|---|---|
|now|現在時刻|
|y|年|
|M|月|
|w|週|
|d|日|
|h/H|時|
|m|分|
|s|秒|

参考：[Date Math](https://www.elastic.co/guide/en/elasticsearch/reference/6.4/common-options.html#date-math)

# 現在時刻から加減算する
`now`に対して`+`または`-`することで、現在時刻に対して加減算を行うことが出来ます。
複数のパラメータを利用したい場合は、それぞれに対して`+`または`-`を指定してください。

```json:現在時刻から1時間後まで
{
  "query": {
    "range": {
      "date": {
        "gte": "now",
        "lt": "now+1h"
      }
    }
  }
}
```

```json:2.5時間前から現在時刻まで
{
  "query": {
    "range": {
      "date": {
        "gte": "now-2h-30m",
        "lt": "now"
      }
    }
  }
}
```

# 現在時刻から月や日の初めを計算する
`now`に対して`/`の後ろにパラメータを指定することで、そのパラメータの初めの日時を計算することが出来ます。
例えば、`/d`を指定した場合は今日の00:00:00.000になります。
ただし、Elasticsearchは時刻をUTCで扱っていますので、JSTの場合は`"time_zone": "+09:00"`を指定しないとJSTに変換された結果、今日の09:00:00.000を指定したことになってしまいますので注意してください。

```json:月の初め以降
{
  "query": {
    "range": {
      "date": {
        "gte": "now/M",
        "time_zone": "+09:00"
      }
    }
  }
}
```

```json:日の初めから現在時刻まで
{
  "query": {
    "range": {
      "date": {
        "gte": "now/d",
        "lt": "now",
        "time_zone": "+09:00"
      }
    }
  }
}
```

# 特定の時刻を指定する
現在時刻から特定の時刻（例えば12時など）を指定する場合、日の始めの計算と時刻の加算を組み合わせることで実現できます。

```json:今日の12時以降
{
  "query": {
    "range": {
      "date": {
        "gte": "now/d+12h",
        "time_zone": "+09:00"
      }
    }
  }
}
```
これをKibanaのフィルターとして設定すれば、VisualizeやDashboardを開いた時刻を基準に特定時刻のデータを利用することが出来ます。
例えば、Visualizeで前日の12:00から今日の12:00までのデータを利用したい場合、以下のクエリをフィルターとして設定することで、Visualizeを開いた日を基準に対象データを絞り込むことが出来ます。

```json:前日の12時～今日の12時
{
  "query": {
    "range": {
      "date": {
        "gte": "now-1d/d+12h",
        "lt": "now/d+12h",
        "time_zone": "+09:00"
      }
    }
  }
}
```
matplotlibを使ってデータ可視化(箱ひげ図)

今回はPython3のmatplotlibの簡単な使い方について話したいと思います．
なぜwxpythonの続きではなく？--->理由は授業で使うからの理由でmatplotlibにした．

## matplotlibとは
matplotlibはPythonでグラフを描画するときなどに使われる標準的なライブラリです．
画像ファイルを作るばかりでなく，簡単なアニメーションやインタラクティブなグラフを作ることもできます．
実際の例はmatplotlibサイトのギャラリーで見ることができます．
https://matplotlib.org/gallery.html

## 準備
サンプルコードを動かす上で予めいくつかモジュールを読み込んでおきます．

``` python
import numpy as np
import matplotlib.pyplot as plt
```

Wikipediaで[matplotlib](https://ja.wikipedia.org/wiki/Matplotlib)を見てみると以下の4つのグラフについて紹介しました．

- 折れ線グラフ
- ヒストグラム
- 散布図
- 3Dグラフ

今回のデータ可視化する図は箱ひげ図となります．

## 箱ひげ図

箱ひげ図を作るに当たって，まず箱ひげ図についての見方について話します．
四分位数の値を箱ひげに当てはめると次のようになります．
![スクリーンショット 2018-09-25 11.23.11.png](https://qiita-image-store.s3.amazonaws.com/0/179248/d1580046-dd7b-4567-ee95-957cdb24d9c9.png)

最大値と最小値についてはみんなが分かると思いますが，四分位数について分からない人があると思いますので，簡単に紹介します．
四分位数をパーセンタイルに置き換えてに考えると非常に簡単です．

- 25パーセンタイル＝第一四分位数
- 50パーセンタイル＝第二四分位数
- 75パーセンタイル＝第三四分位数

![スクリーンショット 2018-09-25 11.26.33.png](https://qiita-image-store.s3.amazonaws.com/0/179248/1aab041e-5775-c444-9ab8-d8a6e1564d20.png)

この3つの四分位数で区切ると，データの個数を4等分することができます．また，第三四分位数から第一四分位数を引いたものを四分位範囲（Inter Quarter Range 略してIQR）といいます．

## プログラム

まず，今回で使うデータセットは事前にSQLiteで作成したRecord(データベース名)を利用します．

Japanese(Table Name)

| 学籍番号     |       点数|  
|:-----------------|------------------:|
| JA01             |       16        |
| JA02             |         88      |
| JA03             |       94       |
| JA04             |         76      |
| JA05             |           41    |
| JA06             |             65  |
| JA07             |         25      |
| JA08             |          68     |
| JA09             |         97      |
| JA10             |          43     |

English(Table Name)

| 学籍番号     |       点数|  
|:-----------------|------------------:|
| JA01             |       54        |
| JA02             |         28      |
| JA03             |       98       |
| JA04             |         71      |
| JA05             |           40    |
| JA06             |             75  |
| JA07             |         66      |
| JA08             |          70     |
| JA09             |         57      |
| JA10             |          47     |

```python
import sqlite3
import matplotlib.pyplot as plt
import numpy as np

# データベースに接続
dbname = "Record.sqlite3"
conn = sqlite3.connect(dbname)
c = conn.cursor()

# データを取り出す
Japanese_select = "select mark from Japanese"
English_select = "select mark from English"

Japanese = c.execute(Japanese_select).fetchall()
English = c.execute(English_select).fetchall()

# 点数のタプル
points = (mark(Japanese),mark(English))
# 箱ひげ図
fig, ax = plt.subplots()

bp = ax.boxplot(points)
ax.set_xticklabels(['Japanese', 'English'])
# タイトル名
plt.title('Japanese & English Box Plot')
# ラベル名
plt.xlabel('subject')
plt.ylabel('points')
# Y軸のメモリの長さ
plt.ylim([0,100])
plt.grid()
# 描画
plt.show()

# データベースを閉じる
conn.close()x
```

上のプログラムを実行して表示する図は以下のようになります．
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/179248/f3597bea-4d43-a63c-ef2e-3059042b619e.png)

今回のmatplotlibを使ってデータ可視化(箱ひげ図)は以上で終わります．
読んでいただいてありがとうございます．
with構文の中でスレッドをロックしたい

# はじめに
単純に，with構文でスレッドセーフな処理を行いたいというのが動機です．`threading.Lock`自体がwith構文をサポートしていますが，with構文の中でwith構文を使った場合，ブロックを抜けるのがどのタイミングかわからず，検証が難しいと思ったのが動機です．

また，任意のタイミングでスレッドのロックと解放を指定するサンプルが非常に少ないです．かろうじて見つかりはしましたが，そもそも2008年とあまりにも記事が古く，2.x系の話をしているのではと思い，実際に動くかどうか調査することにしました．

## 簡単なサンプル
サンプルではクラスにwith構文を実装し，内部でスレッドをロックしています．そして，ブロックから抜けたときにスレッドを解放するようにしています．

```py 
from threading import Lock 

class Test:
    _lock = Lock()

    def __init__(self):
        print("init")
    
    def __enter__(self):
        Test._lock.acquire()
        print("inter lock")
        return self
    
    def __exit__(self, type, value, trace):
        print("exit")
        Test._lock.release()
    
    def hello(self):
        print("hello")

with Test() as t:
    t.hello()
```

`Test._lock`変数はstaticな変数です．従って，クラス間で共有されています．

例えば，この`Test`クラスがWebアプリケーションのデータベース周りの処理だったとして，複数リクエストが発生して同時に`insert`すると例外を発生する，もしくはデータの整合性が取れなくなる，という仕様だった場合，スレッドをロックしないと非常に困ったことになります．

クラス利用者がスレッドセーフな処理を意識せずにコードを書ける，ということは地味に重要なことです．

## with構文が走るとロックするようなクラスを作る

当然ですが，他にも同系統のクラスを作成することが考えられます．

でしたら，クラスを継承するだけで自動的にwith構文の中でスレッドをロック・解放する処理ができると便利ですね．

```py
from threading import Lock 

class TestInterface:
    _lock = Lock()

    def __init__(self):
        print("init Interface")
    
    def __enter__(self):
        Test._lock.acquire()
        print("inter lock")
        return self
    
    def __exit__(self, type, value, trace):
        print("exit")
        Test._lock.release()
    
    def hello(self):
        print("hello")

class Test(TestInterface):
    def __init__(self):
        super().__init__()
        print("init Test")

with Test() as t:
    t.hello()
```

この例では親クラスとして`TestInterface`を作り，`Test`クラスで継承しています．これにより，with構文に入った段階で自動的にスレッドをロックするような仕組みを作れます．

## 注意点
子クラスで`__enter__`や`__exit__`を実装すると，親クラスの`__enter__`や`__exit__`が実行されません．子クラスで明示的に親クラスの`__enter__`や`__exit__`を呼び出してあげる必要があります．

子クラスでもwith構文を実装する場合は以下のようになります．

```py
from threading import Lock 

class TestInterface:
    _lock = Lock()

    def __init__(self):
        print("init Interface")
    
    def __enter__(self):
        Test._lock.acquire()
        print("interface lock")
        return self
    
    def __exit__(self, type, value, trace):
        print("interface exit")
        Test._lock.release()
    
    def hello(self):
        print("hello")

class Test(TestInterface):
    def __init__(self):
        super().__init__()
        print("init Test")
    
    def __enter__(self):
        super().__enter__()
        print("in test")
        return self 
    
    def __exit__(self, type, value, trace):
        super().__exit__(type, value, trace)
        print("out test")

with Test() as t:
    t.hello()
```

# おわりに
with構文中にスレッドを自動的にロック・解放する仕組みについて説明しました．神クラスに`threading.Lock`を持たせるのも有りですが，あまり美しくはありません．もし神クラスに持たせてしまったなら，逐一ロックされてスレッドが円滑に処理できなくなります．

マルチスレッドで重要なのはロックする場所です．今回は局所的にwith構文を使ってロックする方法を説明しました．以上です．
Warden::Manager.after_authentication 内では auth から request が取得できる

タイトルでほぼ完結していますｗ

Devise を使った認証動作にログイン後に動作するフックを追加したのですが、フック内でリクエストが必要になり、どうやれば取得できるのかわからずハマったんですが、タイトルの方法で取得できたという話です。

状況が限定的であまり汎用性はないかもしれませんが、もしかしたら世の中には一人くらい私と似たようなハマり方をする人もいるかもしれないと思い記事にするだけしてみました。よろしければお付き合いください。

## 動作環境
- Ruby 2.4.2
- Rails 5.2.0
- Devise 4.4.3

## 背景など
仕事でとある rails アプリケーションの開発を行っています。その際に｢ログインするたびに○○をさせる｣という処理を追加することになりました。

ログインまわりは [*Devise*](https://github.com/plataformatec/devise) を使って実装していましたので、下記の参考記事を見て、 Warden の callbacks を使えば前述動作を実現できそうと思いその方向で進めました。

### 参考記事
- [Can I execute custom actions after successful sign in with Devise?
](https://stackoverflow.com/questions/4753730/can-i-execute-custom-actions-after-successful-sign-in-with-devise#answer-27337802)
- [Deviseを使っていて初回ログイン時のみ処理を行いたい場合](https://qiita.com/knt45/items/984a3ec14bd88110eb48)


### コード概要
認証後に毎回動くフックは [after_authentication](https://github.com/wardencommunity/warden/wiki/Callbacks#after_authentication) のようです。なのでこれを使いました。
initializers 配下にさえあればなんでも良さそうですが、別ファイルにするほどでもないので今回は devise.rb の一番下に追加しています。これでログインのたびに下記ブロック内の処理が実行されます。

```ruby:config/initializers/devise.rb
Devise.setup do |config|

  # 諸々やってますがここでは省略

  # ログイン後のフック
  Warden::Manager.after_authentication do |user, auth, _opts|
    # ここでいろいろやるよ
  end
end
```

## 本題
で、ここからが今回の記事の話です。
とある理由からここで request の取得が必要になりました。(まあ、ヘッダ見たりIP見たりとかそんなところです)
しかし、initializers でどうやれば request の取得ができるのかわからずけっこうハマりました。

で、いろいろ調べてみたところ、このフックの2番目の引数である `auth` から request が取得できることがわかりました。
コールバックの2つめの引数に来ている `auth` は、[`Warden::Proxy`](https://github.com/wardencommunity/warden/blob/5b3cbd5bef67cbe399bb7007537bc4841bbee772/lib/warden/proxy.rb) のインスタンスです。さらに、ここに include されている [`Warden::Mixins::Common`](https://github.com/wardencommunity/warden/blob/5b3cbd5bef67cbe399bb7007537bc4841bbee772/lib/warden/mixins/common.rb) を追ってみると `request` といういかにもリクエストが取得できそうなメソッドを発見しました。

https://github.com/wardencommunity/warden/blob/5b3cbd5bef67cbe399bb7007537bc4841bbee772/lib/warden/mixins/common.rb#L16-L20

```ruby:warden/lib/warden/mixins/common.rb
# Convenience method to access the rack request.
# :api: public
def request
  @request ||= Rack::Request.new(@env)
end # request
```

よさげですね。

### Rack概要
こちらがわかりやすかったです。
https://route477.net/d/?date=20080716

Rackの理解は筆者もまだ怪しいのでもうちょっと勉強が必要そうです:sweat:


## 使ってみました

下記のとおり試してみたところ、期待していたリクエストのインスタンスが取れました。あとはどうとでもできそうです。やったね:thumbsup:

```ruby
pry(main)> auth.request.class
=> ActionDispatch::Request
```

## 雑感

確認はしてませんが、`after_authentication` 以外のフック内でも使えると思います。もし似たような内容でお困りの方は試してみてください。

### Warden Callbacks
公式リポジトリの Wiki です。
https://github.com/wardencommunity/warden/wiki/Callbacks
Rubyの配列を繰り返し処理で取りだす②

[Rubyの配列を繰り返し処理で取りだす①](https://qiita.com/hirokobe26/items/cdbd744edcfdecdf47fe)の続きです。

eachやfor以外での取り出し方を学んだので、メモ

```ruby:sample.rb
schools = ["Todai", "Kyodai", "Waseda"]
schools.each_with_index do |school, i|
    puts "#{i}番目の生徒は#{school}を卒業した"
end
=>
0番目の生徒はTodaiを卒業した
1番目の生徒はKyodaiを卒業した
2番目の生徒はWasedaを卒業した
```
each_with_indexと記述することで、配列のインデックス番号も一緒に取得することができる。　第１引数には配列の要素が入って、第２引数にはインデックス番号が入る。

```ruby:sample.rb
numbers = [1,2,3,4,5]
results = numbers.map do |number|
    number * 10
end
p results
=>
[10, 20, 30, 40, 50]
```
mapメソッドを使って配列の要素をひとつづつ取り出して、繰り返し処理の中で計算した結果を、配列として違う変数に格納、なんてこともできるらしい。

あれ？　each_with_indexでもmapと同じようにブロック内で処理した結果を、配列として違う変数に格納できないかな？、と思って以下を実行してみた。

```ruby:sample.rb
schools = ["Todai", "Kyodai", "Waseda"]
result = schools.each_with_index do |school, i|
    "#{i}番目の生徒は#{school}を卒業した"
end

p result
=>
["Todai", "Kyodai", "Waseda"]
```
あれ。。。？　下記のような結果を期待してたけど、違うみたいだ。
　["0番目の生徒はTodaiを卒業した", "1番目の生徒はKyodaiを卒業した", "2番目の生徒はWasedaを卒業した"]

しょうがないからmapを使って表現してみようとして、以下を実行してみた。

```ruby:sample.rb
results = schools.map do |school, i = 0|
    "#{i}番目の生徒は#{school}を卒業した"
end
p results
=>
["0番目の生徒はTodaiを卒業した", "0番目の生徒はKyodaiを卒業した", "0番目の生徒はWasedaを卒業した"]
```

いける！　と思って以下をさらに実行してみた。　

```ruby:sample.rb
results = schools.map do |school, i = 0|
    "#{i}番目の生徒は#{school}を卒業した"
    i += 1
end
p results
=>
[1, 1, 1]
```

できない。。。　こんなの何に使うんだよって感じですが、もしどなたか知っていたらご教授いただけると幸いです。
Windows10でGo言語に触れてみる

# あらすじ
業務でGo言語を使う機会が出始めました。
家でも練習したいと思ったので、環境構築したいと思います。

https://qiita.com/FoxBoxsnet/items/1537056dbd5f369dce0a

こちらのサイトを参考にしながら、実施したいと思います。

# 環境設定

## ダウンロード
まずはパッケージのダウンロードからです。
どうやら公式ホームページに環境構築用の実行ファイルが
置いてある模様。
さっそく実施してみたいと思います。

https://golang.org/doc/install?download=go1.7.windows-amd64.msi
こちらにアクセスしたら、勝手にダウンロードされました。笑
現段階でダウンロードされたのは、go1.7だけれども
これは最新版なのだろうか…

OKボタンをぽちぽち押しながら、インストール。

## 環境変数の設定
はてさて、インストールが終われば
待っていますのが環境変数の設定ですね。
初心者の頃はこの設定を見失っており、何度も失敗しました…
(Javaの悪夢は忘れない…)

さて、インストールしたのはCドライブ直下なのですが
中身にbinがありますね。
PATHに指定してあげましょう。

…あれ。
参考にしたサイトでは( https://qiita.com/kent_ocean/items/566e6a23d76ef3b4d125 )、
PATHもGOROOTも設定されてるって書いてあったけど
PATHだけない気がするぞ…まあいっか。笑

それにしても、システム変数であるGOPATHは手動で入れないといけないのね。
これが、作成したプロジェクトに渡してくれるパスか。
では、GOPATHに適当なフォルダを割り当てて、再起動しましょう。
(再起動しなきゃ反映してくれないあるあるっぽい)

…とシステム変数を設定しようとすると、新規作成できない。
あ、そっか。
管理者権限じゃないとダメか。
メモメモ。

## Hello World
さて、Hello Worldしましょう！
…と思ったら、あれ。
Windowsのコマンドプロンプトで使うコマンドを忘れたぞ。笑
ちょっとまとめる！

| Linux | Windows |
|:-----------:|:------------:|
| cd | cd |
| ls -l | dir |
| clear | cls |
| cat | type |
| vi | (none) |
| mkdir | md |
| cp | copy |
| mv | move |
| find | find |
| env | set |
| grep | grep |
| pwd | dir |
| rm | del |
| echo | echo |

こんなもんかなあ。
setコマンド使って環境変数表示させて、
パイプでgrep Goやってみたら、ちゃんと設定できてました！

```
C:\Users\Romeo>  set | grep Go
(割愛)
```

あと、go versionでちゃんとコマンド実行できることを確認。

```
B:\Document\Go\Projects>  go version
go version go1.7 windows/amd64
```

早速、Hello_World.goを作ってみましょうー！
ソースはこちら。
(https://qiita.com/maruyama42/items/7b6cd82eb37e2a524572 を参考にさせてもらいました。)

```go:Hello_World.go
package main

import "fmt"

func main() {
	fmt.Printf("Hello World!\n")
}
```

やっぱあれだね。
c言語っぽいよね！
親しみ深い…良き……

というわけでビルドしてみます。

```
B:\Document\Go\Projects>  go build Hello_World.go
```

こうすると、Hello_World.exeが作成されました。
あとは実行すれば、Hello Worldと表示されました。

```
B:\Document\Go\Projects>  Hello_World.exe
Hello world!
```

よしよし。
環境設定は終わりました！

次回は、Go言語で簡単な電卓を作ってみたいと思います！
Macでフォルダ・ファイルのフルパスを簡単に取得する方法

Windows7だとエクスプローラの上のパンくずリスト？みたいなところクリックしたら簡単に取れたのにな…

## Finderからフルパスを取得
前提としてターミナルとかそういう所からじゃなくて、Finder上からの取得方法です。

コンテキストメニュー（右クリック）を表示
![context_menu.png](https://qiita-image-store.s3.amazonaws.com/0/126861/af380299-29ad-a10b-28b0-90ecb397f316.png)

**alt（option）**キーを押下し続ける

![push_alt.png](https://qiita-image-store.s3.amazonaws.com/0/126861/4a8172a0-1261-5d7b-ced5-a20afadaaea3.png)

先程までコピーするだけのメニューが、パス名をコピーに変わります。

これで簡単にフルパスを取得することができます。
意外と知らない人もいたみたいなので、これを機に使ってみてください。
複数のバージョンのPythonで使えるPipfileの書き方

###### (An English translation is available [here](https://dev.to/tomoyukiaota/creating-a-pipfile-for-multiple-versions-of-python-9f2).)

# はじめに
`pipenv install`で生成したPipfileには、Pythonのバージョンの情報が含まれています。このPipfileは、別のバージョンのPythonがインストールされた環境では使うことができません。[^1] この記事では、Pythonのバージョンによらずに使えるPipfileの書き方を紹介します。

# 経緯 & 方法
Pipenvを使い始める際に、`pipenv install`を実行すると、以下のようなPipfileが生成されます。

```toml
[[source]]

url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"


[packages]



[dev-packages]



[requires]

python_version = "3.6"

```
Python 3.6.4をインストールしたWindows PC上で実行した結果です。

ここで、Python 3.7をインストールした別のWindows PCにこのPipfileを持っていき、`pipenv install`を実行したとします。すると、次のようなエラーメッセージが表示されます。

```
Requested Python version (3.6) not installed
Warning: Python 3.6 was not found on your system…
You can specify specific versions of Python with:
  $ pipenv --python path\to\python
```



pyenvをインストールしたmacOS/Linuxなら、[Pipenvが自動的にpyenvを使って必要なバージョンのPythonをインストールしてくれる](https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#automatic-python-installation)ようですが、残念ながら、pyenvはWindowsには対応していません。

ここで、Pythonのバージョンは特に指定する必要がない場合は、`[requires]`以下を消去すると、Pythonのバージョンによらず、`pipenv install`を実行することができるようになります。

```toml

[[source]]

url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"


[packages]



[dev-packages]


```



この方法は、公式ドキュメントに記載されている方法です。
https://pipenv-ja.readthedocs.io/ja/translate-ja/basics.html#specifying-versions-of-python

> 
The inclusion of [requires] python_version = "3.6" specifies that your application requires this version of Python, and will be used automatically when running pipenv install against this Pipfile in the future (e.g. on other machines). If this is not true, feel free to simply remove this section.

今回の方法を採用する場合は、Pipfile.lockはバージョン管理に含めないほうが良いと思います。Pythonのバージョンごとに異なる内容が出力される場合があるためです。
https://pipenv-ja.readthedocs.io/ja/translate-ja/basics.html#general-recommendations-version-control

> - 複数バージョンのPythonを対象とする場合は、 Pipfile.lock はバージョン管理に含めないでください。




[^1]: 正確には、major, minor versionが異なる場合は使えません。例えば、Python 3.7をインストールした環境では、3.6が記載されたPipfileを使えません。patch versionのみ異なる場合は使うことができます。例えば、Python 3.6.5をインストールした環境では、3.6.4が記載されたPipfileを使うことができます。
SpringBootのREST APIのリクエスト/レスポンスをCamelCaseからSankeCaseに変更する

# 背景
JSON APIがSnakeCaseが採用されているため
詳細は、[翻訳: WebAPI 設計のベストプラクティス](https://qiita.com/mserizawa/items/b833e407d89abd21ee72)を参照のこと

# 設定
SpringBoot 2.0.5.RELEASEであれば、application.ymlで記載すればよい。

```application.yml
spring:
  jackson:
    property-naming-strategy: SNAKE_CASE
```
Windows10 Cortanaのweb検索でFirefoxを使う方法

# 背景
Cortanaでweb検索をした際，既定のブラウザがFirefoxであるにもかかわらず，Edgeが開いてしまう．．．
この問題の解決方法を共有します．

なお，この記事はFirefoxの場合を想定しています．Chrome等を使用している場合，Bing2GoogleではなくChrometanaを代わりに使用してください．

# 環境
windows 10
Firefox Quantum 

# 必要なもの
- EdgeDeflector 
 
 <https://github.com/da2x/EdgeDeflector/releases>

- Firefox Add-on Bing2Google

<https://addons.mozilla.org/ja/firefox/addon/bing-2-google/>
(Chromeの場合Chrometana <https://chrome.google.com/webstore/detail/chrometana-redirect-bing/kaicbfmipfpfpjmlbpejaoaflfdnabnc>)

# 手順
## EdgeDeflectorのインストール
EdgeDeflectorの最新バージョン(記事執筆時EdgeDeflector version 1.1.3.0)をダウンロードし，インストールします．
<https://github.com/da2x/EdgeDeflector/releases>
既定のプログラムを選択するポップアップが出てくるので，EdgeDeflectorを選択します．
ひとまず，これで既定のブラウザを呼び出せるようになります．

## Bing2Googleのインストール
しかし，このまま検索をかけた場合，Bingでの検索をされてしまうため，Bingで呼び出した検索画面をGoogleに転送するAdd-onを導入します．
<https://addons.mozilla.org/ja/firefox/addon/bing-2-google/>

以上の手順でCortanaでweb検索した結果をFirefox上のGoogleで表示できるようになります．

# 参考
EdgeDeflector
https://www.ctrl.blog/entry/edgedeflector-default-browser
Bing2Google
https://www.gigafree.org/windows10/bing-google-nobing/
sudoで、特定のコマンドだけパスワードなし、他のコマンドはパスワード付きにする！

## 背景
あるユーザー（ここでは `user`）に、`sudo`によるコマンドの実行を許可したい。

- 基本的にはパスワードを要求する
- 特別に選んだコマンド（ここでは`/sbin/shutdown`と`/sbin/reboot`）だけはパスワードなしで実行させる

という設定にしたいんです！

## /etc/sudoersの設定
```:/etc/sudoers
Cmnd_Alias USERCOMMANDS = /sbin/shutdown, /sbin/reboot
user ALL=PASSWD: ALL, NOPASSWD: USERCOMMANDS
```

１行目の`Cmnd_Alias`は、複数のコマンド（`/sbin/shutdown`と`/sbin/reboot`）に別名（`USERCOMMANDS`）を付けるだけですから、必須ではありません。

肝心なのは２行目。

`PASSWD: ALL`で、全てのコマンドの実行にはパスワードを要求します。
`NOPASSWD: USERCOMMANDS`で、`USERCOMMANDS`（`/sbin/shutdown`と`/sbin/reboot`）だけはパスワードなしで実行できます！

## 参考
[Man page of SUDOERS](http://linuxjm.osdn.jp/html/sudo/man5/sudoers.5.html "JMプロジェクト")
マイコンにおけるDCモーター制御について

#モータの種類と制御方法
##DCモーター
マブチの130モーターなどです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/47179168-ab6b-61b9-97c9-54ab75283111.png)
(画像https://www.mabuchi-motor.co.jp/motorize/branch/motor/)
制御方法はモーターの電流を正方向＋に流すと正方向に回転、逆方向－に流すと逆方向に回転します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/8c6bef1a-c19f-69c7-7303-eeec65d08546.png)
図.DCモーター接続イメージ


##ステッピングモーター
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/e341869b-e0e3-0de5-055d-6a7eb1053ffd.png)
(画像秋月電子:http://akizukidenshi.com/catalog/g/gP-06578/)
励磁のパターンで、モーターのステップ数を制御します。
この辺りは今回は扱いませんが、WIKIペディアより画像を添付します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/a059702a-2af2-56fd-0b21-812e17b506d8.png)
(画像ウィキペディア:https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC)
励磁の順を変更して行くことでモーターが回転します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/ed5dc041-3d35-af48-1e97-ce44aa66aff6.png)
図.ステッピングモーター接続イメージ


##サーボモーター
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/ed636d6d-eb0d-e0ad-0abf-b91a790d3111.png)
(画像秋月電子:http://akizukidenshi.com/catalog/g/gM-08761/)
制御線は電源/GND/制御信号の3本が必要になり、複数接続する場合は、サーボモーター毎に制御信号が1本必要になります。
大体20MS間のうちに制御信号のHIGH時間を500US～2500US 程度HIGHに制御することで右から左へ方向が変更されます。
通常真ん中 1500us程度な模様です。実際のサーボにあわせて制御します。
Arduinoですと角度を設定する事でパルス幅が自動的に変わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/bab39311-d211-8625-7067-4ff0e66f7041.png)
図.サーボモーター接続イメージ


##シリアルサーボモーター
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/24bb259b-0e89-f2e3-3cd9-321a3318538b.png)
シリアルサーボはuart(232c出力の5vや3.3v版）を用いて、uartによってコマンドを送信を行い制御します。
コマンドラインは1つで複数のモーターを接続する事ができます。なので電源/GND/制御線（コマンドライン）を並列化して何台もつなげることが可能です。制御方法は1番モーターは、120度へ、 2番モーターは90度へ等をuartのコマンドによって送信します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/e7d3f330-2e1b-a3ea-6cf5-d3d32126237f.png)
図.シリアルサーボモーター接続イメージ


#マイコンでDCモーター制御
マイコンでモーターを制御する場合に、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/8c6bef1a-c19f-69c7-7303-eeec65d08546.png)
図の接続で、
+側にHI 電圧を掛け、-側の電圧をLOWとすることで正回転
+側にLOW電圧を掛け、-側の電圧をHIGHすることで逆回転となることは1で記述しましたが、
実際にはもっと奥が深いのです。
たとえば、秋月電子さんで販売している。TA7291Pのマニアルを読むと制御信号と出力の関係は以下の様になっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31412/ad135b45-7ab4-0c47-3c97-d99f75082d23.png)
1.ストップとは電圧の掛かっていない状態です。すなわち熱も発生しませんし、外力でモーターを回すことも可能です。
2.CW(CLOCKWISE)時計方向=正方向となります。
3.CCW(COUNTER CLOCKWIS)Eは半時計方向=逆方向となります。
4.ブレーキとはブレーキです。これは一体何？？？って思われる方が多いと思います。本当にブレーキです止める為のモードです。
この機能をうまく使わないと、慣性の法則をモロにくらってロボットもまともに動きません。
この状態にしておくと、外力でモーターを回すことは難しい状態になります。
ただし、その分、熱が発生しますので、注意も必要です。**

#DCモータースピード制御
モーターの回転制御を説明しましたが、スピードはどのように調整するのでしょうか？
それは以下の様に時間で区切ってCWやCCWになる時間を多くしたり、少なくしたりする事で制御します。
たとえば、CWを例とすると、
1.CWの状態を10MS間行う。
2.ブレーキもしくはストップの状態10MS間行う
上記の1.(CW)/2.(ブレーキもしくはストップ)を連続的にくり返す

これによって、モーターに掛かる電圧の総量は通常時の半分となりるので、モーターの電圧を半分に落とした状態と同じ事になります。
よって、回転速度が遅くなります。
（ブレーキとストップで、スピードも変わりますので、実際には動作させて確認してください。）

今回はDCモーターの制御方法について解説しましたが、次回機会がありましたら、他の制御方法についても寄稿できればと思います。
[javascript]npmでマイクロライブラリを使えるようになるまで

新しい開発の度にやっては忘れの繰り返しなので、自分用のメモも兼ねて。

# インストール
node.jsをインストールするとnpmもついてきます
redhat系ではデフォルトのリポジトリには無いようなので、EPELを追加してからインストールします

```
sudo yum install epel-release
sudo yum install nodejs
```

ついでにバージョン管理ツールのnをインストール

```
sudo npm install n
```

# 使い方
まずはnpmを使いたいプロジェクトのディレクトリで以下のコマンドを実行
いろいろと聞かれますが、個人用の開発ならとりあえずenter押し続ければいいと思います

```
npm init
```

package.jsonファイルが生成されます
-gオプションを付けずにパッケージをインストールするとこのファイルにどんどん情報が書き込まれていきます。
他にはnpm startとかnpm testの実行内容なんかを書いたりします

以下、簡単な使い方の例として
適当なパッケージを使ってみるとこまでやってみます

## browserifyのインストール
browserifyはパッケージの依存関係を解決してくれる便利なツールです。
仕組みとしてはあるパッケージのソースと、それを使うのに必要なパッケージのソースを一つのファイルに纏めてくれるというものですが、ちょっと気になる副作用もあるので注意
（複数パッケージで同じ名前だけどバージョンの違うパッケージに依存している場合、そのぶんソースが長くなるらしいです）

```
npm install browserify
```
## moment.jsのインストール
今回はmoment.jsというライブラリを使ってみます

```
npm install moment
```

browserifyをインストールしたので、requireでライブラリを読み込むことができます

```javascript:sample.js
var moment = require("moment");
// 東京オリンピックまで何日か
var toDate   = moment('2020-07-24');
console.log(toDate.diff(moment(), 'days'));
```

browserifyを使ってファイルを結合

```
browserify sample.js -o bundle.js
```

bundle.jsの部分は何でも構いません
生成されたbundle.jsを実行すると、東京オリンピックまでの日数が表示されます
プロジェクト作成時に依存関係を復元(dotnet restore)させる

# tl;dr
`template.json`に`postActions`と`primaryOutputs`の項目を追加することで、カスタムテンプレートが`dotnet restore`を自動実行するよう設定できる。

# 環境
```
$ dotnet --version
2.1.402
$ nuget help
NuGet Version: 4.8.1.5435
```

# 背景
[dotnet-template-samples/16-nuget-package](https://github.com/dotnet/dotnet-template-samples/tree/master/16-nuget-package)をそのまま`nuget pack`, `dotnet new -i`, `dotnet new garciaconsole`して使ってみると、VSCodeでは次の内容のポップアップダイアログが立ち上がります。またコードには赤線が引かれ、IntelliSenseも効かない状態なってしまいます。

```
There are unresolved dependencies'. Please execute the restore command to continue.
```
ここで`Restore`ボタンを押すか、`dotnet restore`を実行すると適切なファイルが生成され、正常な状態に戻ります。

（[暗黙的dotnet restore](https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-restore?tabs=netcore2x#implicit-dotnet-restore)なるものがあるらしいけど、これがうまく働かない理由は未調査）

# Restoreの自動実行
既存の`console`テンプレートの出力を見ると、確かに`dotnet restore`が実行されているようです。そこで`dotnet restore`を自動実行させるため、今度は[dotnet-template-samples/08-restore-on-create](https://github.com/dotnet/dotnet-template-samples/tree/master/08-restore-on-create)を参考にして以下の内容を`template.json`に追加してみます。

```json
"postActions": [
    {
        "manualInstructions": [
            {
                "text": "Run 'dotnet restore'"
            }
        ],
        "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
        "continueOnError": true
    }
]
```
しかし、このテンプレートを使ってもやはり`restore`が上手くいきません。次のようなメッセージが表示されるでしょう。

```
作成後のアクションを処理しています...
復元するプライマリ出力がありません。
```

# csprojの指定
実は`restore`するためには*projファイルを指定してやる必要があります。そこで次の内容を`template.json`に追加します。

```json
"primaryOutputs": [
    {
       "path": "content.csproj"
    }
]
```

これにより`dotnet restore`が正しく実行されるようになります。

# 参考リンク
[dotnet new のカスタム テンプレート | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/core/tools/custom-templates)
[Post Action Registry · dotnet/templating Wiki](https://github.com/dotnet/templating/wiki/Post-Action-Registry)
[Restore fails with "No Primary Outputs to restore" · Issue #1324 · dotnet/templating](https://github.com/dotnet/templating/issues/1324)