OmniAICreator/Qiita-1.07M huggingface dataset:
char varchar 型　違い

CHAR型

固定長の文字列データを扱うデータ型。
CHAR(10)と指定された列の場合、格納される列は常に10バイトになる。
10バイトに満たない場合は文字列の右側に空白が追加され、10バイトぴったりに調整される。
使い道) post-address(郵便番号),UUIDなど

つまり、どれだけ短い値が入っていても10byteの要領は確保する

characterの略

VARCHAR型
CHAR型と異なり、格納する文字列の長さの調整はされない。
VARCHAR(10)と指定された列の場合、10バイト以下の文字列でも、それに合わせた領域が確保される為、そのままの長さで格納することが可能。
ただし、最大長以上(10バイト以上)の文字列の格納はできない。
どう使い分けるか
CHAR型は、郵便番号や社員番号など、データの桁数が決まっているもの向け。
VARCHAR型は、氏名や書籍名など、データ桁数が変動する可能性のあるもの向け。
使い道) name ,address,

つまり、byte数は値によって変化する。
character varyingの略
【GCP】Cloud Functions の Go 1.13 で取得できなくなった環境変数とそれを置き換えれるメタデータの対応表


[前回の記事](https://qiita.com/shigwata/items/5de27ff322f6198f15b1)から引き続いてGCF/Go 1.11から Go1.13への移行の話です。
自動的に設定される環境変数にも変更がありました。

## Go1.11で設定されている環境変数

https://cloud.google.com/functions/docs/env-var#nodejs_6_nodejs_8_python_37_and_go_111

キー|説明
-----|-----
ENTRY\_POINT|予約済み：実行される機能。
GCP\_PROJECT|予約済み：現在のGCPプロジェクトID。
GCLOUD\_PROJECT|予約済み：現在のGCPプロジェクトID（非推奨）。
GOOGLE\_CLOUD\_PROJECT|予約済み：設定されていませんが、内部使用のために予約されています。
FUNCTION\_TRIGGER\_TYPE|予約済み：関数のトリガータイプ。
FUNCTION\_NAME|予約済み：関数リソースの名前。
FUNCTION\_MEMORY\_MB|予約済み：関数の最大メモリ。
FUNCTION\_TIMEOUT\_SEC|予約済み：秒単位の実行タイムアウト。
FUNCTION\_IDENTITY|予約済み：関数の現在のID（サービスアカウント）。
FUNCTION\_REGION|予約済み：関数領域（例：）us-central1。


## Go1.13で設定されている環境変数

https://cloud.google.com/functions/docs/env-var#nodejs_10_and_subsequent_runtimes

キー|説明
-----|-----
FUNCTION\_TARGET|予約済み：実行される機能。
FUNCTION\_SIGNATURE\_TYPE|予約済み：関数のタイプ：httpHTTP関数およびeventバックグラウンド関数用。
K\_SERVICE|予約済み：関数リソースの名前。
K\_REVISION|予約済み：関数のバージョンID。
PORT|予約済み：関数が呼び出されるポート。

## 環境変数の代わりにメタデータサーバーを使う

https://cloud.google.com/compute/docs/storing-retrieving-metadata

メタデータサーバーには、インスタンスのホスト名やインスタンスIDなどのインスタンスのメタデータが保存されています。
通常は、GCEから利用するようですが、GCFからも一部の情報は取得できるようなので確認してみました。

サンプルコードは下記に公開しています。
https://github.com/shigwata/gcp-cloud-functions-env-var

### GCFでメタデータ サーバーから取得できた値

メタデータキー|値
-----|-----
project/attributes/|\-
project/attributes/disable-legacy-endpoints|\-
project/attributes/enable-oslogin|\-
project/attributes/vmdnssetting|\-
project/attributes/ssh-keys|\-
project/numeric-project-id|[GCP_PROJECT_NUM]
project/project-id|[GCP_PROJECT]
instance/attributes/|\-
instance/attributes/enable-oslogin|\-
instance/attributes/vmdnssetting|\-
instance/attributes/ssh-keys|\-
instance/cpu-platform|\-
instance/description|\-
instance/disks/|\-
instance/guest-attributes/|\-
instance/hostname|\-
instance/id|[INSTANCE_ID]
instance/machine-type|\-
instance/name|\-
instance/network-interfaces/|\-
instance/network-interfaces/0/access-configs/0/external-ip|\-
instance/network-interfaces/0/forwarded-ips/|\-
instance/scheduling/|\-
instance/scheduling/on-host-maintenance|\-
instance/scheduling/automatic-restart|\-
instance/scheduling/preemptible|\-
instance/maintenance-event|\-
instance/service-accounts/|[SERVICE_ACCOUNTS]
instance/service-accounts/default/email|[GCP_PROJECT]@appspot.gserviceaccount.com
instance/service-accounts/default/token|[TOKEN]
instance/service-accounts/default/identity|\-
instance/tags|\-
instance/zone|projects/[GCP_PROJECT_NUM]/zones/[ZONE]

全然取れないです。。。

## 対応表

Go 1.11環境変数|Go 1.13環境変数|メタデータキー
-----|-----|-----
ENTRY\_POINT|FUNCTION\_TARGET|\-
GCP\_PROJECT|\-|project/project-id
GCLOUD\_PROJECT|\-|project/project-id
GOOGLE\_CLOUD\_PROJECT|\-|\-
FUNCTION\_TRIGGER\_TYPE|FUNCTION\_SIGNATURE\_TYPE（※値は一致しない）|\-
FUNCTION\_NAME|K\_SERVICE|\-
FUNCTION\_MEMORY\_MB|\-|\-
FUNCTION\_TIMEOUT\_SEC|\-|\-
FUNCTION\_IDENTITY|\-|instance/service-accounts/default/email
FUNCTION\_REGION|\-|\-
\-|K_REVISION|\-
\-|PORT|\-


対応する値がないものは、デプロイ時に環境変数を設定するしかなさそうですね。


## おわりに

GCFもGAEの第二世代のように内部的に大きく変わっているようです。
GCF/Go 1.11は廃止予定が利用ユーザ宛にされたので、この記事が移行の参考になれば幸いです。
第三回 JavaScriptの非同期処理とシングルスレッド

## まずはサンプルコードから

以下の様な JavaScript `index.js` を実行します。

1. 【処理 1】ミリ秒で終わる処理を setTimeout() で 5 秒後に発火
2. 【処理 2】ミリ秒で終わる処理を setTimeout() で 0 秒後に発火
3. 【処理 3】10 秒かかる同期処理を実行

```javascript
/** 本スクリプトの実行開始時間　*/
const startTime = new Date().getTime()

/**
 * 本スクリプトを実行してからの経過秒数を取得する。
 *
 * @return {number} 経過秒数
 */
function getSeconds() {
  return (new Date().getTime() - startTime) / 1000
}

/**
 * 本スクリプトを実行してからの経過秒数を取得する（フォーマット済み版）。
 *
 * @return {number} 経過秒数
 */
function getSecondsFormatted() {
  return getSeconds().toFixed(6).padStart(10, ' ')
}

/**
 * 処理 1 (非同期, 5 秒後に発火).
 */
function func1() {
  console.log(`${getSecondsFormatted()} seconds --> 処理 1 (非同期, 5 秒後に発火)`)
}

/**
 * 処理 2 (非同期, 0 秒後に発火).
 */
function func2() {
  console.log(`${getSecondsFormatted()} seconds --> 処理 2 (非同期, 0 秒後に発火)`)
}

/**
 * 処理 3 (同期. 10 秒かかる).
 */
function func3() {
  while (getSeconds() < 10) {
    // consuming a single cpu for 10 seconds...
  }
  console.log(`${getSecondsFormatted()} seconds --> 処理 3 (同期, 10 秒かかる)`)
}


// メイン処理開始
console.log(`${getSecondsFormatted()} seconds --> index.js START`)

// 処理 1 (非同期, 5 秒後に発火)
setTimeout(func1, 5000)

// 処理 2 (非同期, 0 秒後に発火)
setTimeout(func2)

// 処理 3 (同期, 10 秒かかる)
func3()

console.log(`${getSecondsFormatted()} seconds --> index.js END`)
```

---
## 期待値？
なんとなく 「こう動作するだろう...」 という思うのは下記でしょう。

```javascript
  0.000000 seconds --> index.js START
  0.000000 seconds --> 処理 2 (非同期, 0 秒後に発火)
  5.000000 seconds --> 処理 1 (非同期, 5 秒後に発火)
 10.000000 seconds --> 処理 3 (同期, 10 秒かかる)
 10.000000 seconds --> index.js END
```

---
## 実際は...
現実はこうです。何故でしょうか。

```javascript
  0.175104 seconds --> index.js START
 10.000085 seconds --> 処理 3 (同期, 10 秒かかる)
 10.000210 seconds --> index.js END
 10.000955 seconds --> 処理 2 (非同期, 0 秒後に発火)
 10.001161 seconds --> 処理 1 (非同期, 5 秒後に発火)
```

---
## シングルスレッドなので順番に処理している

おおよそ、 `JavaScript` の内部では下記のように処理がシングルスレッドで行われています。

* 最初のエントリ JavaScript index.js がタスクとして、未実行タスクに乗ります
* 未実行タスクから index.js タスクが取り出され、実行が開始されます

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38694/daa5ef58-0030-a38a-e724-728919088edc.png)

---
* setTimeout(処理1, 5秒) が実行され、【処理 1】がタイマータスクに追加されます
* setTimeout(処理2, 0秒) が実行され、【処理 2】がタイマータスクに追加されます

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38694/f2f5f63e-e452-c0c4-5936-5da276956b92.png)

---
* 【処理 3】が同期的に実行され、10 秒間、CPU (シングルコア) を専有します
* index.js タスクの実行が終了します
* タイマータスクから 有効期限が切れたタスク【処理 2】 を取り出し、実行が開始されます

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38694/716eff08-7683-d362-dcec-e9d3578ce7e0.png)

---
* 【処理 2】タスクの実行が終了します
* タイマータスクから 有効期限が切れたタスク【処理 1】 を取り出し、実行が開始されます
* 【処理 1】タスクの実行が終了します

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38694/8e867834-d5a5-4d3f-a565-a31c60e652c7.png)

---
## 結論
つまり、 `setTimeout()` 等の非同期タイマー処理は...

**指定した時間が来たら即座に Callback を実行する**
ではなく

**指定した時間を 過ぎてたら Callback を できるだけ早く 実行する**
です。

それは `Promise` や `fetch` でも同じで

**Callback が実行可能になってから (現在実行中の他の処理を待って) 順番が来たら実行開始する**
です。
Rails6で作ったアプリをGitHubへプッシュしたい

 
手順
---
####0.設定 （複数人で開発する場合）

```terminal:ターミナル
$ git config --global user.name "名前"
$ git config --global user.email xxx@xxx.com #アドレス
```

####1.rails newで作られたgitリポジトリの初期化


```terminal:ターミナル
$ git init #初期化
```

####2.gitリポジトリへデータを追加してcommitする

```terminal:ターミナル
$ git status #ファイルの状態を確認する
$ git add -A #保存するファイルを指定する　-Aは全ファイル追加、ファイル名を指定して1つずつ追加することもできる
$ git commit -m "メッセージ内容"
```

####3.GitHubでpush先のリポジトリを立ち上げる
![github 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651208/a88608ba-bb82-465d-e8e7-807d861466b8.png)

####4.GitHubへプッシュする

```terminal:ターミナル
$ git remote add origin https://github.com/tkse16/sumple_app.git #GitHubのリポジトリとoriginを紐つける
$ git push -u origin master #GitHubへプッシュする。-uはなくてもいい
```
---
以上！
本当に残業すべき？睡眠のゴールデンタイム(22:00～2:00)を逃さない！天使の眠りチェックシート



## なぜ天使の眠りチェックシートを作ったか？その背景
プロ野球もようやく開幕できました。プロ野球チームと同じように我々の健康状態も浮き沈みがあります。プロ野球の長いペナントレースよりももっと長く1年中仕事は続き営業日どころか休日も出勤することもあります。
そういった過酷な状況下に否応なしにさらされる我々なので、せめて安定した睡眠時間を確保しより日々の生産効率のベースを上げ公私ともに充実した日々を過ごしてもらうためにチェックリストを作りました。		

##早速チェックシート		
	

|チェック№|チェックリストの項目名|(○△×)|
|---|---|---|
|1-1.|その仕事は本日締め切りのものですか？翌営業日や翌週の第一営業日の午前中に終わらせても問題ないことですか？||
|1-2.|【1-1】ではいだった場合、上長に残業しないと完了できないことを報告しましたか？||
|1-3.|周りのメンバーにヘルプを求めましたか？||
|1-4.|その仕事はそこまでのクオリティが求められていますか？(例えばパワポにせずにテキストにする、Excelの体裁(色やボーダーなど)は整えなくてよいなど)||
|1-5.|無駄な仕事をしていませんか(例えば余計な調査をしてしまっているなど)||
|1-6.|断れるミーティングはありましたか？もしくは自分の仕事が終わっていないためミーティングの参加をキャンセルすることはできますか？||
|1-7.|客先対応で外出せずにZOOMで対応できるものはありますか？もしくは対面でなくZOOMにすることを提案してみましたか？||
|1-8.|昨晩はよく眠れましたか？眠れていないせいで仕事中眠くなってはいませんか？||
|1-9.|日次や週次や月次にしないといけないことを後回しにして残業時間中にしてはいませんか？(日報や月報の提出、経費精算 )||
|1-10.|断続的に仕事をしていてメリハリを失っていませんか？1日の大体のスケジュールを決めていますか？||
|1-11.|納期通りに終わらなさそうなことはわかり次第上長に連絡していますか？||
|1-12.|スランプに陥っていませんか？納期の近い仕事が億劫になり着手できずじまいになっていませんか？||
|1-13.|定時に帰ることに後ろめたさを感じていませんか？||
|1-14.|定時に帰ったとしても道草をしていませんか？帰り道の途中で適量以上のアルコール摂取などをしていませんか？||
|1-15.|自宅で眠れずにアルコールなどに頼っていませんか？||
|1-16.|スマホやPCの画面を長時間見ていませんか？||
|1-17.|早朝に軽い運動はしていますか？||

## 達成目標		
全部△になる、つまり意識してもらえば残業は減ると思います。		
残業が減ってしまうと給料も減りますがストレスも減るため支出が抑えられいい感じになると思います。		
もしくは今まで以上に日々の節約意識が芽生え貯金は増えると思います。		
		
## 仕事はほどほどに
いつも頑張らなくてはいけないということは絶対にないんです。全力疾走している人はすぐに息切れするものです。無理をしても将来ツケがくるだけです。いくら上司に認められてもプロサッカーチームの監督のごとく上司はコロコロ変わります。TwitterのジャックドーシーCEOは10時くらいに来て18時には帰宅するそうです。仕事よりも個人で受けているヨガ教室を優先するとのこと。
それでもTwitterとSquareというNasdaq上場2社の社長を務めています。		

## 改訂履歴
- 2020/7/22 新規作成
テストデータ用の自然な姓名を同姓同名無しで作るPythonのスクリプト

## 美しいテストデータを作るために

私の会社では人事向けのシステムを販売しているのですが
テストデータがいかにもテストデータのようで美しくありません
例えば人物名が***「AAA」***とか**「テスト太郎」**といった具合です。

## 普通の名前って意外と難しい

私の場合全国の都道府県でもっともありふれている苗字と[明治安田生命が発表した新生児につけたお名前のランキング](	https://www.meijiyasuda.co.jp/enjoy/ranking/index.html)をランダムで出力するといったところにいったん落ち着きました。

### ソースコード

```python 

# -*- coding:utf8 -*-
import numpy as np
import random
arr1 = ["佐藤","鈴木","田中","高橋","田中","伊藤","渡辺","山本","中村","小林"," 加藤","吉田","山田","佐々木","山口","松本","根岸","小池","関口","飯山","飯田"]
arr2 = ["健斗","誠","怜","琉生","花","蓮","陽翔","樹","悠真","咲良","悠斗","大翔","凛","陽葵","さくら","美月","結愛","大和","颯真","芽依"]

def cartesian(arrays, out=None):
    """
    Generate a cartesian product of input arrays.

    Parameters
    ----------
    arrays : list of array-like
        1-D arrays to form the cartesian product of.
    out : ndarray
        Array to place the cartesian product in.

    Returns
    -------
    out : ndarray
        2-D array of shape (M, len(arrays)) containing cartesian products
        formed of input arrays.

    Examples
    --------
    >>> cartesian(([1, 2, 3], [4, 5], [6, 7]))
    array([[1, 4, 6],
           [1, 4, 7],
           [1, 5, 6],
           [1, 5, 7],
           [2, 4, 6],
           [2, 4, 7],
           [2, 5, 6],
           [2, 5, 7],
           [3, 4, 6],
           [3, 4, 7],
           [3, 5, 6],
           [3, 5, 7]])

    """

    arrays = [np.asarray(x) for x in arrays]
    dtype = arrays[0].dtype

    n = np.prod([x.size for x in arrays])
    if out is None:
        out = np.zeros([n, len(arrays)], dtype=dtype)

    m = n / arrays[0].size
    out[:,0] = np.repeat(arrays[0], m)
    if arrays[1:]:
        cartesian(arrays[1:], out=out[0:m, 1:])
        for j in xrange(1, arrays[0].size):
            out[j*m:(j+1)*m, 1:] = out[0:m, 1:]
    return out

if __name__ == '__main__':
    res = cartesian((arr1,arr2))
    result = list()
    for row in res:
        fullname = ' '.join(row)
        result.append(fullname)

    random.shuffle(result)
    for ln in result:
        print ln



```

### 感想
男性らしい名前や女性らしい名前って敬遠されてるんですね。。

### 改訂履歴

- 2020/7/22 新規作成
IntelliJ IDEAでterraform fmtの設定

1. File Watchersをインストール
https://plugins.jetbrains.com/plugin/7177-file-watchers

2. [Preferences] → [Tool] → [FileWatchers]に追加する
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40799/c691e553-ab60-cf98-a330-e18ec61cc087.png)

Programのパスは `$ which terraform` で確認して適宜変更してください


---

以上！
良きTerraform生活を😃
Laravel RestAPIの作成方法

# Laravelとは
一言で言うと 「PHPのMVCアプリケーションフレームワーク」 です。
Laravel（ララベル）は、フルスタックなPHPフレームワークで、ルーティング、コントローラ、ビュー、ORMなど基本的な機能を備え、
さらに近代的なWebアプリで活用されるジョブキューやWebストレージなども積極的に統合されています。

# フレームワークとは
「枠組み」・「骨組み」「構造」などといった意味があり、土台となるフレームワークに必要な機能を追加し、アプリケーションの開発を進めていくのが一般的といわれています。さまざまなシステム開発を効率化してくれる機能群ですね。
機能群だけでなく、ソフトウェアの骨組みまで用意してくれているため、少ないコードで意図する機能やデザイもが実現できます。
それぞれのフレームワーク特有の書き方を学ぶ必要はあるが、プログラミングのビギナーにとって、とてもありがたいです。

# MVCとは
MVCとは「Mode」・「View」・「Controller」の略で、処理を３つの役割に分割して実装する手法です。

Modelは処理のメインロジックやデータアクセスを担当します。
Viewは処理結果として画面表示（HTML出力）を担当します。
そしてControllerはクライアントよりのリクエストを直接受け取って処理を行う、一番前面となる部分で、文字通りModelやViewを「制御」します。

# RestAPI
REpresentational State Transferの略になります。
LarabelにはAPIを作成するときに、artisanコマンドを使って簡単にこのRestAPIを作成することができます。

```
php artisan make:controller TestController --resource
```

すると以下のようなControllerが作成されます。

```
class HogeController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \\Illuminate\\Http\\Response
     */
    public function index()
    {
        //一覧表示
    }
 
    /**
     * Show the form for creating a new resource.
     *
     * @return \\Illuminate\\Http\\Response
     */
    public function create()
    {
        //新規作成
    }
 
    /**
     * Store a newly created resource in storage.
     *
     * @param  \\Illuminate\\Http\\Request  $request
     * @return \\Illuminate\\Http\\Response
     */
    public function store(Request $request)
    {
        //新規作成
    }
 
    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \\Illuminate\\Http\\Response
     */
    public function show($id)
    {
        //レコード表示（指定のIDのやつ表示）
    }
 
    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \\Illuminate\\Http\\Response
     */
    public function edit($id)
    {
        //更新
    }
 
    /**
     * Update the specified resource in storage.
     *
     * @param  \\Illuminate\\Http\\Request  $request
     * @param  int  $id
     * @return \\Illuminate\\Http\\Response
     */
    public function update(Request $request, $id)
    {
        //更新処理
    }
 
    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \\Illuminate\\Http\\Response
     */
    public function destroy($id)
    {
        //削除処理
    }
}
```

このままでは動かないので、ルーティングの設定もする必要があります。

```
Route::resource('rest','RestappController');
```

確認方法

```
php artisan route:list
```

表でまとめるとこんな感じになります
<img width="459" alt="スクリーンショット 2020-07-22 16.56.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418704/ff4fc0e9-347e-6d8f-3d47-0d617c87bda9.png">


RestAPIのMVCの使い方についての記事も自分用のメモですが記事をかきましたのでぜひ参考にしてください。
`https://qiita.com/Yami_37/items/e10d25cbaa1878898396`
せっかちな自分の記録

初めまして。
さんだかと申します。

今回はQiitaへの初めての投稿となります。

自分はせっかちな正確なためか、
何度レビューをやっても細かい所で
躓いてしまいます。
ついさっきも、
レビュー前の動作確認をし忘れて、
レビュー連絡を出してしまいました。

完成前で95%は組みあがったプログラムでも、
ちゃんとレビューを受けてからでないと完成とは言えない。
何度もぶち当たる壁に、
またぶち当たりました。

全然成長していない部分をまた感じながら、
また今日もコードを打ち続けて、
今度こそはと意気込むさんだかでした。
PHPMDのルール一覧

<h1>ルール一覧</h1>

|  ルール  |  ルール名  |  説明  |  デフォルト  |
| ---- | ---- | ---- | ---- |
|  Clean Code Rules<br>(cleancode.xml)  |  BooleanArgumentFlag  |  関数の引数デフォルト値にboolean値が設定されている  |   |
|    |  ElseExpresstion  |  elseが記述されている  |   |
|    |  StaticAccess  |  メソッド内で別クラスのメソッドを静的呼び出ししている  |   |
|  Code Size Rules<br>(codesize.xml)  |  CyclomaticComplexity  |  関数が複雑である（制御構造が多い）  |  上限10  |
|   |  NPathComplexity  |  経路数が多い  |  上限200  |
|   |  ExcessiveMethodLength  |  関数が長い  |  上限100行  |
|   |  ExcessiveClassLength  |  クラスが長い  |  上限値1000行  |
|   |  ExcessiveParameterList  |  関数の引数が多い	  |  上限10	  |
|   |  ExcessivePublicCount  |  publicが多い  |  上限45  |
|   |  TooManyFields  |  プロパティが多い  |  上限15  |
|   |  TooManyMethods  |  メソッドが多い  |  上限25  |
|   |  TooManyPublicMethods  |  publicメソッドが多い  |  上限10	  |
|   |  ExcessiveClassComplexity  |  クラスが複雑	  |  一クラス内の複雑さが50以上  |
|  Controversial Rules<br>(controversial.xml)  |  Supergloobals  |  スーパーグローバル変数にアクセスしている  |   |
|   |  CamelCaseClassName  |  クラス名がキャメルケースになっていない(UCC)  |   |
|   |  CamelCasePropertyName  |  プロパティ名がキャメルケースになっていない(LCC)  |   |
|   |  CamelCaseMethodName  |  メソッド名がキャメルケースになっていない(LCC)  |   |
|   |  CamelCaseParameterName  |  引数名がキャメルケースになっていない(LCC)  |   |
|   |  CamelCaseVariableName  |  変数名がキャメルケースになっていない(LCC)  |   |
|  Design Rules<br>(design.xml)  |  ExitExpression  |  関数内でexitしている  |  TD  |
|   |  EvalExpression  |  evalが使われている  |  TD  |
|   |  GotoStatement  |  gotoが使われている  |  TD  |
|   |  NumberOfChildren  |  小クラスが多い  |  上限15  |
|   |  DepthOfInheritance  |  親クラスが多い  |  上限6  |
|   |  CouplingBetweenObjects  |  クラスの依存関係が多い  |  上限13  |
|   |  DevelopmentCodeFragment  |  デバッグコードがある  |  var_dump<br>print_r<br>debug_zval_dump<br>debug_print_backtrace  |
|  Naming Rules<br>(naming.xml)  |  ShortVariable  |  変数名が短い  |  下限3文字  |
|   |  LongVariable  |  変数名が長い  |  上限20文字  |
|   |  ShortMethodName  |  メソッド名が短い  |  下限3文字  |
|   |  ConstructorWithNameAsEnclosingClass  |  クラス名のコンストラクタがある  |   |
|   |  ConstantNamingConventions  |  定数が大文字ではない  |   |
|   |  BooleanGetMethodName  |  booleanを返すときはisFoo()またはhasFoo()にする  |   |
|  Unused Code Rules<br>(unusedcode.xml)  |  UnusedPrivateField  |  privateなフィールドが使われていない  |   |
|   |  UnusedLocalVariable  |  ローカル変数が使われていない  |   |
|   |  UnusedPrivateMethod  |  privateなメソッドが使われていない  |   |
|   |  UnusedFormalParameter  |  引数が使われていない  |   |

<b>カスタムルールファイル作成</b>
PHPMD公式に記載されている、ルールファイルのテンプレート「ruleset.xml」をコピーして使用する。
X11 が MobaXterm の WSL2 で起動しないときの対処法

:::note warn
WSLg を使って X11 の機能を使うときには、以下の設定は邪魔になるので `DISPLAY=:0` にしてください。
:::

# 困ったこと
MobaXterm を使っていて WSL2 で X11 アプリケーションを開こうとしたら怒られたので解決方法メモ。以下のように怒られる。

```shell-session
$ xeyes
Error: Can't open display: 127.0.0.1:0.0
```

# 解決方法
`/etc/resolv.conf` にある `nameserver` の IP アドレスを確認する。

```shell
$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 192.168.11.1
```

この例でいう `192.168.11.1` を用いて環境変数 `DISPLAY` を以下のように設定する。

```shell
$ export DISPLAY=192.168.11.1:0
```

これで X11 ウィンドウが表示できるようになった。

## シェル起動時に自動で設定させる方法
環境変数 `DISPLAY` は起動するたびに変更されてしまうので、`bashrc` などに 1 行書いておくとよい。

```bash
export DISPLAY=`cat /etc/resolv.conf | grep nameserver | awk {'print $2 ":0"'}`
```

# 参考資料
* [Can't use X-Server in WSL 2 #4106 - GitHub](https://github.com/microsoft/WSL/issues/4106)
リロードしないとJavaScriptが動かない？【Rails】

# 本記事について（お断り）

この記事は、しがないプログラミング初心者がお勉強よろしくプログラミング・技術に触れるべく、行ったことの備忘録として書き綴ったものです。至らぬ点、誤解を招く表現など、ご指摘がありましたら甘んじて受け入れます🙇‍♂️

# 問題

JQueryを使って背景画像をフェードインさせる実装を行った。
該当ページを呼び出すと、しっかりとフェードインしてきた。よしよし。
別ページに遷移して再度該当ページを開いてみる。あれ、真っ白だ。**なぜ？**

# 原因

原因をググっていると、どうやら**Turbolinks**が関係しているっぽい。
Turbolinksとは、Rails4から標準装備されているgemで、ページ遷移の際に、CSSやJavaScriptの読み込みを省略してくれ、高速化をもたらしてくれるという素晴らしい機能。ただし、高速化が期待できる反面で、JavaScript関係でトラブルが起こる可能性も。初心者には取っ付きづらい機能、私のように。

# 解決策

## １.Turbolinksが提供しているイベント`turbolinks:load`を利用する

jsファイル冒頭に

```javascript:
$(document).on('turbolinks:load', function() {
  ...
```

もしくは


```javascript:
document.addEventListener('turbolinks:load', function() {
  ...
```

と書いておけば、ロードしてくれるのでJavaScriptが機能するようになります。

## ２.Turbolinksを無効にする

###・部分的にTurbolinksを無効にする

`link_to`にオプションとして埋め込むことで

```erb:
<%= link_to 'hoge', hoge_path, data: {"turbolinks" => false} %>
```

遷移先のページでtubolinksを無効にする。

###・gemファイルから削除する

```ruby:
gem 'turbolinks', '~> 5'
```
Gemfileから直接turbolinksを削除することでturbolinksを完全無効化する。
**ただし、**turbolinksは前述のとおり高速化をもたらしてくれている素晴らしい機能であることは違いない。コストとメリットを考えて、無効化するかを慎重に考えた方がいい。

解決！

# 参考

[Rails ページ移動した際にリロードしないとJSが機能しない](https://qiita.com/MIRAI1221/items/664154f378cfe1f9e80a)
[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/現場で使える-Ruby-Rails-5速習実践ガイド-大場寧子/dp/4839962227)
HTTPメソッド, ステータスコード

#本記事について
こんにちは。フロントエンドの学習を一通り進めたのでバックエンドの学習に踏み入れた駆け出しエンジニアです。
プログラミング学習サイト「白熱教室」でのエクササイズ課題のアウトプット兼メモとして記事にしました。
今回のエクササイズはこちらです ↓
[【エクササイズ】HTTPメソッド・ステータスコードの理解度の確認](https://tsuyopon.xyz/learning-contents/web-dev/basic-knowledge-of-backend/http-excercise-part-1/#i)
プログラミング学習にはおすすめのサイトなので、気になる駆け出しエンジニアの方は一緒に学習しましょう！！

##HTTPメソッド

###1. 覚えると良いHTTPメソッドの4種類を答える
代表的なHTTPメソッドは「GET」, 「POST」, 「PUT」, 「DELETE」
###2. 4種類のHTTPメソッドの用途を答える
**「GET」: データの取得**
◦ Webサイトに必要なデータの表示(HTML, CSS, JS等)
◦ API経由でデータを取得(掲示板の履歴等)

**「POST」: データの新規作成**
◦ HTMLのform要素method="post"でデータ送信(同期処理)
　　→　掲示板への書き込み、新規アカウントの作成
◦ API経由でデータの送信(非同期)
　　→　掲示板への書き込み、新規アカウントの作成

**「PUT」: データの更新**
◦ API経由でデータを更新
　　→　書き込み済みの内容の変更
　　　 　アカウント情報の更新

**「DELETE」: データの削除**
◦ API経由でデータの削除
　→　書き込み済みの投稿を消去
　　 　アカウント情報の消去

##ステータスコード

###3. HTTPステータスコードは大きく分けて何種類に分類できるか？
「100系」, 「200系」, 「300系」, 「400系」, 「500系」の5種類

###4. ステータスコードの「2xx系」「4xx系」「5xx系」の意味を答える
「2xx系」: 成功時のステータスコード
「4xx系」: クライアント側での失敗時のステータスコード
「2xx系」: サーバー側での失敗時のステータスコード

###5. 「2xx系」「4xx系」「5xx系」が発生する具体例を1つずつ答える
「2xx系」 → 通信成功
「4xx系」 → クライアント側で存在しないデータを取得した
「5xx系」 → プログラムのバグ等で処理が途中で止まった
開発時に使用しているChromeの拡張機能

開発時に使用しているChromeの拡張機能の自分用のメモです。
TODO:あとで、スクリーンショットを貼り付ける
# Checker Plus for Gmail
[Checker Plus for Gmail](https://chrome.google.com/webstore/detail/checker-plus-for-gmail/oeopbcgkkoapgobdbedcemjljbihmemj)
開発以外でも利用可能な拡張です。ｗ
新着メールを通知してくれます。
仕事していると、メールはたくさん受信するので通知がないと見逃してしまう・・・orz
# ColumnCopy
[ColumnCopy](https://github.com/jamesandres/ColumnCopy)
html上のtableタグの部分について、テーブル毎コピーや、列コピーができる拡張です。
テスト時の結果を貼り付ける時に、重宝します
# LastPass: Free Password Manager
[LastPass: Free Password Manager](https://chrome.google.com/webstore/detail/lastpass-free-password-ma/hdokiejnpimakedhajhdlcegeplioahd)
いろんなサイト(ページ)のアカウントとパスワードを保持してくれる拡張です。
一緒にURLも保持するので、ページにアクセスした際に候補のアカウントを選択できます。
※テキストボックス内の右端にあるマークをクリック
アカウントとパスワードをセットで記録するので、パスワードだけなくアカウントも自動入力されます。
# ウェブページ全体をスクリーンショット - FireShot
[ウェブページ全体をスクリーンショット - FireShot](https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg)
もう、名前そのままですｗ
これまた、テスト時の結果を貼り付ける時に、重宝しています
インデックスとは②

#前回のおさらい

前回の記事インデックとは①の続きです。

前回行ったときは社員テーブルに登録されている件数が少なかったので、レコードを10000件ほど増やして、再度実行してみました。

Shainテーブル

| NO               |       Name        |             Age    |
|:-----------------|-------------------|-------------------:|
| 1                |             Ooi   |           48        |
| 2                |            Ubukata|       35       |
| 3                |              Kato |        20        |
| 4                |             Mano |         28         |
| 5                |             Endou  |       38       |
| 6            |           Wtarai    |      40       |
|・・・        |               |     　　　       |


```sql
--使用するインデックス
Create INDEX TR_Name
ON Shain(Name)

--実行するSelect文
SELECT *
FROM Shain
WHERE Name = 'Endou'

```

実行プラン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260891/ae132141-f492-f599-0b7a-9299cf829c83.png)

処理イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260891/488bbda8-4fdc-3663-6c81-92963d7e9fce.png)


前回と結果が違うことがわかると思います。
オプティマイザが判断し、このレコード数なら全件走査したほうが早いと判断したため前回の結果となっていました。
今回はレコード数が増えたためまず設定したインデックスを利用して、キーを特定、その後クラスタ化インデックスにより該当レコードの取得を行ったことになります。

こうなってしまうと、検索に掛ける手間が1つ増え、データの数によっては処理速度の低下につながります。

#インデックスの種類
##カバリングインデックス
カバリング インデックス（Covering Index）は、非クラスター化インデックスのリーフレベルへ検索で取得したいデータを格納して、キー参照（または RID Lookup）を行うことなく、Index Seekのみで完了するインデックスです。

インデックスの設定

```sql
Create INDEX TR_Name
ON Shain(Name, Age)

SELECT Age
FROM Shain
WHERE Name = 'Endou'
```
実行プラン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260891/d5129db2-4a61-23b6-b5e0-f276d0e99b88.png)
一回の操作で対象データを取得することが出来ました。

処理イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260891/067de20e-38fc-bdf1-7c6a-f03af5b7dbe8.png)

各ページにAgeの情報が追加されたため、一回の走査で取得が可能になったことがわかると思います。

**カバリングインデックスの注意点**
①検索の対象は一番左に設定した列が優先されるため、Where句の順番に気を付ける必要がある。
②ルートページやリーフページ（実際には中間ページも）に列が追加されるので、余計に領域を圧迫していしまう

##付加列インデックス
付加列インデックスは、「Include オプション」とも呼ばれ、インデックスのリーフ レベルへ指定した列を含める（Include する）ことができるインデックス。

カバリングインデックスとの違いは、リーフページのみ列を追加するので、必要領域が小さくて済みます。

```sql
Create INDEX TR_Name
ON Shain(Name)
INCLUDE (Age)

SELECT Age
FROM Shain
WHERE Name = 'Endou'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260891/81027a68-3905-feb2-8f4a-fb533520aa96.png)

同じ結果が得られるので、付加列インデックスを採用する方がよい！

##更新時の注意
ここまでインデックスについて説明してきました。
めっちゃ便利！最高！どんどんインデックスを作成しよう！

となりそうですが、そうでもないです。
前述した通り、インデックスも領域を圧迫しますし、更新時の処理負荷を上げてしまいます。

カバリングインデックスや付加列インデックスはインデックスのページにも列を持っています。
つまりその列の値が更新されれば、インデックスの負荷列も更新する必要があります。

従って、インデックスは必要なものを最低限作成する必要があります。

##おわりに
ここまでまとめてきましたが、正直ここまではわかるんだけど・・・・って思われる方も多いと思います。
実際には、必要なインデックスを作成しても、オプティマイザによって別のインデックスを利用するようになっていたり、こっちのパフォーマンスは改善したけど、こっちは遅くなった！なんてこともたくさんありますよね。

こればっかりは常に立ち向かっていくしかないと思ってます。
**俺たちの戦いは続く・・・・てきな**
PMBOK 第6版 ざっくりまとめ


## プロジェクトマネジメントは

### プロジェクトの制約条件

- スコープ（範囲）
- コスト（予算）
- スケジュール（納期）

## プロジェクトの構成要素

### フェーズ

### フェーズゲート

プロジェクトのパフォーマンスや進捗、これまでのフェーズにおけるベネフィットを確認する。  
フェーズゲートでは主に以下の事項を決定する。

- 次のフェーズに進む
- 修正して、次のフェーズに進む
- プロジェクトを終了する
- フェーズに留まる
- フェーズまたはその要素を繰り返す

フェーズゲートでは、明らかにリスクが高いプロジェクトでは開始時に細かくフェーズゲートを設定することで、  
プロジェクトにおいて異常が発生していないを確認する。

### プロセス群／プロセス

- 立ち上げプロセス群
- 計画プロセス群
- 実行プロセス群
- 終結プロセス群

## 成果物とは

### スペシャリスト成果物

仕様書や設計書、ソースコードなどのプロジェクトにおいて各専門職が生成する結果のこと。

### マネジメント成果物

プロジェクトを管理する上で必要な成果物のこと  
WBSやガントチャート、課題管理表やプロジェクト報告書など、主にプロジェクトの進行上発生する文書類のこと。

## プロジェクト成功の定義

プロジェクトの成功の指標になるのは生成される成果で`出力`、`結果`、`ベネフィット`の３つが挙げられる。

- 出力（Output）  
  スペシャリストの成果物のこと。
- 結果・成果（Outcome）  
  プロジェクトの出力を利用することから派生した変化のこと  
  例えば、納入したあるシステムによって、ある作業がより正確に実施できるようになったなど。
- ベネフィット（Benefit）  
  出力を利用することで得られた、測定可能な利益のこと。

## プロジェクト・スコープ・マネジメント

プロジェクトやフェーズにおける作業範囲や、成果物の設定に関して定義する。

## プロジェクト・スケジュール・マネジメント

納期管理に関すること。

## プロジェクト・コスト・マネジメント

プロジェクトにて承認された予算に関すること。

## プロジェクト・リスク・マネジメント

リスクとは、プロジェクトに良い影響も、悪い影響も与える事象を指します
ポジティブ・リスク（好機：Opportunity）とネガティブ・リスク（脅威：Threat）の２つ  
リスクは発生した時点で課題：Issueとなる。

## プロジェクト憲章

◇ステークホルダー。

- プロジェクト憲章を認可するスポンサー名
- プロジェクトマネージャ名、またその責任と権限のレベル
- プロジェクトの初期段階でアサイン（任命）されたメンバーリスト

◇目標。

- KPI（業績評価指標。目標の達成度を評価するもの）などの測定可能なプロジェクトの目標や成功基準

◇制約条件。

- 初期段階の要求事項
- 遵守する必要がある納期
- スポンサーなどから承認された予算
- プロジェクトの終了条件

◇その他。

- プロジェクト全体のリスク（経済情勢、業界動向、社会状況などの、プロジェクト単体ではコントロールができないリスク）

## ステークホルダー登録簿とは

各ステークホルダーの個人情報、プロジェクトに対する要求事項と関与度を記載した文書のこと  
適宜更新される必要がある。
SQLSTATE[HY000] [1045] Access denied for user 'test'@'localhost' (using password: YES)の対処

自作したログイン機能でログインしようとした時に"SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)"が出てきたのでメモ代わりに投稿します。

#前提：権限を付与するとエラーが出る

```
 grant all privileges on database_name.* to 'root'@'localhost';
```
"ERROR 1034 (HY000): Index for table 'db' is corrupt; try to repair it"というエラーが出ました。

#①テーブルを修復
```
repair table user;
```
という調子でデータベース内のテーブル全てを修復します。

#②もう一度権限を付与
```
 grant all privileges on database_name.* to 'root'@'localhost';
```
これで私の場合はうまくいきました。どなたかのお役に立てると幸いです。
RFC emaillバリデーション


```ruby
 #不備メアド  理由     
 h-1.k-4.@  @前の記号     
 zkl.106.302.@  @前の記号     
 gaboratory.u.s.a.@  @前の記号     
 k.t_0807_@  @前の記号    RFC違反ではない 
 rspone/fine@  使用不可記号    RFC違反ではない 
 hiro.0308-_-@  @前の記号＆記号の連続使用    RFC違反ではない 
 taeko.iwahashi.@  @前の記号     
 t_h_@  @前の記号    RFC違反ではない 
 t496y519k018...@  @前の記号＆記号の連続使用     
 yu.ya.to.mi.@  @前の記号     
 akn-szn-sck-hdk...@  @前の記号＆記号の連続使用      h-1.k-4.@ 
 zkl.106.302.@ 
 gaboratory.u.s.a.@ 
 k.t_0807_@ 
 rspone/fine@ 
 hiro.0308-_-@ 
 taeko.iwahashi.@ 
 t_h_@ 
 t496y519k018...@ 
 yu.ya.to.mi.@ 
 akn-szn-sck-hdk...@ 
```

なメアドにバリデーションを引っかからせたい


`URI::MailTo::EMAIL_REGEXP`で定義されているところから、ダメな文字の`/`を抜いて、@の前に記号が入らないように書きました

```ruby

[4] pry(main)> URI::MailTo::EMAIL_REGEXP
=> /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/
```

```ruby
/\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]{0,63}[a-zA-Z0-9]@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z]/
```
[作成URL regulex](https://jex.im/regulex/#!flags=&re=%5CA%5Ba-zA-Z0-9.!%5C%23%24%25%26'*%2B%5C%2F%3D%3F%5E_%60%7B%7C%7D~-%5D%7B0%2C61%7D%5Ba-zA-Z0-9%5D%40%5Ba-zA-Z0-9%5D(%3F%3A%5Ba-zA-Z0-9-%5D%7B0%2C61%7D%5Ba-zA-Z0-9%5D)%3F(%3F%3A%5C.%5Ba-zA-Z0-9%5D(%3F%3A%5Ba-zA-Z0-9-%5D%7B0%2C61%7D%5Ba-zA-Z0-9%5D)%3F)*%5Cz)


だけど実際`/`はRFC違反の記号じゃないみたい
ドットの連続が違反らしい

```三浦さんより
@ の前が、最大64文字
@ の後ろが、最大253文字
全部での最大が、最大254文字
ですね。
```

## 結局
なので結局どうなったかというと
バリデーションは
1, `URI::MailTo::EMAIL_REGEXP`を使う
2, `URI::MailTo::EMAIL_REGEXP`でチェックできてない、一文字目のドット、連続ドット、@直前のドット の3つを弾くように追加

## 追加バリデーションについて
```ruby
value =~ /^[.]/ #一文字目のドット禁止
value =~ /\.{2,}/ #連続ドット禁止
value =~ /(?<=\.)@/ #@直前のドット禁止 #肯定後読み
```
こんなURLは全弾きされます

```ruby

.??..@aa.com
```

-------
Qiita でまとめてくれている人がいました。
[RFC 5322 & 5321に沿ったメールアドレス（local-part）に使える文字まとめ](https://qiita.com/yoshitake_1201/items/40268332cd23f67c504c)

肯定後読み参考url
[こんどこそわかる(肯|否)定(先|後)読み](https://qiita.com/tohta/items/2ba7ecde5636b38ef1f6)
[直後に～がある文字列、直後に～がない文字列、にパターンマッチさせる正規表現](https://takuo4649design.com/weblog/note/archives/4705)
【Windows10】TortoiseGitのインストール～日本語化までの方法

##【開発環境】
Windows 10 HOME 64-bit

Git-2.27.0-64-bit
TortoiseGit 2.10.0.2 - 64-bit
TortoiseGit-LanguagePack-2.10.0.0-64bit-ja

##【はじめに】

ローカルの開発環境にTortoiseGitのインストールから日本語化までの手順を記載します。
だいたいこんな流れで。



[gitのインストール](#gitのインストール) 
[TortoiseGitのインストール](#tortoisegitのインストール) 
[tortoisegit日本語パッケージのインストール](#tortoisegit日本語パッケージのインストール) 


#gitのインストール

下記のサイトからインストーラーをダウンロード
[https://gitforwindows.org/](https://gitforwindows.org/)

(2020/07/22現在　最新バージョンは、Gitfor Windows Version 2.27.0)
![0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/ac76de8e-7106-0b30-4574-15d3639f407d.jpeg)

詳細な設定は下記を参考にしました。
[TortoiseGitのインストール方法(日本語化まで)@Windows](https://qiita.com/Shi-nakaya/items/43c858ea707770c03b17)


#TortoiseGitのインストール

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/92c3e30c-e797-5846-b327-a52a237e9860.jpeg)


![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/8b14fe9a-91ee-aee1-c281-b204d2d0db9d.jpeg)

ダウンロードしたインストーラを起動。

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/65a91bc5-b8f9-a5be-f901-77c5a574aa74.jpeg)

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/fbdde4a7-ba08-d6aa-cf09-ac39a967c30e.jpeg)


インストール場所の変更の必要がなければそのまま[Next]をクリック

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/d9c469af-6d34-b00a-ea64-2824c52b0099.jpeg)


![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/5b02b81a-a585-4e55-5b24-82c2e99b7bd7.jpeg)




#tortoisegit日本語パッケージのインストール

同じページで下の方に行くと「 Language Packs」があります。
その中で日本語のパッケージをダウンロード。
(2020/07/22現在　最新バージョンは、TortoiseGit-LanguagePack-2.10.0.0-64bit-ja)

![6jpn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/b3c15469-4245-7434-2142-3a2938d74508.jpeg)

ダウンロードしたインストーラを起動。

![7jpn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/36b06efa-149e-c4c7-c351-8a4018f80766.jpeg)

![8jpn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/326d54b4-640f-9b32-eb4b-2e698b326630.jpeg)

ここは基本的に全て「OK」のままで問題ありません。



![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/2b573954-889c-aba9-a238-24e113ebadfb.jpeg)

インストール完了後に任意のフォルダ、ファイルで

右クリック　→　TortoiseGit →　Setting

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/0b33040b-dc2b-a86d-4276-a48dfcf9f0c7.jpeg)

General →　Language　→　日本語　を選択して「OK」。

![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/376daec9-c3ae-7110-d51e-b67b7f976710.jpeg)

ちゃんと日本語になっています。
実践で覚えるVue.js(Vuetify) その１

## 概要
####私は、考えるより手を動かすタイプだ

という方向けにチュートリアルなどを使用しながら、
Webアプリケーション開発していく方法を書いていきたいと思います。

## ターゲット層

 - 考えるより感じたいという方
 - JavaScriptを始めてみようかなと考えている方
 - 開発業務に携わったことがない方

## 使用エディタ
Visual Studio Code

これからVisual Studio Codeを使用していきたいが、
インストールしていないという方は、
インストール手順をググってみてください。
※スクリーンショットがあるサイトが見やすいと思います。

※事前にVSCodeにお好みで拡張機能を入れておくと楽になります。
[VSCode+Vue.jsを使用するならインストールするべき拡張機能と設定](https://iwb.jp/vscode-vuejs-extensions-install-settings/)
[Vueの開発におすすめなVSCodeの拡張機能を紹介！！](https://b1tblog.com/2019/10/17/vue-vscode-addons/)

## 事前準備

 - Node.jsのインストール

以下の記事を参考にしてみてください。
[windows10にNode.jsをインストールする](https://qiita.com/Masayuki-M/items/840a997a824e18f576d8)

 - VSCodeでGit Bashをターミナルに設定する※私がLinuxコマンド使い慣れているため

以下の記事を参考にしてみてください。
[WindowsのVSCodeでGit Bashをターミナルに設定する](https://qiita.com/psychoroid/items/63cc0ece70fce0f0cfc0)

##実践その１（Vue.js・Vuetifyのインストール）

###バージョン確認
```Bash:ターミナル
node -v
v12.16.2
※これは私が使用しているNode.jsのバージョンです。

npm -v
6.14.4
※これは私が使用しているNode.jsのバージョンです。
```

###Vue.jsインストール
以下を参考にさせていただいております。
[Vue.jsについての基礎(インストール)](https://qiita.com/watataku/items/26f2ce546fcd562e4b46)

```Bash:ターミナル
#インストール
npm install -g vue-cli

#バージョン確認
vue -V
→バージョン情報が表示されること
```
##実践その２（プロジェクト作成）

以下を参考にさせていただいております。
[Vuetifyをインストールして使ってみる](https://qiita.com/reflet/items/88dc298c8887ad517845)

```Bash:ターミナル
#プロジェクトを作成するディレクトリにcdしてから実行してください
#作成に時間がかかります。。
vue create vue-project

? Please pick a preset: Manually select features
? Check the features needed for your project: 
>(*) Babel
 ( ) TypeScript
 ( ) Progressive Web App (PWA) Support        
 (*) Router
 (*) Vuex
 ( ) CSS Pre-processors
 (*) Linter / Formatter
 ( ) Unit Testing
 ( ) E2E Testing

? Check the features needed for your project: Babel, Router, Vuex, Linter
? Use history mode for router? (Requires proper server setup for index fallback in production) No
? Pick a linter / formatter config: Basic
? Pick additional lint features: Lint on save
? Where do you prefer placing config for Babel, ESLint, etc.? In package.json
? Save this as a preset for future projects? (y/N) N

#作成したプロジェクトディレクトリへ移動
cd vue-project

#プロジェクト実行
npm run serve

#以下URLへアクセス
http://localhost:8080/ 

→Vueのロゴページが表示されていること
```
###Vuetifyインストール

```Bash:ターミナル
#現在位置確認
pwd
→vue-projectにいること

#Vuetifyインストール
vue add vuetify

? Choose a preset: Default (recommended)

#Vuetify反映確認
npm run serve

#以下、URLにアクセス
http://localhost:8080/

→Vuetifyロゴページが表示されていること
```


##まとめ

Vue.js・Vuetifyの記事は、ググれば色々と出てきます。
個人的には、公式サイトがおすすめです。

[Vuetify公式サイトクリックスタート](https://vuetifyjs.com/ja/getting-started/quick-start/)

次回は、Vuetify公式にあるレイアウトを使用していきたいと思います。

[Vuetify公式サイトレイアウト](https://vuetifyjs.com/ja/getting-started/pre-made-layouts/)

[実践で覚えるVue.js(Vuetify) その２](https://qiita.com/tomotomo3/items/0add9b30caa001d03d85)

以上
create-react-appでの作成時の、eslintのunable to resolve path to module への対応


.eslintrcに下記のように追記する。特に何かをimportする必要はない。

```.eslintrc
module.exports = {
  ...,
  settings: {
    'import/resolver': {
      node: {
        extensions: ['.js', '.jsx', '.ts', '.tsx'],
        paths: ['./src']
      }
    }
  },
}
```
CocoaPodsを含むXcodeプロジェクトがビルドできない時

あるWebサイトからXcodeのサンプルワークスペースをダウンロードし、手元の環境でビルドしようとしたが失敗した。
エラーを調べるとワークスペースに含まれるCocoaPodsが手元のXcodeのバージョンではうまく参照できていないないようだった。
そこでCocoaPodsを再取得したところ現在のビルドできるようになった。その手順を以下に示す。
（全てのケースで上手くいくとは限らないが参考までに）

- プロジェクトのディレクトリは以下のようになっているはず。この時、Sample.xcworkspace をXcodeで開いてもビルドできなかった。

```
% ls -l
total 16
-rw-rw-r--@  1 koki  staff  314  8  8  2018 Podfile
-rw-r--r--   1 koki  staff  386  8  8  2018 Podfile.lock
drwxr-xr-x   9 koki  staff  288  8  8  2018 Pods
drwxrwxr-x@ 11 koki  staff  352  9 25  2018 Sample
drwxrwxr-x@  5 koki  staff  160  8  8  2018 Sample.xcodeproj
drwxr-xr-x@  5 koki  staff  160  8  8  2018 Sample.xcworkspace
```

- サンプル作成時、`pod install` コマンドによって追加されたはずであるファイルを削除する。

```
% rm -rf Podfile.lock Pods RxSample.xcworkspace
% ls -l
total 16
-rw-rw-r--@  1 koki  staff  314  8  8  2018 Podfile
drwxrwxr-x@ 11 koki  staff  352  9 25  2018 Sample
drwxrwxr-x@  5 koki  staff  160  7 22 12:47 Sample.xcodeproj
```

- CocoaPodsを再取得する

```
% pod install
% ls -l
total 16
-rw-rw-r--@  1 koki  staff  314  8  8  2018 Podfile
-rw-r--r--   1 koki  staff  386  7 22 12:47 Podfile.lock
drwxr-xr-x   9 koki  staff  288  7 22 12:47 Pods
drwxrwxr-x@ 11 koki  staff  352  9 25  2018 Sample
drwxrwxr-x@  5 koki  staff  160  7 22 12:47 Sample.xcodeproj
drwxr-xr-x@  5 koki  staff  160  7 22 12:48 Sample.xcworkspace
```

以上の手順を実施した後、Sample.xcworkspace をXCodeで開くとビルドが成功するようになった。
Laminas 環境設定メモ

## Laminas
zendが新しくなったらしいので
早く日本語訳の本出てください。

- mac
- VirtualBox
- centos8
- Laminas


つまずいた所メモ

↓とりあえずやる。
https://docs.laminas.dev/tutorials/getting-started/skeleton-application/



なんか、500になる。
ネットワーク設定が悪いのかなっと思い、
.httpd.confと.htaccessをいじる。
(httpd.confでdocumentrootとか分けられたんだね・・・分け方が分からずVirtualBoxで分けてた)

できない。_:(´ཀ`」 ∠):

public/index.phpの上のほーにexit入れてみる。
表示できた。(°▽°)

もももも、もしかして、コードがおかしい？
public/index.phpにexitをひたすら入れる。

RuntimeExceptionのとこでエラー
分からん。

プロジェクトを作り直してみた。なんかエラー出ててた。
RuntimeException.phpがなんとか。ない？とかなんとか(忘れました。


## 結果
composerでライブラリが読めなかったらしい。
composer.jsonがある場所で、

```shell
$ composer clear-cache
$ composer update --no-plugins
```

できた。


## 追伸
なんで拡張子がphmlなの・・・？
初めてみたんだけれど、
ググったらめっちゃ古いよって見たんだけど？
これ、今年発表されたフレームワークなんだよね？
試しに拡張子phpにしたらエラーがすごいんだけど？
推奨されてるのかなぁ・・


## 参考
・[composer installでCould not deleteといわれ、clear-cacheしてもなおらないときはcomposer update --no-pluginsをする](https://scrapbox.io/kadoyau/composer_install%E3%81%A7Could_not_delete%E3%81%A8%E3%81%84%E3%82%8F%E3%82%8C%E3%80%81clear-cache%E3%81%97%E3%81%A6%E3%82%82%E3%81%AA%E3%81%8A%E3%82%89%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D%E3%81%AFcomposer_update_--no-plugins%E3%82%92%E3%81%99%E3%82%8B)
【メモ】bundle installとupdateの違い

#bundle install しようとすると bundle updateしてくれと怒られた。

調べたところ・・・

```terminal:ターミナル
$ bundle install #bundle　に省略可能
```
Gemfile.lockの内容をbundle install前と比較し、更新されているgemのみをインストールする

```terminal:ターミナル
$ bundle update
```
Gemfile.lockの内容を無視して全てのgemをインストールする

---
以上！
コミットの取り消しとファイルを元に戻す方法

#コミットの取り消し

####直前のコミットをなしにするには

````
git reset --hard HEAD^
````
・`--hard`は編集しファイルごとコミットが戻る
・`--soft`は変種したファイルはそのままでコミットだけが戻る
・`HEAD^`は直前のコミットという意味



####N番目のコミットに戻りたい場合は
git reflogで戻りたいコミット履歴を確認して、
git reset --hard HEAD@{number}で任意のところまで元に戻す 

````
username@mbp% git reflog
c48b6ef HEAD@{0}: commit : HTMLファイルを編集
3927a69 HEAD@{1}: commit : HTMLファイルを編集

username@mbp% git reset --hard HEAD@{1}
HEAD is now at 3927a69 CDNを消してnpmを追
````
#最後に
もし、間違って--hardでファイルごと
一つ前のコミットの状態に戻っても
これでreflogとresetで任意のコミットまで戻ることができるようになりました！
たとえ、間違えても落ち着いて対処しましょう！！
Raspberry Pi と Fluent Bit を使ってSyslogをAzure Log Analytics に集約する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576356/fb6d6200-1fc4-2775-93d0-09a02062f81d.png)


Raspberry Pi と Fluent Bit を使ってSyslogをAzure Log Analytics に集約する仕組みを作ります。

# 背景
LAN内のSyslogを収集してLog Analyticsへ転送する仕組みとしてOMSエージェントが提供されていますが、OMSエージェントはARMベースのCPUに対応していないためRaspberry Pi にインストールすることができません。
OMSエージェントの代替としてLog Analyticsへ転送する仕組みが組み込まれたFluent BitをRaspberry Pi へ導入、セットアップを行います。
これによりLAN内のSyslogをLog Analyticsへ転送する仕組みを簡単かつ低コストで実現します。

# 手順
Ansibleを使います。

##事前準備
### Raspberry Pi セットアップ
1. Raspberry Pi Imager を用いてUbuntuServer64bitをインストールします。
2. 一度SSHにてログインしパスワードを変更します。例：Password123!

セットアップで準備する情報

| 名前       | 値 |  例 |
|-----------------:|:------------------|:------------------:|
| IPアドレス             |               |192.168.0.200         |
| ユーザ名        |      ubuntu |       default       |
| パスワード          |        ???? |  Password123! |

### Ansible実行環境
macosの場合はbrew install等を使ってAnsibleをインストールします。

### Gitクローン

```
https://github.com/mochizukithr/oms-agent-raspberry-pi.git
```

### インベントリファイル編集
hosts.example を参考にhostsファイル(インベントリファイル)を作成します。

```
[pi]
192.168.0.73<事前準備で確認したIPアドレスに書き換える>

[all:vars]
ansible_ssh_port=22
ansible_ssh_user=ubuntu
ansible_ssh_pass=Password123!<事前準備で確認したパスワードに書き換える>

Customer_ID=<Log Analytics画面にて確認>
Shared_Key=<Log Analytics画面にて確認>
```

### Fortigate設定
Fortigateにてsyslogの設定を行います。
[log syslogd override-setting](https://help.fortinet.com/cli/fos50hlp/56/Content/FortiOS/fortiOS-cli-ref-56/config/log/syslogd%20override-setting.htm)を参考に設定を行います。

ポイントは```legacy-reliable```をEnableとし、ログの出力形式をRFC3195形式にします。
Fluent BitのParserにてsyslog-rfc3164を設定しているので、この設定をしないと処理できません。

```
FGT60D (override-setting) # set mode legacy-reliable
```


最終的に以下のような設定とします。

```
 # get log syslogd override-setting
override            : enable
status              : enable
server              : 192.168.0.73
mode                : udp
port                : 514
facility            : local7
source-ip           :
format              : default
```


## 構築
次のコマンドを実行します。

```
% ansible-playbook -i hosts site.yml
```

数分後、Log Analyticsのログ画面を確認するとFortigateのログが記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576356/3ec10f15-1a9b-7774-e85a-a50a562e42d8.png)

# トラブルシューティング
Log Analyticsにログが記録されない場合はRaspberry Pi の ```/var/log/syslog```を確認してください。
Fortigateから送られてきたログの処理状況やLog Analyticsへの送信状況がログとして記録されています。

# 編集後記
そもそもはCisco CatalystのログをLog Analyticsに送信するのを目的に始めたけど、Catalystのログはsyslog-rfc3164に準拠していなかったため諦めた。やる気になったらそのうちパーサー書くかも。

#参考URL
https://medium.com/@1.luigibruno/raspberry-pi-cloud-data-logging-on-azure-with-fluent-bit-b1efaccdc3f7
UE4プロジェクトに日本語名のファイルが含まれてSystem.ArgumentExceptionエラーになる時の対応方法

## 発生した現象

gitから取得したUE4.25.1のプロジェクト起動時のビルドで以下のようなエラーが発生した。
プロジェクトのContent/Hoge/には日本語名のuassetファイルが含まれている。

```text
?n???h???????Ă??Ȃ????O: System.ArgumentException: Path fragment '"Content/Hoge/\351\203\250\347\224\250.uasset"' contains invalid directory separators.
```

## 対応方法

[System.ArgumentException: Path fragment '"Content/\351\237\263\351\242\221/Cheetah\302\240Mobile_Games_-_\...\265.uasset"' contains invalid directory separators. - UE4 AnswerHub](https://answers.unrealengine.com/questions/751683/systemargumentexception-path-fragment-content35123.html)を参照

コマンドプロンプトで以下を実行する。
※ UE_4.25\Engine\Source\Programs\UnrealBuildTool\System\SourceFileWorkingSet.csを確認するとUnrealBuildToolで使うgitコマンドはPATHで設定されているもののようだった。

```bash
git config --global core.quotepath false
```
【確率雨量】100年に1度の大雨ってどうやって計算しているの？　―第4回　ガンベル・チャウの方法―

# 移転のお知らせ

こちらの記事は下記のサイトに移転しました。

> [NNテックブログ](https://nnhiroba.xsrv.jp/nnTechBlog/Article/Article?ID=28)
HTML label内で任意に改行する

# Label 内で任意に改行したい！
Label 内で br タグを入れても改行されないので、改行する方法を調べたので忘備録として残しておきます。

## css の white-space を使う
https://developer.mozilla.org/ja/docs/Web/CSS/white-space
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108113/b37f7cb6-cc12-f028-67fe-cbf7f83856d0.png)

### pre-line と 改行コードで任意改行
```css
label.br-label {
    white-space: pre-line;
}
```
```html
<label class="br-label">改行を
含むラベル</label>
```

CSS は便利ですね！

## ブラウザーの互換性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108113/c0a42de9-d173-5980-fe6a-753ea4a43652.png)
ssh でgithub登録

## sshの公開鍵をgithubに登録する方法
ssh接続を行い、githubのリポジトリをクローンしようとしたとき、authenticate_errorが起こった。
以下の参考記事から解消した。
http://tusukuru.hatenablog.com/entry/2018/08/29/021651
Railsでアプリケーションを起動する際にffiのインストールに失敗した時の対処法

Ruby on RailsでRailsのバージョンインストールには成功したものの、Railsのアプリケーションを起動した際に以下のようにffiのインストールに失敗しました。
その際に行なった対処法を残しておきます。

# エラーメッセージ
```
An error occurred while installing ffi (1.13.1), and Bundler cannot continue.
Make sure that `gem install ffi -v '1.13.1' --source 'https://rubygems.org/'` succeeds before bundling.
```

# 原因
おそらくMacOSのMojave環境に原因があるらしいです。
原因としては、HomebrewでRubyをインストールするとどうやらffiが無いそうです。

# 解決方法
まず、ffiがないのでMojave用のlibffiを再インストールします。以下の方法で再インストールします。

```
brew reinstall libffi
```

ただ、現状ではlibffiのパスが見えない場所にあるので指定します。

```
export LDFLAGS="-L/usr/local/opt/libffi/lib" && \
export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig" && \
bundle install
```

これでffiのインストールエラーがなくなりrailsのアプリケーションが起動できました！

# 参照記事
- [Ruby-ffi install error on Mac OSX 10.14](https://github.com/github/personal-website/issues/7)
- [Homebrew でインストールした ruby で ffi を使う場合には pkg_config のパスを指定しなければいけない](https://hawksnowlog.blogspot.com/2019/05/homebrew-ruby-ffi-pkgconfig.html)
Firestore WriteBatch.commit() で特定の FieldValue を含むデータと件数制限について

# 500レコード以下でも件数制限に引っかかる時がある。
Firebase Firestore のトランザクション書き込みには最大500レコードまでしか同時に書き込めません （執筆時時点。

500レコードをこえるデータを書き込もうとすると、 
```
maximum 500 writes allowed per request
```

というエラーが返されます。

一方 500 レコード以下の書き込みでも、上記のエラーになることがあります。
`serverTimestamp` 、`arrayUnion`、 `increment` などのフィールド変換のデータを含むときです。

# 理由
ドキュメントに書いてある
https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja#batched-writes

つまり、`serverTimestamp` 、`arrayUnion`、 `increment` などのフィールド変換は 1件 として計上されるので、
たとえば、

```
{
 updatedAt:  admin.firestore.FieldValue.serverTimestamp()
 title: 'foor'
}
```

みたいなデータの書き込みは 2レコードの書き込みとして計上されてしまいます。
同様のデータを251件書き込もうとするとエラーになってしまうわけです。

# まとめ
ドキュメントにもあるので、知らなかったお前が悪いというのはそのとおりなんですが、、、、
壮大にハマったので誰かのためになればいいなと思い書いときます。

https://github.com/firebase/firebase-admin-node/issues/456#issuecomment-464187898
にもあるとおり、中の人も 「ごめん、むりだ。その代わりドキュメントに書いとくYO」 といっているので、バグではなく仕様ですね。
githubから特定のファイルだけダウンロードする方法

作業中何故か特定のファイルだけ削除してしまったので
gitからそこだけダウンロードしたので方法を記録。
#terminalでwgetコマンドを使う
###githubを開く
github内で該当ファイルを開き、右上にある｢Raw｣ボタンを押す。

すると中身のコードが記述された画面が表示されるので
そのページのURLをコピーする。

###terminalを開く
$wget [コピーしたURL] -P [保存先URL]

これでカレントディレクトリに該当ファイルをダウンロードできる。
![スクリーンショット 2020-07-22 15.10.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634043/87941fcf-3365-2a94-8d09-edd7863e50b3.png)

▼wgetオプションによる保存先指定
https://orebibou.com/ja/home/201610/20161020_002/


この方法だとフォルダごとのダウンロードは不可。
svnを利用した方法などがあるようですがそれは後日追記することにします。
Web会議で手書きのアイデア伝えたくないですか？

## はじめに

みなさん、こんにちは。
Web会議してますかー？(^o^)/

Web会議してるときに、どうしても「書いたもの」で伝えたくなることってないですか？

僕はオフライン会議でも、アイデアを共有するときは「手書き」で伝えたい派なんですよねー。（そんな派閥があるのか？（笑))

急にテレワーク、Web会議が広まって、今まで手書きで共有してきた情報がかなりやりづらくなった気がします。。。

## 調べてみると
やはり、すでにすごいアプリがありますね！

Microsoft社製のWhiteboard
https://www.microsoft.com/ja-JP/p/microsoft-whiteboard/9mspc6mp8fm4?activetab=pivot:overviewtab

すごいですよねー！
オンラインで共有しながら使えるみたいですよねー！！！

裏側の仕組み、どんななってるんだろーって興味深々です。

ただ、僕はもっとシンプルなものが欲しかったんです。。。

で、調べるのも面倒なので

**自分で作ろう！**

と思いました☆彡

## ホワイトボードアプリ、その名も

**HAKUBAN**
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639318/01c8fc19-c086-b7f3-f810-f34fa31380eb.png)

https://www.microsoft.com/ja-jp/p/hakuban/9nmp2xjbshsg#activetab=pivot:overviewtab

## ポイント

* 起動したら速攻書ける！
* 「Save」で画像として保存できる！
* 「Load」で画像を読み込める！
* 「Clear」で一気に全部消える！

ボタンにはそれぞれショートカットが割り当てられています。

保存するときのファイル名は、[hakuban_2020-07-22_14-49-27.gif]のように毎回、秒までの名前が初期表示として出ます。

なので、
1. 書く！
2. Ctrl+sからのエンター連打！
3. Ctrl+cでクリア！
4. また書く！
5. 以降ループ
とすることにより、アイデアをどんどん画像化できます(^.^)

このアプリは、別途のアカウントは不要ですし、クラウドに保存することもありません。
シンプルにサクサク使えることを目指しました。
ペンタブやタッチ対応画面があると良いかもしれません。
（マウスでも書けますが、厳しいです。。。。(^^;)

もしよければ試してみてください(^o^)

みなさんのWeb会議が、もっともっとスムーズになることの一助になれば幸いです。

## 最後に
今回初めてUWPで作ってみました。
Androidアプリを作ったことがある人なら、UWPで作ろうとしたら「あー、なるほどなー」ってなると思います。

アプリを作るよりも、開発者登録やアプリ登録が大変でした。。。
アプリ登録して審査されたときに、2日くらいかかったんですよ。
で、公開できたってメールきたー！と思ったら

**Fail**とのこと。。。
内容は、あなたのアプリはMixed Realityに対応しているって申請しているのに、対応してなくね？みたいなやつでしたｗ

英語の画面だったんでよくわからなかったんですが、サポートチームに連絡したら丁寧に教えてくれました！！（英語でのメールできるようにがんばろう、とも思いましたｗ

ではでは！
オブジェクトに昇順のIDをつけたい

※簡単なTodoリストの作成過程において自分用メモです。
間違い等ございましたらご指摘お願いいたします。
<br>
#目的
Todoのアイテム（オブジェクト）を作成する際、それぞれのアイテムに数字のIDを昇順で持たせます。
ローカルストレージからオブジェクの配列を呼び出す場合は、IDの最大値+1からIDをつけていきます。

```javascript

//イメージ
taskItems=[{
  id : 1,
  name : 'タスク１',
  completed : false,
},
{
  id : 2,
  name : 'タスク2',
  completed : false,
},
{
  id : 3,
  name : 'タスク3',
  completed : true,
},]
```



#方法

変数taskId=1を定義し、classで定義したタスクのひな形で新しいタスクを作る度にtaskIdが+1になるようにします。

```javascript
let taskId = 1;

class NewTask {
    constructor(task) {
      this.id = taskId++;
      this.name = task;      
      this.completed = false;
  }
}
```
<br>

##ローカルストレージから配列を呼び出す場合について

呼び出した配列の要素数が1以上の場合は一番大きいidを検索して+1します。
配列が空の場合は初期値は1とします。

```javascript
//ローカルストレージからデータの取得するための関数
function loadStorage() {
    let getJson = localStorage.getItem('kye');
    return JSON.parse(getJson);
  }
}

//ローカルストレージにデータがあれば取得
  if (loadStorage()) {
    const localStorageDate = loadStorage();
    taskItems = localStorageDate;
    //taskItemstが空でなければtaskIdは最大値+1、空の配列なら1、
    taskId = taskItems.length
      ? Math.max.apply(null, taskItems.map(task => task.id)) + 1
      : 1;
  }
```
Math.max ()は与えられたそれぞれの引数の最大値を1つ返します。
可変長引数の関数であるため、配列を渡せないのでapplyを使用。
ES2015 以降ならスプレッド演算子(...)を用いて個々の値に分解することも可能です。

applyはオブジェクトの関数を呼び出し、第1引数で関数配下のthisの参照先を変更できます。
nullを渡した場合は暗黙的にグローバルオブジェクトが渡されたものとします。
第2引数にtaskItemsの要素のidを配列にしたものを渡すため、mapを使用します。
mapは配列の要素をコールバック関数で順に加工し、最終的にできた新しい配列を返します。

```javascript
Math.max.apply(null, taskItems.map(task => task.id)) + 1
```
これにより、taskItemsの要素ごとのidで配列を作成し、最大値を検索して+1することができます。
【Vagrant】Laravel homesteadでVagrantUpができない。

メモとして残します。

よくわかりませんが、`vagrant up`したらエラーが出て起動できなかったため、
私が解消した方法をメモ。


#エラー内容
```
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.
```
#解消方法
VirtualBoxが認識できていないようだったので、私はVirtualBoxをアンインストール→インストールでエラーを解消できました。