OmniAICreator/Qiita-1.07M huggingface dataset:
RubyでGoogleDriveAPIを使用してGoogleドライブにファイルをアップロードする

- 特定のGoogleドライブにファイルアップロードするのでoauthとかではなくサービスアカウントを作成

## Google Cloud Platform
- https://console.cloud.google.com
- プロジェクトを作成する
- 作成したプロジェクトでDriveAPIを有効に設定する
- 認証情報を作成、サービスアカウントを作成してjsonをダウンロードする

## DriveAPIを使用して一覧取得、アップロード

- .envにjsonの内容を記述
- jpegをアップロード
- アップロードに関して注意する点はアップしたファイルに対して権限を付与しないと閲覧できないこと
- グーグルドライブを使用するときのアカウントemailで権限付与すれば閲覧できる

```env:.env
GOOGLE_ACCOUNT_TYPE=service_account
GOOGLE_CLIENT_ID=12345678901234567890
GOOGLE_CLIENT_EMAIL=project-example@xxxx-xxxxx-12345.iam.gserviceaccount.com
GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n 省略 \n-----END PRIVATE KEY-----\n"
```

```ruby:files_controller
require 'googleauth'
require 'google/apis/drive_v3'

class FilesController < ApplicationController
  before_action :auth_drive

  Drive = ::Google::Apis::DriveV3

  def index

    @result = @drive_service.list_files(page_size: 20,
                               fields: 'files(name,modified_time,web_view_link),next_page_token')
  end

  def create

    uploaded_file = file_upload_param[:file]
    output_path = uploaded_file.original_filename

    File.open(output_path, 'w+b') do |fp|
      fp.write  uploaded_file.read
    end

    file_metadata = {
        name: uploaded_file.original_filename
    }
    file = @drive_service.create_file(file_metadata,
                                     fields: 'id',
                                     upload_source: output_path,
                                     content_type: 'image/jpeg')
    
    create_permission(file.id, 'yoshida@example.com')

    FileUtils.rm output_path

    redirect_to action: 'index'

  end

  private

  def auth_drive
    @drive_service = Drive::DriveService.new

    auth = ::Google::Auth::ServiceAccountCredentials
               .make_creds(scope: 'https://www.googleapis.com/auth/drive')
    @drive_service.authorization = auth

  end

  def create_permission(file_id, email)

    user_permission = {
        type: 'user',
        role: 'writer',
        email_address: email
    }
    @drive_service.create_permission(file_id,
                                     user_permission,
                                     fields: 'id')
  end
  
  def file_upload_param
    params.require(:fileupload).permit(:file)
  end
end
```
https://github.com/niiyz/ruby-on-rails-on-google-drive-api-sample

参考:
https://developers.google.com/drive/
https://github.com/googleapis/google-auth-library-ruby
https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/DriveV3
PostgreSQL: スキーマを一覧表示するコマンドは `\dn`

PostgreSQLでスキーマを一覧表示するコマンドを紹介する。

psqlコマンドで対話ターミナルを開く:

```
psql
```

対話ターミナル上で下記メタコマンドを実行すると、スキーマ一覧が表示される:

```
\dn
```

実行例

```
root=# \dn
List of schemas
  Name  | Owner
--------+-------
 posts  | root
 public | root
(2 rows)
```

## 覚え方

<strong>d</strong>atabase <strong>n</strong>amespaces (データベースの中の名前空間たち)

## 関連

* [PostgreSQL: 現在のスキーマを切り替えるクエリには `select current_schema();` - Qiita](https://qiita.com/suin/items/d700e5c375d66288c3b8)
GolangのMongoDriverでreflectを使ってデータを取得する方法



```golang
package main

import (
	"context"
	"fmt"
	"log"
	"reflect"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/mongo/readpref"
)

type Foo struct {
	ID   *primitive.ObjectID `json:"_id" bson:"_id,omitempty"`
	Name string              `json:"name" bson:"name"`
}

func main() {
	ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
	client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
	ctx, _ = context.WithTimeout(context.Background(), 2*time.Second)
	if err = client.Ping(ctx, readpref.Primary()); err != nil {
		log.Fatalf("%+v\n", err)
	}
	collection := client.Database("testing").Collection("foo")

	// ここまでサンプルどおり ---------------------------------

	fooType := reflect.TypeOf(Foo{})
	fooSlice := createSlice(reflect.SliceOf(fooType))

	// この行がメイン
	d := find(collection, fooSlice, fooType).([]Foo)
	fmt.Println(d)
}

// 黒魔術感ある
// 単純にMakeSliceだけだと到達可能なアドレスを返せないので、makedSlice.CanSet() == false
// なので、新しくreflect.valueをNewして、作ったmakedSliceをセットする形を取っている。
func createSlice(sliceType reflect.Type) reflect.Value {
	makedSlice := reflect.MakeSlice(sliceType, 0, 16)
	reflectionValue := reflect.New(makedSlice.Type())
	reflectionValue.Elem().Set(makedSlice)
	slicePtr := reflect.ValueOf(reflectionValue.Interface())
	return slicePtr.Elem()
}

func find(col *mongo.Collection, reflectSlice reflect.Value, reflectType reflect.Type) interface{} {
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer cancel()
	cur, err := col.Find(ctx, bson.M{})
	if err != nil {
		log.Fatalf("%+v\n", err)
	}
	defer cur.Close(ctx)
	for cur.Next(ctx) {
		v := reflect.New(reflectType)
		if err := cur.Decode(v.Interface()); err != nil {
			log.Fatalf("%+v\n", err)
		}
		reflectSlice.Set(reflect.Append(reflectSlice, v.Elem()))
	}
	if err := cur.Err(); err != nil {
		log.Fatalf("%+v\n", err)
	}
	return reflectSlice.Interface()
}
```

Mongoとかデータの準備とか必要ですが、Golang1.12以上なら、コピペで動くと思います。

それにしても、Golangのリフレクションは、わかりづらい。使いづらい。

Genericsの導入計画があるらしいので、それが実現すればこんなコード書かずに済むんだろうなぁとか、思ったりしています。

パフォーマンスですが、1万件のデータのfindで試したところ、

- 型指定：55ms
- リフレクション：58ms

3msぐらいしか違いが無かったので使っても良いのではないでしょうか？

あと、createSlice関数の中身ですが、なぜあれをやらないと動かないのか？が、いまいち理解できていません。。。

※ 2019-06-17追記　黒魔術コードについての理解を深める記事を書きました。
https://qiita.com/daijinload/items/f822e4a208d17e432599
【個人メモ】Visual Studio Codeのスニペット設定

## はじめに
会社のコーディング規約でソースコードの先頭には必ず下記のような記述をすることになっている。

```
//***************************************************************************
//
//  PG Name      :  Hoge.js
//
//  Description  :  HogeHoge
//
//  Created By   :  Qiita 太郎(id)
//
//  Created Date : YYYY/MM/DD
//
//  Updated Date : YYYY/MM/DD  -00.00    Qiita 太郎(id)
//
//***************************************************************************
//---------------------------------------------------------------------------
//  Rev.No  |  追加・修正内容
//---------------------------------------------------------------------------
//     -00  |  01. 新規作成
//---------------------------------------------------------------------------
```

これをいちいち記述するのが意外と面倒。そもそもバージョン管理してるからコードに改訂歴とか書く必要あるのかと疑問ではあるが、ルールとして定まっている以上は従うしかない。

## VSCodeのスニペット設定
最近は主にVSCodeでコーディングしてるので、スニペット設定で定義させておくことにした。
手順は以下の通り

- 【ファイル】-> 【基本設定】 -> 【ユーザースニペット】
- グローバルもしくは任意の拡張子のスニペット定義を開く

以下のように定義

```xxxx.json
{
	// プログラム記述時のヘッダ
	"pgh" : {
		"prefix": "pgh",
		"body": [
			"//***************************************************************************",
			"//",
			"//  PG Name      :  $1xxxxxxxxx",
			"//",
			"//  Description  :  XXXXXXXXXXX",
			"//",
			"//  Created By   : 【自分の名前】(ID)",
			"//",
			"//  Created Date : YYYY/MM/DD",
			"//",
			"//  Updated Date : YYYY/MM/DD  -00.00    【自分の名前】(ID)",
			"//",
			"//***************************************************************************",
			"//---------------------------------------------------------------------------",
			"//  Rev.No  |  追加・修正内容",
			"//---------------------------------------------------------------------------",
			"//     -00  |  01. 新規作成",
			"//---------------------------------------------------------------------------",
		],
		"description": ""
	}
}
```

これでよし。
あとは任意のソースの先頭でprefix(ここでは"pgh")と打って[Tab]を押下するだけ。

VScodeの機能を十全に使えるようになる日は来るのだろうか。先は長い...
PostgreSQL: データベースを切り替えるコマンドは `\c`

PostgreSQLでデータベースを切り替える(接続する)コマンドを紹介する。MySQLの`USE database`相当。

psqlコマンドで対話ターミナルを開く:

```
psql
```

対話ターミナル上で下記メタコマンドを実行すると、データベースが切り替わる:

```
\c データベース名
```

`\c`の代わりに`\connect`でも良い:

```
\connect データベース名
```

実行例

```
root=# \c movies
You are now connected to database "movies" as user "root".

root=# \connect music
You are now connected to database "music" as user "root".
```

## 覚え方

<strong>c</strong>onnect (接続する)

## 関連

* [PostgreSQL: データベースを一覧表示するコマンドは `\l` - Qiita](https://qiita.com/suin/items/1237c04c0d4df99cbc7a)
* [PostgreSQL: スキーマを一覧表示するコマンドは `\dn` - Qiita](https://qiita.com/suin/items/5ba2428c1cf4a67042af)
* [PostgreSQL: テーブルを一覧表示するコマンドは `\d` - Qiita](https://qiita.com/suin/items/80d98d14e91ba9a4b655)
akka-httpでファイルアップロード時にBOMを取り除く

akka-httpでtxtファイルをアップロードをする際、UTF8 with BOMなファイルがアップロードされた時にBOMを取り除いて文字列を復元したい。
ざっと探した感じうまく見つからず。

ただ、alpakkaにCSVを処理する[ライブラリ](https://doc.akka.io/docs/alpakka/current/data-transformations/csv.html
)があって、そこに

> The parser accepts Byte Order Mark (BOM) for UTF-8

とあるのでこのライブラリのコードを読めば出来そう。
で、参考にやってみて無事出来ました。
akka-httpというより実質、akka-stream。

```scala
val ByteOrderMark = ByteString.apply(0xEF.toByte, 0xBB.toByte, 0xBF.toByte)

def route =
  extractRequestContext { ctx =>
    implicit val materializer = ctx.materializer

    fileUpload("file") {
      case (metadata, byteSource) =>
        var firstLine = true
        val linesF: Future[Seq[String]] =
          byteSource
            .via(Framing.delimiter(ByteString("\n"), 1024), allowTruncation = true)
            .map { bs =>
              val bs2 = if (firstLine && bs.startsWith(ByteOrderMark)) bs.drop(3) else bs
              if (firstLine) firstLine = false
              bs2.decodeString("UTF-8")
            }
            .runFold(Seq.empty[String]) { case (acc, elem) => acc :+ elem }
        
        ....略...
```
PostgreSQL: テーブルを一覧表示するコマンドは `\d`

PostgreSQLでテーブルを一覧表示するコマンドを紹介する。MySQLの`SHOW TABLES`相当。

psqlコマンドで対話ターミナルを開く:

```
psql
```

対話ターミナル上で下記メタコマンドを実行すると、テーブル一覧が表示される:

```
\d
```

実行例

```
root=# \d
           List of relations
 Schema |     Name     | Type  | Owner
--------+--------------+-------+-------
 public | distributors | table | root
 public | films        | table | root
(2 rows)
```
SourceTreeのブックマークを置換する


作業ディレクトリをガツっと変更したのでSourceTreeのブックマークを一括置換しました。

# ブックマークの場所

~/Library/Application Support/SourceTree/browser.plist

にあります。

# 編集方法

そのままだとエディタで編集できないのでまずはxml形式に変換

```
$ cd ~/Library/Application Support/SourceTree/browser.plist
$ plutil -convert xml1 browser.plist
```

あとはお好みのエディタでbrowser.plistで開いて編集するだけ。
PostgreSQL: データベースを一覧表示するコマンドは `\l`

PostgreSQLでデータベースを一覧表示するコマンドを紹介する。MySQLの`SHOW DATABASES`相当。

psqlコマンドで対話ターミナルを開く:

```
psql
```

対話ターミナル上で下記メタコマンドを実行すると、データベース一覧が表示される:

```
\l
```

実行例

```
root=# \l
                             List of databases
   Name    | Owner | Encoding |  Collate   |   Ctype    | Access privileges
-----------+-------+----------+------------+------------+-------------------
 postgres  | root  | UTF8     | en_US.utf8 | en_US.utf8 |
 root      | root  | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | root  | UTF8     | en_US.utf8 | en_US.utf8 | =c/root          +
           |       |          |            |            | root=CTc/root
 template1 | root  | UTF8     | en_US.utf8 | en_US.utf8 | =c/root          +
           |       |          |            |            | root=CTc/root
(4 rows)
```

## 覚え方

<strong>l</strong>ist (一覧)

## 関連

* [PostgreSQL: データベースを切り替えるコマンドは `\c` - Qiita](https://qiita.com/suin/items/fa5dc5fb1bc351a1153e)
Unityでプロジェクトファイルを綺麗にしたいときに消していいファイル


# 残しておかなければいけないファイル

- Assets
- Liblrary
- ProjectSetting

## 他のファイルは？

基本的には消去しても大丈夫なはず

## あとがき

他に消してはいけないファイル、消してもいいファイルがある場合は教えていただけると嬉しいです。
エクセルでJAVAアプリを超簡単生成！「ワンダーロボ」権限設計の手順

「ワンダーロボ」はExcel設計書を自ら分析しAIを利用！
自然言語で記述された業務ニーズをソースコードに転換！


##権限設計

アプリ（ユーザー利用）のメニューの各画面に、細かくアクセス権限を設定できます。


###ステップ1.　権限設計書のテンプレートを利用
###ステップ2.　設定の内容を入力
###ステップ3.　ワンダーロボに取り込む

##ステップ1.　権限設計書のテンプレートを利用
####権限設計書のテンプレートで赤枠内に設定内容を入力。
利用グループのメニューにアクセス権限を配置します。



図1![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/2eb65510-9560-8415-306f-ffcd9b64b44d.png)

###ステップ2.　設定の内容を入力

**メニュー**： メニューの一覧に表示される見出しです。
　・機能別の画面で構成し、機能別にメニュー枠を設け別途各画面設計シートに配置するメニューを設定。
　・メニュー表示に、空欄可。空欄の場合表示権限に設定されます。
　・メニュー表示に、表示／非表示を設定します。


**利用グループ**：   複数のグループを指定可能。
**アクセス権限**：   画面単位の権限指定（表示、新規、更新、削除）

入力のキーワード↓
**・権限が欲しい**：　あり、有り、有
**・権限はいらない**：　なし、無し、無
（空欄でもOK　権限なしに設定します。）

#####権限設計書をインポートすると、メニューを新規作成するのと同時にメニューの権限が設定されます。


-図1の右側↓-
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/95f1441d-8e52-0a11-9d0c-23aab64a27c9.png)


**初期表示画面**：グループのユーザーがログインし、初期表示される画面を設定。
**ヘッダー表示**：グループのユーザーがログインし、ヘッダー欄の表示をさせるか設定します。
　　　　　　　　(ヘッダー表示を非表示に設定すると、メニュー表示も非表示の設定になります。)
**メニュー表示**：グループのユーザーがログインした時に、メニュー欄を表示させる設定をします。


##ステップ3.　ワンダーロボに取り込む
SaaSForceの開発環境にログインし、設計書ファイルをインポートします。
###ワンダーロボの取り込み先はこちら↓
 手順は　**SaaSForceシステム**===>**「システム」**===> **「開発設定」**===> **「システム自動構築」**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/57590a2d-30f2-e094-b414-43a672711b69.png)

####開発画面表示例↓
SaaSForceシステム===>「セキュリティ」===> 「フォルダ/コンテンツ設定」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/ba5106d4-d0ac-fd65-edbf-b504e21f2956.png)
↑フォルダを選択するとフォルダ全体の権限を更新できます。
また、それぞれの画面単位にも権限設定ができます。

####ユーザー利用画面表示例↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/e6822148-dda6-81d5-1c14-9adaac79b499.png)
エクセルでJAVAアプリを超簡単生成！「ワンダーロボ」スタイル設計の手順

「ワンダーロボ」はExcel設計書を自ら分析しAIを利用！
自然言語で記述された業務ニーズをソースコードに転換！

##スタイル設計の設定

CSS定義により文字や背景の色を変えたり、カラフルな線を引いたり、余白を調整したり文字幅の調整や背景色、ボタンの色などと見栄えをきれいにすることができます。

###ステップ1.　スタイル設計書テンプレートを利用
###ステップ2.　CSS定義を書く
###ステップ3.　ワンダーロボに取り込む







##ステップ1.　スタイル設計書テンプレートを利用　入力例　↓
####・スタイル設計書テンプレートを利用して赤枠内へ入力します。
スタイル内容　CSS定義（スタイル一括設定）を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/c4cc403a-4e3a-ac29-c825-efba0a3ff323.png)



##ステップ2.　CSS定義を書く
**スタイルID**：スタイルのID、画面項目を設定するときに使用する値
**スタイル名**：1.スタイル名、スタイル内容のコメントと同じ
　　　　　　    2. SaaSForceシステム===>「ツール」===> 「CSS定義」に表示されます。
**スタイル内容**：1. CSSスタイル。セミコロンと改行で１つのスタイルに区切りを入れます。
　　　　　　　2. /* * /の中でコメントすることができます。            　　　　　　
**スタイル一括設定**： 1．画面項目表示種類指定。
　　　　　　　　　  2．画面項目指定。（指定方法：「ボタン:保存」）
　　　　　　　　　 3．指定された画面項目表示種類と画面項目のスタイルを一括設定できます。　
画面項目表示種類とは、、、？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/d510b26e-fe36-a875-9ce6-0cae6324cfbe.png)


##ステップ3.　ワンダーロボに取り込む
SaaSFroceの開発環境にログインし、設計書ファイルをインポートします。
###ワンダーロボの取り込み先はこちら↓
 手順は　**SaaSForceシステム**===>**「システム」**===> **「開発設定」**===> **「システム自動構築」**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/b5df5670-4b37-4fee-e91c-ba295891244c.png)

開発画面表示例↓　
SaaSForceシステム===>「ツール」===> 「CSS定義」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/7f5d8e65-f7ee-4fda-c07f-fad4c5cc5b46.png)



↓こちらは「ワンダーロボ」を使って構築された**アプリ**の例です。
こんな感じでExcelに入力するだけで、画面設計で定義されたスタイルを使って、スタイルが出来上がります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/fefb1064-211b-a211-fe43-59da43faf8f2.png)
画面設計で画面項目スタイルの設定方法は、こちらです。↓

　[・「ワンダーロボ」入力チェック、入力不可、スタイル、表示形式の設定方法](https://qiita.com/nekoatama/items/0f0baf5af882bacd6c5a)
エクセルでJAVAアプリを超簡単生成！「ワンダーロボ」システム設計の手順

「ワンダーロボ」はExcel設計書を自ら分析しAIを利用！
自然言語で記述された業務ニーズをソースコードに転換！


##システム設計

システム全体の管理が１枚のExcelシートでOK！
一般、セキュリティ（ログイン情報）などなど


###ステップ1.　システム設計書のテンプレートを利用
###ステップ2.　｢設定内容」を入力
###ステップ3.　ワンダーロボに取り込む




##ステップ1.　システム設計書のテンプレートを利用

・システム設計書テンプレートを利用して、赤枠内の各項目それぞれに「設定内容」を入力します。
####入力例↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/f31b7c4c-733a-f5b3-cae1-a5fa90bf7f23.png)

##ステップ2.　「設定内容」を入力



####　-一般の入力-
・**システム名**：システムの名称。
・**初期表示画面**：システムに、初期表示される画面を設定します。インポートした設計書内の画面名。
・**SaaSForceメニュー表示**：表示/非表示。ユーザーがログインしてから表示するメニュー欄。
・**画面中央揃え**：中央/左側
・**検索結果件数**：検索画面にて検索結果の１ページの表示件数を設定します。



#####開発画面表示例↓　
SaaSForceシステム===>「システム」===> 「システム設定」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/5463d523-5b68-4430-6d33-b929d6d641a1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/e18aac45-8b76-1b3c-1989-d3a97271f76d.png)


####-セキュリティの入力-
・**パスワードの有効期間（日）**： 数字入力、999以下の数字可、0は有効期間制限なし。
・**ログイン時の失敗制限回数**：　0は制限なし。
・**複雑さレベル**： （英数字、記号）    　　　
　　① パスワードの強度要求なしに、任意に設定。
　　② パスワード設定時最低1文字以上の、アルファベット大文字(A~Z)、小文字(a~z)、数字(0~９)を入力。
　　③パスワード設定時最低1文字以上の「_-|@.,?/!~#$%^&*(){}[]+=」特殊記号を入力。



#####開発画面表示例↓　　　
SaaSForceシステム===>「システム」===> 「システム設定」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/c633da89-9c56-fc7d-87ae-de9ef580376a.png)



####-ログインの情報の入力-
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/bc69c75d-9305-1086-7099-1f6217cff8e2.png)


**・ログイン情報設定テーブル**：システム設計書のインポートと同時に作成される新テーブル名。
　　　　　　　　　　　　　 テーブルに必要な既存フィールド名：ログインID
　　　　　　　　　　　　　
**・ログイン情報設定画面**：  既存画面またはシステム設計書の画面名称。
※上記画面のログイン者情報：ログインID、社員名、退職フラグ、パスワード、部門、（社員名を姓名に、退職フラグを有効区分/有効フラグに、部門を部門名/グループ名/役割に変更できます。「ログインID、社員名、退職フラグ、パスワード、部門」空白不可）

**・ログイン者情報保存処理**：  既存ボタン名称または新規作成したボタン名称。

**・グループ情報設定テーブル**：ユーザーの権限設定。
①   フィールド「役割」を含めるテーブル「役割」を新規作成します。（役割をグループID/部門IDに変更可）
②   メニュー「初期マスタ」の管理画面「役割」でデータを新規作成します。
　　　　　　　　　　※SaaSForceで権限グループID/グループ名と対応させ権限設定します。

####-ログインユーザー情報の入力-
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/df5f9047-931e-71d0-db46-f876beec3dcb.png)

**・ログインID**：　一般ユーザーのログインIDとして定義します。
　　　　　　　　※設定すると、ログインIDでシステムのユーザー画面にログインできます。
**・ログイン名**：　一般ユーザーのログイン名として定義します。
**・パスワード**：　ログイン時のパスワードとして定義します。設計書で任意に設定できます。
　　　　　　　　※設定しても、システムにログイン後、パスワードの変更が必要です。
　　　　　　　　※パスワードを変更する際｢複雑さレベル(数字)｣の設定にてパスワードを定義する必要があます。
**・グループ名**：　該当ユーザーに所属するグループ名を設定します。


##ステップ3.　ワンダーロボに取り込む
SaaSForceの開発環境にログインし、設計書ファイルをインポートします。
###ワンダーロボの取り込み先はこちら↓
 手順は　**SaaSForceシステム**===>**「システム」**===> **「開発設定」**===> **「システム自動構築」**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/0d037db8-9b97-b01e-db1d-80fea186900d.png)
Rails Docker公式の導入メモ

# 概要
DockerでのRails環境構築時に公式サイトを参考にしたけど、うまくいかなかったので修正部分を記述しときます。  
Docker公式のRails環境構築URL
`https://docs.docker.com/compose/rails`

# 環境
mac os high sierra

# 修正部分1
```
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
```  
`docker-compose.yml`に上記を追加  

```docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - '5433:5432'
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```
#修正部分2
`config/database.yml`をUTF-8に変換が必要?
自分の環境でCotEditorで開くと文字化けしていてUTF-16だったので・・・とりあえずUTF-8にしてから設定を書き込みました。  

```config/database.yml
default: &default
  adapter: postgresql
  encoding: utf8
  host: db
  username: postgres
  password: postgres
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test
```
Dep から Go Module への移行手順

## Go Moduleとは？

- Go独自のプロジェクトの依存パッケージに対するバージョン管理ツール。
- Venderがいらねぇ！！


## 移行手順

### 1. Go Module を適用させる

### 2. Dep関連を削除する



## Go Module を適用させる

- go mod 利用するときに必要な環境変数

 ```shell
  export GO111MODULE=on
  ```

- go.mod 作成

 ```shell
  go mod init
  ```

- build

 ```shell
  go build hogehoge
  ```

  - 実行すると、```go.sum```が作られる。



## Dep関連を削除する

  ```shell
  rm Gopkg.toml Gopkg.lock
  rm -fr vendor/
  ```
以上です。
delveでgoのデバッグする時知って得したこと

ちょっとしたことですが、知らなかったので備忘録的にメモ。

## main.goを引数を渡しつつデバッグしたい場合

以下のように引数を渡せる

```bash
% dlv debug -- [引数]
```

### 例

```bash
% dlv debug -- import ecl --resources=computeServer,computeKeypair,networkNetwork,networkSubnet --connect=true --regions=jp4
```

これは通常実行時の以下と等価。

```bash
% go run main.go import ecl --resources=computeServer,computeKeypair,networkNetwork,networkSubnet --connect=true --regions=jp4
```

## pythonでいうところの、pdb.set_trace()みたいなことをgoでやりたい場合

1. コード内にて `import "runtime"` しておく
2. `runtime.Breakpoint()` をブレークしたい場所に書いておく
3. `dlv debug` して `continue` すると、そこで止まる

### 例

```go
 dlv debug -- import ecl --resources=computeServer,computeKeypair,networkNetwork,networkSubnet --connect=true --regions=jp4
% dlv debug -- import ecl --resources=computeServer,computeKeypair,networkNetwork,networkSubnet --connect=true --regions=jp4
Type 'help' for list of commands.
=>no source available
(dlv) c

(略)

> github.com/GoogleCloudPlatform/terraformer/terraform_utils.ConnectServices() ./terraform_utils/connect.go:43 (PC: 0x25252b3)
    38:								if ccc.InstanceState.Attributes[key] == tfResource.InstanceState.Attributes[v[0]] {
    39:									importResources[resource][i].InstanceState.Attributes[v[0]] = linkValue
    40:									importResources[resource][i].Item[v[0]] = linkValue
    41:								} else {
    42:									runtime.Breakpoint()
=>  43:									for keyAttributes, j := range tfResource.InstanceState.Attributes {
    44:										match, err := regexp.MatchString(v[0]+".\\d+$", keyAttributes)
    45:										if match && err == nil {
    46:											if j == ccc.InstanceState.Attributes[key] {
    47:												importResources[resource][i].InstanceState.Attributes[keyAttributes] = linkValue
    48:												switch ar := tfResource.Item[v[0]].(type)
```

こんな感じで1行下で止まる。

## 長い文字列が、 `...+8 more"` みたいになっちゃうのを全部表示したい

dlvのプロンプトで以下のように `config max-string-len` する。

```bash
(dlv) p info.Id
"ecl_compute_volume_attach_v2.1a1a0158-fb3c-4f23-9a87-57e452443a9...+8 more"
(dlv) config max-string-len 99999
(dlv) p info.Id
"ecl_compute_volume_attach_v2.1a1a0158-fb3c-4f23-9a87-57e452443a97-attach"
```
数日前に発売された「ドンキPC」にlinuxをインストールする

#はじめに…
Atom系タブレット（Windowsタブレット）では、格安のものがありますがうまく動かないこともしばしばです。
今回の**生贄**は、**ドン・キホーテ**で近日に販売された**2in1タブレット「U1」**です。


#インストール手順
取り敢えず、インストール手順を紹介していきます。
お勧めは[**xubuntu**](https://xubuntu.org/) です。
お好みでどうぞ。
腕に覚えある人は、debianでもいいですね。
今回は、lubuntuでは行けませんでしたTT

##メディアをUSBメモリに焼く
メディアをダウンロードしたら、USBメモリに焼きます。
便利なのは、[**rufus**](https://rufus.ie/) です。
この手のタブレットですが、立派にUEFI（ダミーっぽい）が入っていますが、メディアについては**某社日本製**ほどチェックは厳しくないようで、簡単に起動できます。
よって、焼くときに何かのオプションを指定する必要はなく、isoファイルを指定するだけです。
DDモードで焼かないとダメかなと思えばそうでもなくて、ISOモードを利用して一部セクターを読み込めるタイプの焼き方でも正常起動します。
今回はISOモードで焼きました。
理由は以下に示して行きます。

## Bay Trail ? Cherry Trail ?
最近のAtomには上述2つの系列があります。
ちなみに今回の**生贄**は、**Cherry Trail**と箱に明記してありました。

## そして起動しなかった…
おっといきなりの文鎮化（笑）
しかしながら、よくよく様子を見ると、画面に映ってないだけのようです。
放置するとカーネルパニックを起こしているのか完全にフリーズしたりもする様子でした。

## i915が原因でした
そこで、焼きあがったメディアの起動用コンフィグファイルを開いてみます。
ISOモードで焼いておくと、UEFIツールから編集をしなくても編集できます。
/boot/grub/grub.cfgをエディタで開いてください。
linux　の行項目すべての後ろに **i915.modeset=0**の項目を追加します。
これは、インストール後の /boot/grub/grub.cfg にも必要です。
なお、初回起動時は、grubの起動メニュー項目で e を押すと、編集モードが起動します。
同様の行に、**i915.modeset=0**を設定して、その状態でF10キーを押すことで起動できます。

後はメディアをもう一度生贄に差し込んで起動します。

##ディスプレイのデフォルトは縦画面だった件…
ディスプレイの回転方法があるのですが…　回転しませんでした（笑）
[こちら](https://qiita.com/ine1127/items/38346ef517706cbc5a1d)を参考にどうぞ

### 続く ?
つもりでしたがあっさり解決したので、記事を編集して済ませました。
lubuntuが立ち上がらなかったのは残念！！！
openboxでないのも残念。
出オチなのか、オチがありません。
それもそのはず、端末が落ちないんです。
落ちないだけに、オチもないです（笑）
というわけで、我が家にはノンストップサーバーが一つ生まれましたとさ（笑）
Androidアプリ開発で帯域制限をかける

# 必要環境
- Mac mini, Macbook等Mac機器
- Xcode

# 手順
1. MacでNetwork Link Conditionerを使い帯域制限をかける
2. Macのネットワークを共有する

# Network Link Conditionerで帯域制限をかける
1. [Apple Developer](https://developer.apple.com/account/)へサインインします。
2. 左部メニューのDownloadsをクリック。![スクリーンショット 2019-06-14 9.30.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15297/f33f1007-b044-2acd-77b1-d1047e88f5d1.png)
3. 「More」をクリック![スクリーンショット 2019-06-27 8.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15297/492d5eb4-0f44-9aeb-ea1b-f40d3544745c.png)

4. Additional Tools for Xcodeを探しダウンロードし開く。![スクリーンショット 2019-06-13 11.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15297/e37d1b7a-820e-1f60-c897-b13b687276f0.png)
5. Network Link Conditionerをダブルクリックしインストールし「システム環境設定」から開く![スクリーンショット 2019-06-13 11.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15297/9fb550f5-b842-0cb0-c239-c07734eb3dd2.png)
6. お好みの設定をする場合は「ManageProfiles...」から。Profileで3Gを選択すれば3G回線の帯域になる。![スクリーンショット 2019-06-14 9.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15297/7841545e-8823-19df-27f5-d167ee7bd14d.png)
7. 例えばこんな感じ![スクリーンショット 2019-06-14 9.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15297/5a3c0f3c-a7f3-6c4a-bcdd-c267295fa1b0.png)

# Macのネットワークを共有する
1. 「システム環境設定」->「共有」![スクリーンショット 2019-06-14 9.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15297/c81478bf-b0d3-08a3-c3e3-d5472846cbf4.png)
2. アクセスする時のパスワードを決める。
3. ![スクリーンショット 2019-06-14 10.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15297/c4d7f5b8-e5f8-2075-485f-7c0928ac75f8.png)
3. これでコンピュータ名でSSIDが公開される
Flaskでpostされたデータをそのまま受け取る時はrequest.get_data()をつかう

ちょっとはハマったので、情報共有

## 環境

* Flask 1.0.2 
* curl 7.54.0
 
## 結論

FlaskでＰＯＳＴされたデータをそのまま受け取るときは`request.data`ではなく`request.get_data()`を使う

## 理由

* `request.data` : HTTPヘッダのContent-typeがハンドリングできないと値が格納されない。
* `request.get_data()` : Content-typeの値にかかわらず値を取得できる。

## 実験

### request.get_data()を使った場合

request.get_data()をそのまま返すサーバを立てる

```python
from flask import Flask, request
app = Flask(__name__)
@app.route('/',methods=["POST"])
def hoge():
    return request.get_data()
app.run()
```

POSTのBODYに`{"a":1}`を指定してリクエスト

```bash
$ curl -X POST -d '{"a":1}'  http://127.0.0.1:5000/
{"a":1} 
# ↑POSTしたデータが帰ってくる
```

POSTしたデータが帰ってくるため、上手く動いている。

### request.dataを使った場合

request.dataをそのまま返すサーバを立てる

```python
from flask import Flask, request
app = Flask(__name__)
@app.route('/',methods=["POST"])
def hoge():
    return request.data
app.run()
```

POSTのBODYに`{"a":1}`を指定してリクエスト

```bash
$ curl -X POST -d '{"a":1}'  http://127.0.0.1:5000/

# 何も返ってこない
```

POSTしたデータが返ってこない。

理由はcurlのデフォルトのContent-typeが`application/x-www-form-urlencoded`であり、これがFalskがハンドリングできる値ではないため。


なので、curlに明示的に`Content-type: application/json`を指定すれば、

```bash
$ curl -X POST -H "Content-type: application/json"  -d '{"a":1}'  http://127.0.0.1:5000/
{"a":1}
# ↑POSTしたデータが返ってくる
```

マニュアルにも書いてある

https://werkzeug.palletsprojects.com/en/0.15.x/wrappers/#werkzeug.wrappers.BaseRequest.data

> Contains the incoming request data as string in case it came with a mimetype Werkzeug does not handle.
React.js 学習メモ　第2回

最近Reactの勉強を始めたので、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#公式Reactチュートリアルをやってみて
実際にチュートリアルをやってみてReactの基本概念みたいなものは何とな掴むことができたのですが
ここで少し壁にぶつかりました。
アロー関数って何やったっけ？

今までJavaScriptは独学で触った程度だったのと単純に忘れている内容も多かったのですが改めて調べました。

```javascript
//arrow関数
//例：普通に書くとこれ
onClick={function(){alert('click');}}

//アロー関数で書くとこれ
onClick={() => alert('click');}
```

これによりタイプ量を減らすことができます。

onClick={() => alert('click')} と記載したときに
onClickプロパティに渡しているのは関数であることに注意してください。

ProgateがES2015(ES6)に対応していたので改めて復習しようかと考えたのですがググってみたらいい感じのサイトを見つけました。

>ECMAScriptとはES6やES2015のESと言うのはECMAScriptの略であり、ECMAScriptとはEcma Internationalによって定められるJavaScriptの標準規格です。
[ES2015(ES6)とは？【JavaScript】](https://student-engineer.net/es2015/)

#JS 寺子屋シリーズを行う
たまたまググったらJavaScriptおじさんなる人物を発見！

しかも個人的にめちゃくちゃ分かりやすい内容だったのでとりあえずJS寺子屋シリーズを全部しようと思い
早速チャレンジしました！

実際にやってみた感じだとReactを学習するのに役立つ内容をコードを書きながら体系的に理解を深めれたのでこれはやって凄く為になりました。
Jestを使ったテストも一緒に行う事ができたのは個人的に大きかったです。

>JS 寺子屋 は、アロー関数からスタートして、Jest によるテスト、型の判定、map や filter を使った関数型のエッセンスを取り込んだベストプラクティスを順番に習得してもらうための、チュートリアル記事です。現代フロントエンドエンジニアに必須であるものの、体系的な情報が日本語では存在しないために習得しづらかった技術を、手を動かしながら順をおって学習していただけます。
[JS 寺子屋シリーズ](https://uncle-javascript.com/JS%20Terakoya)

#振り返り
JavaScriptおじさんのおかげでES6の必要な内容を学習できたのでこっから改めてReact.jsを使ってToDoアプリなどを作ってReactチュートリアルで行なった内容の理解を深めていきます。
script要素の新常識・安易にdefer/async属性を付けてはいけない

# script要素の位置とasync/defer

`script`要素は`body`の末尾に記述するのが定説ですが、あるサイトについて`script`要素の記述位置や`async`/`defer`が及ぼすパフォーマンスへの影響を実験しました。

* 外部JavaScript 11ファイル・250kb
* 因子1 `head`要素内・`body`要素の末尾を比較
* 因子2 `defer`・`async`・それらの属性なしを比較
* いずれのケースもスクリプトエラーがなく期待通りに動作
* [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/?hl=ja)のモバイルスコアで評価

※ この記事では`script`要素は`src`属性で外部参照することを前提にします。インラインスクリプトではありません。
※ また、1サイトでの結果に過ぎないのでその点も考慮ください。

# 最速はasync付きでhead要素に記述

PageSpeed Insightsのスコアはばらつきが出るので、10回の計測を行い、上下2個は外れ値として除外中央6個の平均(Excelの`TRIMMEAN`関数)を計算した結果がこちらです。

<table>
	<tr>
		<th></th>
		<th>属性なし</th>
		<th>async</th>
		<th>defer</th>
	</tr>
	<tr>
		<td>script要素をhead内に記述</td>
		<td>19 😢</td>
		<td><strong>63</strong> 😁</td>
		<td>36</td>
	</tr>
	<tr>
		<td>script要素をbody末尾に記述</td>
		<td>45</td>
		<td>29</td>
		<td>29</td>
	</tr>
</table>

`async`要素は[ほぼすべてのブラウザが対応済み](https://caniuse.com/#feat=script-async)。今後は**「`head`要素に`async`付きで記述する」**を基準にしていきたいと思います。

```html
<!-- 従来の外部参照script要素の書き方 -->
<body>
  ...省略...
  <script src="/path/to/script.js"></script>
</body>
```

```html
<!-- これからの外部参照script要素の書き方 -->
<head>
  ...省略...
  <script src="/path/to/script.js" async></script>
  ...省略...
</head>
```

# 安易なasync/deferは逆効果になることも

属性なしでページの上部に`script`を記述するのは、出だしからレンダリングをがっちりブロックするのでいちばんの悪手です。これは昔からの常識です。

`body`末尾の`script`要素に`defer`や`async`を追加するとかえってパフォーマンスが悪化しました。これは意外な結果でした。

`body`末尾に記述するということ自体が、レンダリングブロックを避ける擬似的な`defer`なので、[むやみに遅らせてもLong taskの終点をただ先送りするだけ](/miyanaga/items/49aee938d1cbb1e42fd7)なのかなと推測しています。

今回のケースでは`defer`自体、あまりいいところがない結果になりました。

# asyncの利用は計画的に

`async`は強力ですが、むやみに付けるとスクリプトが期待通りに動作しないことがあります。また、読み込み序盤で必要なスクリプトを`async`にするのも逆効果です。

以下の点を注意しながら使っています。うろおぼえなので別の機会にプラクティスをまとめてみたいところです。

* インラインスクリプトには`async`が使えないので注意。`load`イベントにくるむなど実行遅延が必要かも。
* DOMContentLoadedイベントを受け取れない。その後にスクリプトが実行されるので当然ながら。
* jQuery.readyは問題なし。document.readyStateを見て、読み込み後であれば即時実行するから。
* JavaScriptに依存するレイアウトは少なくともファーストビューでは避ける。カルーセルスライダーなどはJavaScriptオフでも表示崩れがないものを使う。
* `async`を付けた要素間の実行順序は入れ替わる可能性があるので依存関係には要注意。ただしChromeでは今のところ実行順序の入れ替わりが確認できないので詳細は要調査。
PostgreSQL : pgcryptoでパスワードとかを暗号化する

#1.概要

PostgreSQLでユーザのパスワードを管理する際に暗号化するための備忘録

#2.内容

まずは以下SQLを対象のDBで実行

```sql:psqlコンソール
CREATE EXTENSION pgcrypto;
```

そして、insert文を実行。
※以下テーブル構成の例


usersテーブル

| id       |       username |    password    |
|:-----------------|:------------------|:------------------|
| serial             |       varchar(100)|        varchar(100)        |

```sql:psqlコンソール
insert into users VALUES(1,'test',crypt('test', gen_salt('md5')),'0');
```

insertに失敗する時は、ALTER TABLEする。

```sql:psqlコンソール
ALTER TABLE users OWNER TO オーナー名;
```
Homebrewでインストールしたパッケージの依存関係をツリー表示

インストールしたパッケージの依存関係をツリー表示する方法です。
必要のないパッケージを削除したいときに便利だと思います。
Formula名の後に`[build]`という注釈のあるパッケージが実際にはインストールされていないことがありますが、これはビルド時のみに必要なパッケージで、Bottle（ビルド済みバイナリパッケージ）を利用した場合にはインストールされません。

```console:コマンド
$ brew deps --1 --include-build --include-optional --include-test --include-requirements --tree --annotate --installed
```

```text:表示例
libyaml
├── autoconf  [build]
├── automake  [build]
└── libtool  [build]

openssl

pkg-config

readline

ruby
├── pkg-config  [build]
├── libyaml 
├── openssl 
└── readline 
```
Wifiとか回線の話「インターネットの速度を上げるためにプロバイダを切り替えた(・∀・)」

今回の内容は、オンラインゲームをやっている時の回線の速度を速くするためにプロバイダを切り替えた際のメモ書きみたいなものです。Qiitaで投稿する内容かどうか迷いましたが、ネット関連の話ではあるため載せることにしました。速度測定の話やLANケーブルの話などです。

#結論 「インターネットの速度を上げたいならプロバイダか回線を切り替えるのが手っ取り早い！！」
本日1番伝えたかったのはこれです！！回線がドコモ光の場合、速度重視ならプロバイダはGMOとくとくBBを選ぶべきです！！最速を求めるなら回線をNURO光にすれば確実に速くなると思われます。

##そもそもなぜプロバイダを切り替えたのか？
僕自身が契約している回線はドコモ光で、2019年5月末までプロバイダはドコモnetと契約していました。プロバイダと契約を結んだのはかれこれ3,4年前の話ですが当時はそもそもプロバイダの意味すらあまり理解していませんでしたので、どこが良いとかも分からずノリで決めたという記憶だけあります。

そして月日が経ち、2019年初めぐらいからFortnite（フォートナイト）というFPSのゲームにハマりました。このゲームはオンライン上の100人の中で生き残りをかけて戦うというゲーム（PUBGや荒野行動に似ています）なのですが、こういったオンラインFPSでは回線の速さが命なんです！！

##まずはインターネットの速度を測定！！
僕がよくネット速度をみるときに使っているのは「googleのスピードテスト」とFast.com （https://fast.com/ja/ ）の2つで確かめています！

前者は画像のように「google スピードテスト」と打てばでてきます！
<img width="1212" alt="スクリーンショット 2019-06-14 0.26.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155553/c9d3a816-4720-0f14-6812-584266a82906.png">

↓検索結果はこんな感じです
<img width="922" alt="スクリーンショット 2019-06-14 0.28.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155553/5f51a9fc-8b17-37cf-c96f-0ce0fbb180d5.png">

↓速度テストを実行すれば結果がみれます！
<img width="466" alt="スクリーンショット 2019-06-14 0.30.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155553/2ba23675-12fc-ba51-bf34-2d8546d40280.png">

↓Fast.comだとこんな感じです
<img width="789" alt="スクリーンショット 2019-06-14 0.35.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155553/7866009a-2011-d8a0-53fc-56bcadb973e3.png">


##ネット速度の話
上記画像は全て回線はドコモ光、プロバイダはGmoとくとくBBです。今となっては回線めちゃめちゃ速いのですが、ちょっと前までは回線弱者でした(；・∀・)
ひどいときは上りも下りも50Mbpsぐらい（もっと下回ることも、、、）のときもあったんです。。ドコモネットの時は、19:00〜24:00の間がとにかく回線が遅くなるためゴールデンタイムの時間にフォートナイトをするとラグが発生して勝負にならないことがとても多かったです。。

ちなみに目安としてですが（僕の体感ですm(_ _)m）、30Mbps（もっと遅くても大丈夫だと思いますｗ）もあればインターネットで調べ物や動画を見る分には充分かと思いますが、FPSといったオンラインゲームをする場合には常に100Mbpsは下らないぐらいが望ましいと思います。150Mbps以上出ればほぼラグもなく快適にプレイできる気がします！！

僕のまわりで回線猛者と呼ばれるような方々は回線をNURO光にしている方がほとんどです（ここが最大速度が1番高い回線です！）。

##有線無線どっちにするか問題
正直、回線速度が速くて安定していれば無線でもラグはほとんど生じないかと思いますが、やはり安定するのは有線です。僕の場合2階にあるルーターから自室のある３階までLANケーブルを伸ばしています。20メートルありますが、LANケーブルの長さでは速度への影響はほぼないです。それよりもLANケーブルのカテゴリーに大きく左右されるので購入する際にはそこに要注意です！！性能を上から順にあげてくと以下になります。
速　「CAT８」
　　「CAT７」
　　「CAT６A」
　　「CAT６」
　　「CAT５e」
遅　「CAT５」

「LANケーブル　カテゴリー　性能」とかで検索すれば詳細出ますが、とりあえずCAT５eより上のカテゴリーのものを使えば問題ないかと思います。僕はCAT6AのLANケーブルを使用しています。価格も性能が良いものや長さが伸びていくと高くなります。


##余談でPingの話
ゲームをやる際には回線の速度をMbpsではなくてPingで表すこともあります。このPingは値が低いほど回線が速いことを意味します。大体Pingが0〜29ぐらいにおさまるとほぼラグはありません。30〜50ぐらいだとまぁ普通に戦えるかなというぐらいで、50より上の数値になるとラグが時々生じるため戦いに支障をきたすかなという感じです。やはり理想はPingが常に30を下回るぐらいかと思います。

##とりあえずオンラインゲームが好きな人は回線やプロバイダにこだわろう！！
オンラインゲーム、特にFPSなど一瞬のラグで勝負が決まってしまうようなものは回線速度が命です。速度上げたいなと思ったらまずはプロバイダを切り替えましょう！僕の場合はドコモ光でプロバイダを切り替える際、電話をして事務手数料3000円を支払うだけで10日ほどで切り替えられました。
プロバイダを切り替えてもダメそうだったら回線を他社に切り替えるのが1番手っ取り早いです。

最後に、フォートナイト本当に面白くて良いゲームなのでみなさんもぜひやってみてください！！
PC、PS４、Switch、携帯の全てのプラットフォームに対応しています！！
![Fortnite_20190413071613.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155553/cbfbb362-eeb9-b578-a55a-983f3adad874.jpeg)
Ruby の `|>` と Elixir の `|>`

# はじめに

Ruby に `|>` が入ったというので、試してみました。 Elixir とは微妙に違うことがわかりました。

試した Ruby のバージョンは以下です。

```shell
$ ruby -v
ruby 2.7.0dev (2019-06-13T14:04:41Z trunk 56d595198b) [x86_64-darwin18]
```


# Ruby の `|>`

`.` でメソッド呼び出しする代わりに `|>` でもメソッド呼び出しすることができるらしいです。

最初、 Elixir と同じことができるようになったのかと勘違いして、以下のコードを試してみました。 

```ruby:NG_pipeline.rb
def square(num)
  num**2
end

def cube(num)
  num**3
end

def square_cube(num)
  num |> square
      |> cube
end

p square_cube(2)
```

残念ながら、 `NoMethodError` になりました :cry:

```shell
$ ruby NG_pipeline.rb
Traceback (most recent call last):
        1: from NG_pipeline.rb:14:in `<main>'
NG_pipeline.rb:10:in `square_cube': private method `square' called for 2:Integer (NoMethodError)
```

`.` の代わりに `|>` が使えるということなので、オブジェクトのメソッド呼び出しにすれば大丈夫かと思い、以下のようにコードを書き換えてみました。

```ruby:pipeline.rb
class Numeric
  def square
    self**2
  end

  def cube
    self**3
  end
end

def square_cube(num)
  num |> square
      |> cube
end

p square_cube(2)
```

今度はちゃんと動作しました :tada:


```shell
$ ruby pipeline.rb
64
```

Elixir だとこんな感じでしょうか。 (Elixir には `**` が無いみたいなので、 ベタな書き方にしました。 `:math.pow` は使ってませんがご容赦ください。）

```elixir:pipeline.ex
defmodule SquareCube do
  def square(num) do
    num * num
  end

  def cube(num) do
    num * num * num
  end

  def square_cube(num) do
    num |> square
        |> cube
  end
end

IO.puts SquareCube.square_cube(2)
```

# Ruby と Elixir の違い

Elixir では、 `|>` の左が関数の第１引数で右がその関数になりますが、  Ruby では `|>` の左がオブジェクトで右がそのオブジェクトのメソッドになります。

## Ruby

```ruby
object |> method  # => object.method　と同じ
```

## Elixir

```elixir
param |> function # => function(param) と同じ
```

# 2019/09/06 追記

その後、この機能は Matzにより [revert](https://github.com/ruby/ruby/commit/2ed68d0ff9a932efbc4393c869534040dec8f647) されました。
現時点では動作しません。

```shell
$ ruby -v pipeline.rb
ruby 2.7.0dev (2019-09-06T01:34:33Z master 3b60e5e6bc) [x86_64-darwin18]
pipeline.rb:12: syntax error, unexpected '>'
  num |> square
```
Capistranoでsecret_key_baseのエラー

# 環境
- Rails 5.2.1
- Ruby 2.6.1
- Capistrano3

# 問題
capistranoでデプロイをしようとした際に、デプロイしたアプリケーションにsecret_key_baseが設定されていないためエラーが発生する

# 解決法
### config/deploy.rb

```rb

set :linked_files, fetch(:linked_files, []).push('config/credentials.yml.enc')
set :linked_files, fetch(:linked_files, []).push('config/master.key')

namespace :deploy do
  # サーバーにファイルをアップロードする
  task upload_file: [:set_rails_env] do
    on roles(:app) do |host|
      upload!('config/master.key', "#{shared_path}/config/master.key")
      upload!('config/credentials.yml.enc', "#{shared_path}/config/credentials.yml.enc")
      execute 'echo "credentials.yml.enc upload!!"'
    end
  end
end

```
MeCabでユーザ辞書を使用する

１．ユーザ辞書を作成する
（１）csvファイルを作って語を定義する

```csv:sample_userdic.csv
Ｇ２０,1288,1288,8461,名詞,固有名詞,一般,*,*,*,G20,ジートゥウェンティ,ジートゥウェンティ
```

（２）ディレクトリを作って配置する

```bash:
$ sudo mkdir /usr/local/lib/mecab/dic/sample_userdic
$ sudo cp sample_userdic.csv /usr/local/lib/mecab/dic/sample_userdic
```

２．コンパイルする（この場合はシステム辞書に新語辞書を使用）

```bash:
$ cd /usr/local/lib/mecab/dic/sample_userdic
$ sudo /usr/local/libexec/mecab/mecab-dict-index -d/usr/local/lib/mecab/dic/mecab-ipadic-neologd -u sample_userdic.dic -f utf-8 -t utf-8 sample_userdic.csv
reading sample_userdic.csv ... 1
emitting double-array: 100% |###########################################| 

done!
$ ls
sample_userdic.csv  sample_userdic.dic
```

３．確認する（この場合は引数として指定、mecabrcでも指定できる）
◇ コマンドから確認

```bash:
$ mecab -d "/usr/lib/mecab/dic/mecab-ipadic-neologd/" -u "/usr/lib/mecab/dic/userdic/userdic.dic"
２０カ国・地域（Ｇ２０）
２	名詞,数,*,*,*,*,２,ニ,ニ
０	名詞,数,*,*,*,*,０,ゼロ,ゼロ
カ国	名詞,接尾,助数詞,*,*,*,カ国,カコク,カコク
・	記号,一般,*,*,*,*,・,・,・
地域	名詞,一般,*,*,*,*,地域,チイキ,チイキ
（	記号,括弧開,*,*,*,*,（,（,（
Ｇ２０	名詞,固有名詞,一般,*,*,*,G20,ジートゥエンティー,ジートゥエンティー
）	記号,括弧閉,*,*,*,*,）,）,）
```

◇ pythonから確認

```python:sample.py
>>> import MeCab
>>> mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd -u /usr/local/lib/mecab/dic/userdic/userdic.dic')
>>> strG20 = "２０カ国・地域（Ｇ２０）"
>>> line = mecab.parse(strG20)
>>> word = parsed.split('\n')
>>> word[6]
'Ｇ２０\t名詞,固有名詞,一般,*,*,*,G20,ジートゥエンティー,ジートゥエンティー'
```
PHPExcelで大容量エクセルファイルの読み込みや処理がうまくいかない場合

数千や数万行あるエクセルファイルをPHPExcelで処理しようとすると、「Allowed memory size of *** exhausted」と出力されることがある。コマンドラインの場合は Killed と出力され強制終了することがある。

原因がメモリ使用量の超過の場合、下記のいずれかで対処する。

##必要なデータのみ読み込む##
罫線や背景色などの装飾は不要な場合、セルの値や式(SUMなど)のみ読み込んだり、特定のシートのみ読み込むようにすることでメモリ使用量を節約する。

```php
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true); //罫線や背景色などの装飾を無視して、セルの値や式(SUMなど)のみを読み込む
$wsList = $objReader->listWorksheetNames($excelFile); //シート名を配列で取得
$objReader->setLoadSheetsOnly($wsList[0]); //シート名を指定して特定のシートのみ読み込む
//$objReader->setLoadSheetsOnly( array($wsList[0], $wsList[1]) );//複数シートを読み込む場合
```

##ループ処理の場合は1回のループ終了ごとにメモリを解放する##
複数のエクセルファイルに対してループで処理を行っている場合などは、ループ回数が増えるたびにメモリ使用量が増加していくので、１回のループが終了するたびに次を実行しメモリを解放する。

```php
$objExcel->disconnectWorksheets();
unset($objExcel);
```
次のように使用する。

```php
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
foreach($excelFiles as $excelFile){
    $objExcel = $objReader->load($excelFile);
    
    /* 何らかの処理 */
    
    $objExcel->disconnectWorksheets();
    unset($objExcel);
}
```

##オブジェクトの保存先をメモリ以外にする##
PHPExcel_CachedObjectStorageFactory で一時データの保存先をメモリ以外に変更する。

PHPExcel_CachedObjectStorageFactory::cache_in_memory
デフォルト。メモリにセルオブジェクトをそのままメモリに保存 PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized
シリアライズされたオブジェクト配列でメモリ上に保存
PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip
cache_in_memory_serializedをさらにgzip圧縮して保存
PHPExcel_CachedObjectStorageFactory::cache_igbinary
igbinary拡張を用いて、メモリに保存
PHPExcel_CachedObjectStorageFactory::cache_to_discISAM
一時ファイルに保存
PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp
php://tempに保存
PHPExcel_CachedObjectStorageFactory::cache_to_apc
APCを利用して保存
PHPExcel_CachedObjectStorageFactory::cache_to_memcache
memcacheに保存
PHPExcel_CachedObjectStorageFactory::cache_to_wincache
wincacheに保存
PHPExcel_CachedObjectStorageFactory::cache_to_sqlite
PHPExcel_CachedObjectStorageFactory::cache_to_sqlite3
SQLiteに保存

```php
//php://tempに保存する場合はキャッシュサイズを定義する
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '32MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

//一時ファイルに保存保存する場合は一時ファイルのパスを定義する
//$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
//$cacheSettings = array('dir' => '/tmp');
//PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

$objExcel = PHPExcel_IOFactory::load($excelFile);
```

##PHPが確保できる最大メモリの値を上げる##
ini_set や .htaccess、 php.ini にて memory_limit を設定
Javaの学習（１）-Hello World

#まずは実際に動かす
環境構築は色々なサイトにあるので割愛（めんどい笑）。
以下が、ソースコードになる。

```Main.java
public class Main{
	public static void main(String[] args){
		System.out.println("Hello World!!");
	}
}
```

（お、ソースコードがQiitaで表示できた笑）

これを実行することで結果が「Hello World!!」と出力される。
基本的にプログラミングは最初にHello Worldを出すことから始める（なんで？）

とりあえずSystem.out.println("文字列")で文字列を表示することができることがわかる。
色々な表示方法があるのかもしれないがそれは追々やっていく。

#Javaのソースファイルの名前
ソースファイルの名前の付け方。
コードの1行目に「public class Main」とあるが、このMain部分（クラス名という）を使って「Main.java」と命名する。
Mainの部分については色々なものに変更可能。
【GoogleAppsScript】doPost のリクエストパラメータでHTTPヘッダを取得することはできない

Google Apps Script(GAS)のdoPOSTのパラメータでヘッダ情報は取得することはできない([出典](https://issuetracker.google.com/issues/67764685)) <a href="#1">\*1</a>

# 背景
OAuth認証の非対応のiOSショートカットアプリ(元workflow)からGASのdoPostを呼び出しの際に[RFC 6750](http://tools.ietf.org/html/rfc6750)に準拠した認証トークンをHTTPヘッダに実装しようとして発覚。

# どうしたか
HTTPリクエストのjsonのパラメータの1つとして値を渡すことに暫定的にしました。

```
{
    "auth":TOKEN
}
```

# 参考

[Qiita - トークンを利用した認証・認可 API を実装するとき Authorization: Bearer ヘッダを使っていいのか調べた](https://qiita.com/uasi/items/cfb60588daa18c2ec6f5)

[Stack Overflow - Access request headers in doPost()](https://stackoverflow.com/questions/47634044/access-request-headers-in-dopost)



***

<span id="1" style="font-size:small">1: 2019/06/14時点での情報です。出典のissueの経過を見守りましょう</span>
eachメソッドを自分で作ってみた

今日はwhile文とブロックを使ってeachメソッドを作ってみました。

##1.作ろうと作ろうと思った理由
最近ブロックについて勉強していたのですが、いまいち理解出来なかったので普段使っているものを自分で作ってみようと思ったのが理由です。

##2.前提
今回はあくまでブロックを理解するのが目的なので完全なeachメソッドの実装は目指しておりませんのでご了承ください。

##３.そもそもeachメソッドって何？
>eachメソッドは、配列の要素の数だけブロックを繰り返し実行します。繰り返しごとにブロック引数には各要素が順に入ります。戻り値はレシーバ自身です。

要素を一個ずつ取り出してそれぞれに処理をしていくといった感じですね。
eachメソッドの概要も知れたので早速実装していきたいと思います。

##4. 実装
先ほども確認した通り、eachメソッドには二つの処理があるように思われます。
1.要素を順番に取り出す。
2.取り出した要素に対して処理を施す。

1は簡単ですね。
今回はwhileを使います。

```rb
class Array

  def initialize
    @loop_count = 0
  end

  def alias_each
    #要素を順番に取り出す
    while @loop_count < self.size
      self[@loop_count]
     #取り出した要素に対して処理を行う
     #なんらかの処理
     #ループカウントを一つ増やす
      @loop_count += 1
    end
  end
end
```

このようになります。
ループさせて要素を取り出していきます。
uptoメソッドなどを使えばループカウンタを使わずに実装できるのですがuptoを使うともうほぼ完成になってしまうと思ったので今回はwhile文でやります笑

続いて取り出した要素にどうやって処理をしていくかですが、ここでyieldを使いたいと思います。

完成したのはこちらです。

```rb
class Array

  def initialize
    @loop_count = 0
  end

  def alias_each
    while @loop_count < self.size
      value = yield self[@loop_count]
      @loop_count += 1
    end
  end
end
```

このようになりました！
早速使ってみたいと思います。

メソッド呼び出し

```rb
array = Array.new.push(1,2,3,4,5)
array.alias_each do |value|
  p value * 2
end

array = Array.new.push('john', 'bob', 'michal')
array.alias_each do |value|
  p value.upcase
end
```

実行結果

```rb
nebashimiyakotasukunoMacBook-ea:original_code keisuke713$ ruby ./array/array.rb
2
4
6
8
10
"JOHN"
"BOB"
"MICHAL"
```



尚、今回はinitializeメソッドでloop_countを初期化する作業をするためArray.newで作られた配列でないとこのメソッドは使えません。

##5.まとめ
今回の実装を通じてeachメソッドの処理の流れ、yieldの使い方を学ぶことができました。
裏でどのようなことが起きているかを知ることは初学者にとっては必要なことだと思うので今後もやっていきたいと思います。
python の　お勉強　２日目

python の　お勉強　２日目
詳しい文法の勉強を始めると面白くないので
python の　GUIライブラリ　Tkinterを使ってみる

使い方の流れ
１）Tkinter モジュールをインポートする(python3 です）
２）GUIアプリの　Windowを作る
３）Windowの中に　部品（ボタン、テキストボックス、ラベルなど）を配置する
４）部品へのアクション（入力、クリックなど）を待つ	

```py
from tkinter import *
from tkinter import ttk
root = Tk()
ttk.Button(root, text="Hello World").grid()
root.mainloop()
```
My備忘録

[venv環境を作成(mac OS)](https://qiita.com/pappapa/items/60c204ea284137791fbb)
[pipコマンドでパッケージをインストール](https://qiita.com/pappapa/items/7a9f1aff305bb76b051a)
[特定のフォルダの".DS_Store"を消す](https://qiita.com/pappapa/items/19a2bedcc75675485949)
特定のフォルダの".DS_Store"を消す

#意図せぬ".DS_Store"を消す。
**※自分のメモ用であり、[こちら](http://cly7796.net/wp/other/delete-all-ds-store/)の引用です。**

```python
#".DS_Store"を消したいフォルダを指定
$ cd /Desktop/*****/+++++
#".DS_Store"があるか確認
$ find . -name ".DS_Store"
#削除
$ find . -name ".DS_Store" | xargs rm
```
プログラミング学習におけるオススメ休息法

プログラミング学習において、色々な学習方法がある。しかし、休息法についてはあまり言及されていないようだったので、今回自分なりに調べたことをまとめてみました。

#プログラミング学習における、おすすめの休息法(4つ)
##1.瞑想
脳を休息させる上で、最も手軽に行える休息方法である。学習開始前や学習中の小さな休憩時間におこなうとよい。ずっと、プログラムを書いたり、考えたりしていると、それだけで脳に大きな負担がかかっている。そのため、瞑想を行って、脳の負担をリフレッシュさせる必要がある。

**瞑想の具体的方法**
鼻で5秒吸って、口で10秒ゆっくりかつ細く吐く腹式呼吸を5分から10分間行う。ポイントは、意識の全てを呼吸に集中させ、他のことを一切考えないことである。


##2.入浴
学習中の休憩時間や就寝前などに行うとよい。
お湯に浸かることで、体温が上昇して体内の老廃物や疲労物質が除去される。さらに、自律神経のバランスが整えられ、浮力によって体の負担が軽減され、リラックス効果も期待できる。

**入浴の具体的方法**
38℃〜40℃のお湯に40分〜60分ほど半身浴をする。
また、可能な限り就寝約２時間ほど前までに入浴する。時間がない場合あるいはすぐに寝たい場合は、シャワーで代替することもできる。
また、入浴中に瞑想を行うことで相乗効果が生まれる。

##3.有酸素運動
プログラミング学習は、デスクワークであるため、運動不足になりやすい。運動不足になると、集中力の低下などにもつながる。有酸素運動を行うことで、血流が良くなり疲労回復につながり、自律神経のバランスが改善される。休憩中は、なるべく椅子に座ったままではなく、適度に歩いたり、階段を登ったりするとよい。

**有酸素運動の具体的方法**
なるべく屋外に出て外の空気を吸い、すこし汗ばむくらいのウォーキングやジョギングをする。腹式呼吸を意識するとさらによい。




##4.ストレッチ
有酸素運動と同じく、プログラミング学習は、同じ姿勢を維持しがちであり、筋肉が固まって血流が滞ってしまう。それによって、集中力の低下や疲労の蓄積につながりやすくなる。学習中の小さな休憩時間中に行うとよい。

**ストレッチの具体的方法**
上半身 　
　　大胸筋、肩甲骨、首周りの筋肉をほぐすor伸ばす。　　

下半身
　　お尻、太もも、ふくらはぎの筋肉をほぐすor伸ばす。

##おわりに
以上、プログラミング学習における4つの休息法でした。学習中(特に短期集中型)は、時間を気にするあまり、つい頑張りすぎてしまい、休憩をとることをおろそかにしがちである。
しかし、頑張りすぎたからといって、学習効率が向上するわけではなく、むしろ、悪くなる一方である。脳や身体のスペックにも限界があるため、休憩を適宜とって学習に臨むようにしていただきたい。良質な学習をすることは、良質な休息をとることと表裏一体である。自分でもこのことを意識して、今後の学習に生かしていきたい。

他にオススメの休息法があれば、教えてください！また、今回挙げた休息方法についてのご指摘も大歓迎です！

<参考文献>
・『最強の勉強法』(2018年、洋泉社)99頁以下
・山田知生『スタンフォード式　疲れない体』(2018年、サンマーク出版)
　110頁以下
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
DjangoでCSS等の更新がなされない場合にすべきこと

ブラウザにキャッシュが残るのでCSSを変更・更新しても変更がブラウザに反映されない。
以下に対処法をあげる。
# 1.スーパーリロードする
OSやブラウザによって操作は異なるようだが、スーパーリロードでググればでてくるので詳細は省略。
スーパーリロードすることによって強制的に更新する。
ただし、自分でやる分にはいいが顧客にやってもらうのは面倒である。
https://qiita.com/shati-taro/items/3946d3962071a26ebcb6
# 2.キャッシュバスティング
DjangoでCache Bustingの設定する
https://webty.jp/staffblog/production/post-1181/
## 2-1.クエリをつかう
手動でクエリを変更することもできるが面倒。django-static-md5urlを使う。
https://pypi.org/project/django-static-md5url/

```console
$ pip install django-static-md5url
```

```Python:setting.py
INSTALLED_APPS = [
...
    'django_static_md5url',
]
```

```HTML:app/templates/base.html
<!-- base.html -->
{% load md5url %}
...
<link href="{% md5url 'css/style.css' %}" rel="stylesheet" type="text/css">
```
クエリが付与された状態で出力される。

```HTML:app/templates/base.html
<link href="/static/css/base.css?v=e352ca3230fc" rel="stylesheet" type="text/css">
```
## 2-2.名前を変更する
```Python:setting.py
DEBUG = False
...
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
```
```HTML:app/templates/base.html
<!-- base.html -->
{% load static %}
...
<link href="{% static 'css/style.css' %}" rel="stylesheet" type="text/css">
```
```console
$ python manage.py collectstatic
```
ファイル名にハッシュが付与された状態で出力される。

```HTML:app/templates/base.html
<link href="/static/css/base.e352ca3230fc.css" rel="stylesheet" type="text/css">
```
ただしハッシュごとにファイルが別れることになるので管理が面倒。

https://blog.xoxzo.com/ja/2018/08/22/cache-busting-in-django/
ニーモニック（語呂）で覚える Vim コマンドチートシート

Vim の主要なコマンドのほとんどは適当に文字が割り当てられているわけではなく，機能の単語に対応する文字が割り当てられている．そのためよく使う操作はニーモニックを覚えれば簡単に思い出せる．例えば

- `i`= insert（カーソル位置に文字を挿入）
- `a`= append（カーソルの後ろに文字を挿入）
- `caw`= change a word（単語を置きかえる）
- `dta` = delete till 'a'（カーソル位置から a までを削除する）
- `fa`= find 'a' （a の位置にカーソルを移動する）

など．

機能とコマンドの対応が分かりやすいチートシートを作ったので公開する．あまりに基本的な操作については省いた．surround vim など一部プラグインの利用を前提にしている部分もあるのでその点は注意．

![](https://raw.githubusercontent.com/fiftystorm36/vim-mnemonic-cheatsheet/master/vim-mnemonic-cheatsheet.png)

こちらに印刷に適した PDF や編集可能なファイルも置いておくので自由に使ってください．

- https://github.com/fiftystorm36/vim-mnemonic-cheatsheet

## 参考
- [Vim Mnemonic | Vim のコマンドの覚え方大全](http://haya14busa.com/vim-mnemonic/)
- [実践Vim　思考のスピードで編集しよう！ (アスキー書籍)](https://www.amazon.co.jp/dp/B00HWLJI3U)
GANを使った潜在空間のクラスタリング

###はじめに
この記事ではClusterGANの用語の説明です．アルゴリズムまでは説明しておりません．
詳しくは論文をお読みください．
(ちゃんと読めてないので逆に誰か僕に教えてほしい)

##ClusterGAN
論文
「ClusterGAN : Latent Space Clustering in Generative Adversarial Networks」
Sudipto Mukherjee 1 , Himanshu Asnani 1 , Eugene Lin 1 , Sreeram Kannan 1 ,
https://arxiv.org/pdf/1809.03627.pdf

##研究での貢献
####目的は潜在空間を上手く構成してクラスタリングしようという論文だと思われる．


###各記号の説明
$z=(z_n,z_c)$
$z_n \sim \mathcal{N}\left(0, \sigma^{2} I_{d_{n}}\right)$
$z_c = e_k$
$k \sim \mathcal{U} \\{ 1,2, \ldots, K \\}$
($\mathcal{U}$はおそらく連続一様分布だと思われます．)

$e_k$は$\mathbb{R}^K$のk番目の基本ベクトルです．また，Kはデータ内のクラスタ数です。

###ClusterGANのアーキテクチャー
<img width="692" alt="スクリーンショット 2019-06-14 4.35.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/fd8004cd-4f71-44f4-8a39-21eef51f949e.png">

###学習
以下の敵対的学習を行います．
<img width="1160" alt="スクリーンショット 2019-06-14 4.04.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/7ba5d482-6b42-8fa5-81d7-64945281662e.png">


###実験結果
<img width="722" alt="スクリーンショット 2019-06-14 4.12.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/0cda92e0-8019-19f2-89ef-ecc9e0747819.png">

提案手法(d)では潜在空間をかなり綺麗に分離できているごとがわかります．

###ソースコード
https://github.com/sudiptodip15/ClusterGAN
https://github.com/zhampel/clusterGAN
など