OmniAICreator/Qiita-1.07M huggingface dataset:
オプティマイザ統計についてメモ

# 2種類のオプティマイザ
- CBO(コストベースオプティマイザ)
 - オプティマイザ統計からコストを計算して、最少コストの実行計画を決定すること

- RBO(ルールベースオプティマイザ)
 - SQL文のルールによって実行計画を決定すること
 - 現在のバージョンでは使用されていない

# オプティマイザ統計の内容
- テーブル統計
 - 行数、ブロック数、平均行数など
- 列統計
 - カーディナリティ、NULLの数、最小値、最大値、ヒストグラムなど
 - ヒストグラムを取得しないと最小値と最大値で出た分布を均一とする
- 索引統計
 - リーフブロック数、ツリーの高さ、クラスタ化係数などの索引の有効性など
- システム統計
 - CPU性能、IO性能など

データ分布について例
https://www.oracle.com/technetwork/jp/database/articles/tsushima/tsm05-1598251-ja.html

# オプティマイザ統計を取得するときの考慮事項
## DBMS_STATSパッケージを使用する
　　ANALYZEコマンドは下位互換。
　　DBMS_STATSパッケージにより、効率的な収集と履歴管理が実施される。
## オブジェクトごとに適切な収集頻度がある
　　オブジェクトに対する変更量とオプティマイザ統計が不正確になるレベルによって収集頻度を決定する。
　　静的データに無駄な収集をかけないこと
　　一時表や揮発性の高いデータを格納するテーブルは、事前の統計情報収集が難しいため、
　　SQL解析時に統計情報取得が行われる動的サンプリングにて対応。
　　その他は自動オプティマイザ統計にて実行。
　　ただし、収集時間帯から外れたタイミングでメンテナンスや大量のデータ更新がある場合は、
　　そのあとに手動で取得を行うこと
## テーブルは適切なサンプルサイズを設定する
　　テーブルのオプティマイザ統計の際は、ソート処理が行われ、大規模テーブルではかなり時間がかかる。
　　サンプルサイズを指定することで、サンプリングして統計取得ができる。（通常は5%程度で問題なし）
　　10gからはデフォルトで、estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE
　　（オブジェクトの行数見積に依存しサンプリングサイズを決める）であり、そのままでだいたいOK。
## 索引は完全な統計で取得する
　　索引はソート済になっていて、ソート処理が不要のため、完全収集（100%）をする。
　　10gからは索引の作成時や再構成時にオプティマイザ統計が自動収集される。
　　DBMS_STATSパッケージのパラメータもデフォルトは、cascade=>DBMS_STATS.AUTO_CASCADEであり、
　　索引の統計を収集するかどうかとその際の最適なサンプルサイズは、Oracleにて決定する設定となっている。
## データに偏りがある列はヒストグラム統計を使用する
　　データの分布に偏りがある列をWHERE句に指定した場合、値によって適切な実行計画が異なる可能性があるため、
　　データの偏りについての統計であるヒストグラム統計を取得するのが有効。
　　10gR2よりDBMS_STATSパッケージのパラメータはデフォルトでmethod_opt=>'FOR ALL COLUMNS SIZE AUTO'であり、
　　ヒストグラム統計を取得することが有効な列とヒストグラム統計を取得する際のバケット数をOracleが自動判定する。
　　（バケット：列のデータを振り分けるバケツのようなもの。多いほどデータの正確な振り分けが可能）
　　WHERE句に複数の列を指定する場合は、複数列の統計を取得することも可能

# もしもパフォーマンス劣化してしまったら
　オプティマイザ統計を使用してもパフォーマンスが劣化した場合は、以下を検討すべき。
　1. 劣化前のオプティマイザ統計の戻す
　　劣化前のオプティマイザ統計に戻して、統計情報をロックする。
　　オプティマイザ統計の履歴テーブル(dba_tab_stats_history)を確認して、
　　DBMS_STATS.RESTORE_TABLES_STATSを使用してリストアする。
　2. 正確なオプティマイザ統計を収集する
　　サンプルサイズを完全にして、オプティマイザ統計を収集する。
　　オプティマイザ統計の取得に時間がかかるようであれば、サンプルサイズを少しずつ小さくして調整する。
　3. ヒント文を使用して問題を回避する
　　劣化前後の実行計画を比較して、改善ポイント（特定の索引を使用している）などがあれば、
　　ヒント文を使用して、実行計画を改善する

# 実行計画を変えないという選択
　収集するオプティマイザ統計により実行計画は変化してしまうため、変えたくない場合もある。
　その場合は、ヒント句を使用する。
　埋込SQLなどヒント句を使用できない場合は、プラン・スタビリティを使用する。
　プラン・スタビリティ：実行計画を実現するためのアウトライン「後で埋め込むためのヒント文の集まり」を作成して、実行時にSQL文にアウトラインを埋め込んでくれる
　データ分布があまり変わらない場合に実行計画の固定は有効
　SQL実行計画管理（SPM）が11gより使用でき、ベースラインに設定した実行計画と比較して、
　それよりも効率的でない場合は、ベースラインを使用するようにすることもできる。
　
# Tips
## 自動オプティマイザ統計情報取得
　　10gより追加された機能。以下のオブジェクトに関して、オプティマイザ統計を取得する。
　　　・オプティマイザ統計をまだ収集していないオブジェクト
　　　・オプティマイザ統計が最新状態でない可能性のあるオブジェクト（10%以上の行が更新されているオブジェクト）
## 動的サンプリング
　　オプティマイザ統計が不足している場合、SQL文実行時にオプティマイザ統計をサンプリングして実行計画を作成する。
　　初期パラOPTIMIZER_DYNAMIC_SAMPLINGにて設定。デフォルトは2であり、オプティマイザ統計が収集されていないオブジェクトすべてに対して64ブロックのサンプリングアクセスを行う。
#Vue CLI で vue create <project> が使えない (   You may want to run the following to upgrade to Vue CLI 3: )

```
$ vue create vue-project
  vue create is a Vue CLI 3 only command and you are using Vue CLI 2.9.6.
  You may want to run the following to upgrade to Vue CLI 3:

  npm uninstall -g vue-cli
  npm install -g @vue/cli
```

このとおり 

```
  npm uninstall -g vue-cli
  npm install -g @vue/cli
```

を実行してもバージョンが変わらない

# 解決

yarn の vue が入っていたっぽい
yarn で install し直すとバージョンが上がった

yarnを使う場合 (例)

```
yarn global add @vue/cli

which vue
/usr/local/bin/vue

vue --version
@vue/cli 4.3.1
```

npm を使う場合 (例)

```
yarn global remove @vue/cli

npm install -g @vue/cli

which vue
/Users/yumainaura/.nodebrew/current/bin/vue
```

参考

[Vue.js を vue-cli を使ってシンプルにはじめてみる - Qiita](https://qiita.com/567000/items/dde495d6a8ad1c25fa43)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3096











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Qiita APIでQuine投稿(Python)


Quine投稿については **[こちら](https://qiita.com/j5c8k6m8/items/bc2324ef036729da1a28)**

`exec` を使用して、文字列としてquineのコードを書く際のエスケープに、非常に苦労しました。
記事中のコードではダブルクォーテーションと、バッククォートをUnicodeエスケープしています。
より、スマートな方法があれば、是非コメントで教えてください。

[ バージョン情報(`sys.version`) ]
**3.8.2 (default, Apr 23 2020, 14:22:33) 
[GCC 8.3.0]**

# この記事のAPIを実行したコード

``` python:quineRequest.py
authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdi'
z="\\"
escape_def_code = """
def escape(s):
	return s.replace(\u0022'\u0022, z + 'u0027').replace('\u0022', z * 2 + 'u0022').replace('\u0060', z * 2 + 'u0060')
"""
exec_code = """
import sys
import requests
import json
url = 'https://qiita.com/api/v2/items'
headers = {{
    'Authorization': '{0}',
    'Content-Type': 'application/json'
}}
title = 'Qiita APIでQuine投稿(Python)'
body = '''
Quine投稿については **[こちら](https://qiita.com/j5c8k6m8/items/bc2324ef036729da1a28)**

\u0060exec\u0060 を使用して、文字列としてquineのコードを書く際のエスケープに、非常に苦労しました。
記事中のコードではダブルクォーテーションと、バッククォートをUnicodeエスケープしています。
より、スマートな方法があれば、是非コメントで教えてください。

[ バージョン情報(\u0060sys.version\u0060) ]
**'''
body += sys.version
body += '''**

# この記事のAPIを実行したコード

\u0060\u0060\u0060 python:quineRequest.py
authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdi'
'''
body += ('z=\u0022' + (z * 2) + '\u0022')
body += '''
escape_def_code = \u0022\u0022\u0022{1}\u0022\u0022\u0022
exec_code = \u0022\u0022\u0022{2}\u0022\u0022\u0022
exec_exec_code = \u0022\u0022\u0022{3}\u0022\u0022\u0022
{3}
\u0060\u0060\u0060
'''

tag = [{{'name': 'Qiita'}}, {{'name': 'Python'}}, {{'name': 'quine'}}, {{'name': 'QiitaAPI'}}, {{'name': 'quine投稿'}}]
post_data = {{
    'private': False,
    'body': body,
    'title': title,
    'tags': tag,
}}
r = requests.post(url, headers=headers, data=json.dumps(post_data))
"""
exec_exec_code = """
exec(escape_def_code)
exec(exec_code.format(authorization_token, escape(escape_def_code), escape(exec_code), escape(exec_exec_code)))
"""

exec(escape_def_code)
exec(exec_code.format(authorization_token, escape(escape_def_code), escape(exec_code), escape(exec_exec_code)))

```
機械学習による音楽の生成についてまとめてみた

# はじめに

本記事は、音楽を機械学習を用いて自動生成する方法について自分なりにまとめた記事です。

また、**2020年4月に作成した記事を2021年10月に一部修正したのみで内容が古い**ため、読む際はご注意ください。さらに、**現時点で内容の更新予定はなく**、今後に削除する可能性があることもご了承ください。

そして、本記事では浅い部分にしか触れていないため、[A Tutorial on Deep Learning for Music Information Retrieval](https://arxiv.org/abs/1709.04396v2)のような総説論文を読むことを強くお勧めします。

# 音楽の構成要素

まず音楽を生成するためにその構成要素を知る必要があります。

音楽の主な三要素は**メロディー、ハーモニー、リズム**です。メロディーは連続的に音が変化していくこと、ハーモニーは複数の音が重なり合って調和すること、リズムは周期に従って音が変化していくことです。この三要素が複雑に組み合わさっているため、画像などと比べると音楽の生成は非常に難しいと考えられます。

# 音楽のコンピュータ上での扱い

音楽(音声信号)は連続値ですがパソコン上では離散化する必要があります。離散化するために[サンプリング周波数](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E5%91%A8%E6%B3%A2%E6%95%B0)に従ってサンプリングが行われます。

音楽を機械学習する際に問題になるのが計算コストです。一般的な44.1kHzのサンプリング周波数で5分の曲をサンプリングした場合、13230000回のサンプリング情報を扱わなければならず、学習に非常に時間がかかります。

そこで、一般的には[MIDI信号](https://ja.wikipedia.org/wiki/MIDI)をデータとして用います。MIDI信号は、音波の情報ではなく音の高さや大きさや長さなどの情報を保持します。そのため、前者に比べ少ないデータ量で済みます。

しかし、半音ごとの情報しか持っておらず、[微分音](https://ja.wikipedia.org/wiki/%E5%BE%AE%E5%88%86%E9%9F%B3)(半音よりさらに細かく分けられた音程のこと)など楽譜で表すことのできない音楽を表現することができないという問題があります。

# 音楽の入力形式

音楽を機械学習で扱う際にはMIDIデータとすることが多いですが、このMIDIデータをさらにOne-Hotベクトルへと変換して機械学習を行います。また、One-Hotベクトルとはある要素が1でそれ以外は全て0であるようなベクトルのことで、音楽の場合はそれぞれの要素が音階に対応します。

:::note warn
MIDIデータではなく時間-周波数表現のような2次元の表現として音楽を扱う場合もあることに注意が必要です。詳しくはご自身で調べてください。
:::

# 音楽での機械学習の手法

音楽をコンピュータでどのように扱えばいいかわかったので、音楽における機械学習の手法をいくつか紹介します。

### [1] RNN(Recurrent Neural Network)

再帰型ニューラルネットワークと呼ばれるもので、以下のような多層構造となっています。このニューラルネットワークは通常の入力に加え直前の層の出力も入力とするため、時系列データを扱う際に用いることが多いです。

<a href="https://qiita.com/kiminaka/items/87afd4a433dc655d8cfd"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331393/c64023ed-9525-9ae2-0d50-12479c31918e.jpeg" /></a>


### [2] CNN(Convolutional Neural Network)

畳み込みニューラルネットワークと呼ばれるもので、画像の機械学習の際に頻繁に用いられます。画像の機械学習を例にあげると、以下の図のように層ごとに用意したフィルターを通していくことで、順により高次の特徴量を検出していきます。

また、音楽の場合も時間軸で畳み込むことで学習が行うことができますが、長時間の依存関係による特徴量をうまく捉えられず、画像に比べて音楽の学習はCNNでは難しいです。
<a href="https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331393/39668219-1db0-3675-a706-4a2ed873893c.jpeg" /></a>

### [3] GAN(Generative Adversarial Networks)

敵対生成ネットワークと呼ばれるものです。この手法では、生成器と識別器の二つの学習モデルが存在し、生成器ではランダムに偽物のデータが生成され、識別器はそのデータが偽物であるかどうかを判定します。この二つのモデルが競合的な学習を繰り返すことで、本物にそっくりな偽物を生成器が作ることが期待されます。

ただ、生成器と識別器のいずれかが賢くなり過ぎてそれ以上学習が進まなくなる問題(勾配消失問題)が頻繁に起きます。そのため、勾配消失問題が起きないような安定的な学習のための工夫が必要となります。

### [4] DCNN(Dilated Convolutional Neural Network)

従来のCNNでは、畳み込みフィルタが隣合うピクセル同士を要素としたものでした。しかし、これでは局所的な特徴を捉えることができても大局的な特徴を捉えることができません。そこで、DCNNではフィルターの要素の間隔を空けることで大局的な特徴を捉えることに成功しました。また、大局的な特徴を捉えることが重要な音楽において、DCNNは効果的な方法の一つと考えられます。

# まとめ

今回は紹介できませんでしたが、Googleの[Magentaプロジェクト](https://magenta.tensorflow.org)など、音楽生成関連のプロジェクトには様々なものがあります。また、2021年10月現在は限定的な場合でないと実用化が難しいようですが、近いうちにより汎用性の高いモデルが出てくることを願っています。

# 参考

- [Deep Learningを用いた音楽生成手法のまとめ](https://naotokui.medium.com/deep-learning%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E9%9F%B3%E6%A5%BD%E7%94%9F%E6%88%90%E6%89%8B%E6%B3%95%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81-%E3%82%B5%E3%83%BC%E3%83%99%E3%82%A4-1298d29f8101)
Atcoder ProblemsでのVirtual Contestの作成方法(備忘録)

#バーチャルコンテストの作り方
https://kenkoooo.com/atcoder/ に行き、「Virtual Contests」をクリック。
↓
New Contestをクリック。
↓
コンテストの作成画面が出る。
##入力スペースの説明
**Contest Title**: コンテストの名前。
**Description**: コンテストの説明。
**Mode**: モード。NormalとLockoutの二種類ある。Normalが実践形式。Lockoutについては後述。
**Start Time**: 開始時刻。真ん中は時間、右は分。分は5分単位で変えられる。
**End Time**: 終了時刻。
**Expected Participants**: 後述。
**Problems**: 問題の一覧。問題の名前で検索して追加する事も出来る。
**Bacha Gacha**: 後述。
## Bacha Gachaについて
Bacha Gachaは、難易度を指定してランダムに問題を選択し、追加してくれる機能。
Min Difficulty(最低難易度)とMax Difficulty(最高難易度)を入力し、Addを押すことでランダムに問題が選ばれ、追加される。
ここで言う難易度とは、問題の配点ではなく、問題を解く際のレーティングの目安であることに注意。
More problem …を押すことで一度に追加する問題を増やすことも可能。

Exclude experimental difficultyにチェックを入れると、🧪が付いた問題が追加されなくなる。
Exclude already solved problems by expected participantsにチェックを入れると、前述のExpected Participantsで入力したユーザーがACした問題が追加されなくなる。

Create Contestをクリックするとコンテストが作成される。

##Lockoutモードについて
前述のModeをLockoutに設定すると、問題の正答者が出ると、それ以降その問題では得点が得られなくなる。
より回答スピードが求められ、どの問題を先に解くかの駆け引きが楽しめるようになる。
M5StickCを用いた血中酸素飽和度の測定

コロナの影響でパルスオキシメータが手に入らないので[M5StickC](https://m5stack.com/collections/m5-core/products/stick-c)と[Heart Unit (MAX30100)](https://m5stack.com/products/mini-heart-unit)で血中酸素飽和度(SpO2)を測定して表示させてみた。値の正しさは不明なので、使う場合は自己責任で。
<img src="https://media.githubusercontent.com/media/shohara/M5StickC_SpO2/images/images/SpO2.jpg" width=300>

# M5StickC_SpO2
* ソースコード: [GitHub](https://github.com/shohara/M5StickC_SpO2/blob/master/M5StickC_MAX30100_SpO2/M5StickC_MAX30100_SpO2.ino) 参照
* 動作には、[M5StickC](https://www.switch-science.com/catalog/5517/)と[Heart Unit (MAX30100)](https://www.switch-science.com/catalog/5695/)が必要。
* センサーから出力される値が不安定で、SpO2が130を超えたり30くらいになったりと明らかにおかしな値が返ってきていたため、異常値を除いて30サンプルを取得、さらに異常と思われる値を除いて平均を表示するようにした。平均を求める際に、ばらつきが大きい場合は再測定するようにした。
* 異常値の判定(サンプリングを無視する条件)
    * SpO2: 70未満もしくは100を超える場合
    * 心拍数(HR): 40未満もしくは250を超える場合
* 再測定条件(30サンプル取得後)
    * 再測定：SpO2vの標準偏差が10を超える場合、またはHRの標準偏差が30を超える場合。
    * 一部再測定：標準偏差の2.5倍を超えるサンプリングは削除して再測定。
* １秒に一回サンプリングしているが、異常値は無視しているので、測定が進まない場合がある。センサーの上に指を軽くおいて、20~30秒じっとしているとプログレスバーが進む。センサーで心拍が検出されると、赤色の四角が右下に0.1秒表示される。
* SpO2が95%以下の場合は赤色で文字が表示される。
* ビルド時の注意
    * MAX30100lib ライブラリをインクルードして、Arduino IDEでビルドできる。
100日後にエンジニアになるキミ - 41日目 - データベース - SQLの基礎4

本日もSQL文の続きです。


昨日のはこちら

[100日後にエンジニアになるキミ - 40日目 - データベース - SQLの基礎3]
(https://qiita.com/otupy/items/9a58e5aa6bfe0f5f783d)

## データ制御言語(DCL)について

データベースの利用に様々な制限をつけるための文法で
主に下記のような文があります。

`GRANT`特定のデータベース利用者に特定の作業を行う権限を与える
`REVOKE`特定のデータベース利用者からすでに与えた権限を剥奪する
`BEGIN`トランザクションの開始
`COMMIT`トランザクションの確定
`ROLLBACK`トランザクションの取り消し
`SAVEPOINT`任意にロールバック地点を設定する
`LOCK`表などの資源を占有する

## GRANT

GRANTはユーザーに対する権限を付与します。
通常のデータベースにはユーザーや権限があり
テーブルの参照や操作に制限を与える事ができます。
(SQLiteではできないようです。)

基本構文：
`GRANT 権限 ON テーブル名 TO ユーザー名`

テーブルに対して与えられる権限は以下のようなものがあります。

| 権限名 | 意味 |
|:--|:--|
| SELECT | 参照する権限を与える |
| INSERT | 行を追加する権限を与える |
| DELETE | 行を削除する権限を与える |
| UPDATE | 値を更新する権限を与える |
| UPDATE（列名） | 特定列の値を更新する権限を与える |
| ALL PRIVILEGES | 上記の権限を全て与える |

## REVOKE

GRANTとは逆に権限を取り消します。
権限は`GRANT`と同様です。

基本構文：
`REVOKE 権限 ON テーブル名 FROM ユーザー名`


## BEGIN,COMMIT,ROLLBACK

`BEGIN`でトランザクションを開始し
`COMMIT`はトランザクションの結果を確定し
`ROLLBACK`はトランザクションの結果を取り消します。

例えば一連の処理でデータ投入などを行うとします。

トランザクションで一連の処理を行うとして
全部成功したら`COMMIT`
どこか失敗したら`ROLLBACK`
というように結果に応じてデータベースの更新をするかどうかを
制御する際に使い分けます。

```sql
BEGIN TRANSACTION;
処理

--成功したら
COMMIT;

--失敗したら
ROLLBACK;
```

pythonのコードで書くとこのような感じになります。

```python
import sqlite3
conn = None
try:
    conn = sqlite3.connect(dbpath, isolation_level='EXCLUSIVE')
    for i in range(5):
        conn.execute('insert into tbl values (?, ?)', [i, 'name%d' % i])
except Exception, e:
    if conn: 
        conn.rollback()
finally:
    if conn: 
        conn.commit()
```

## SAVEPOINT

任意にロールバック地点を設定します。

```sql
BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT savepoint1;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT savepoint1;
    INSERT INTO table1 VALUES (3);
COMMIT;
```

この場合`INSERT`の後にSAVEPOINTを作成し
二回目の`INSERT`の後にロールバックしています。








## まとめ

データベースでの権限操作などはSQLiteではできないようですが
他のデータベースなどで行う事が出来ると思います。
他のデータベースも試してみましょう。

君がエンジニアになるまであと59日

## 作者の情報

乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython
Railsのform_withを使った時にページが更新されない時

# form_withとは
Railsアプリケーションでformを作成する時にform_for/form_tagを使っていました。

任意のmodelに紐づくフォームを作成したい場合にはform_forを使い、modelに紐づかない場合にはform_withを使います。

form_forを使えばPOSTの送信先urlなどを全て自動で行いますが、form_forの場合は全て明示します。

HTMLタグのヘルパーのようなイメージで使います。

[【Rails】form_for/form_tagの違い・使い分けをまとめた](https://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9)

しかし、`Rails5.1`以降は2つのメソッドを統合したform_withが登場し、form_withの利用が推奨されています。

# form_withでページが更新されない

form_withを使ってユーザのログインフォームを作っていました。

form_withには`UserModel`を紐づけており、バリデーションやログイン認証の結果にエラーがあれば、viewに反映せるようにしていました。

```erb:views/users/_form.html.erb
<%= form_with model: @user, url: user_path do |f| %>

    <%= render 'shared/error_messages',  object: f.object %>

    <%= f.label :name %>
    <%= f.text_field :user_name, class: "form-control" %>

    <%= f.label :email %>
    <%= f.email_field :email, class: "form-control" %>

    <%= f.label :password %>
    <%= f.password_field :password, class: "form-control" %>

    <%= f.label :password_confirmation, "Confirmation" %>
    <%= f.password_field :password_confirmation, class: "form-control" %>

    <%= f.submit yield(:btn_text), class: "btn btn-primary" %>
<% end %>
```

ところが、エラーは発生しているのにviewには反映されない問題に衝突しました。

これは、`form_withでのパラメータの送信はajaxで行われている`ためです。

HTMLのフォームとしてPOSTしたい場合は`local: true`オプションを付け加えます。


```erb:views/users/_form.html.erb
<%= form_with model: @user, url: user_path, local: true do |f| %>
  :
<% end %>
```

これでバリデーションなどのエラー結果を表示するviewを表示できます。

都度フォームにオプションをつけるのが面倒な場合は、`config/initialize`ディレクトリに適当なファイルを作成し以下のコードを追記します。


```ruby:config/initialize/some_file.rb
Rails.application.configure do
    config.action_view.form_with_generates_remote_forms = false
end
```
nullを取り除くLINQ Where [null許容参照型]

# 課題
**nullable reference type (null許容参照型) の配列からnullを取り除きたい**

後述するように警告が出てしまうことが課題です。nullable生活を始めたら瞬時にこの問題に当たったのですが、巷になかなか情報が無いですね。

## コード例

nullを除外しているにもかかわらずWhereの結果は `IEnumerable<string?>` なので、Selectのところで **nullかも (Dereference of a possibly null reference)** と警告が出ます。

```c#
#nullable enable

string?[] array =  { "hoge", null, "fuga", null, "piyo" };

var uppers = array
    .Where(s => s != null)
    .Select(s => s.ToUpper()) // 警告
    .OrderByDescending(s => s);
```

# 結論
今のところ、ここで示されている `WhereNotNull` という拡張メソッドを用意するのが一番確実に思いました。
https://github.com/dotnet/roslyn/issues/39586#issuecomment-547909968

```c#
static class MyExtensions
{
    public static IEnumerable<T> WhereNotNull<T>(this IEnumerable<T?> source) 
        where T : class 
    {
        if (source == null) 
        { 
            return Enumerable.Empty<T>(); 
        } 
  
        return source.Where(x => x != null)!;
    }
} 
```

```c#
var uppers = array
    .WhereNotNull()
    .Select(s => s.ToUpper())
    .OrderByDescending(s => s);
```

# ほかの案
## 1.OfType
コメントで指摘頂きました。

```c#
var uppers = array
    .OfType<string>()
    .Select(s => s.ToUpper())
    .OrderByDescending(s => s);
```

ReSharperを利用している場合、`Redundant 'IEnumerable.OfType<T>' call. Consider comparing with 'null' instead.` との指摘が出ます。`string`と`string?`は属性の有無だけの差ですから型変換とはみなされず、そうなるのだと考えます。毎度の指摘抑止も大変ですから、拡張メソッドにするのが良さそうですね。nullをフィルタする意図が即座には伝わりにくい点も緩和できます。

```c#
static class MyExtensions
{
    public static IEnumerable<T> WhereNotNull<T>(this IEnumerable<T?> source)
        where T : class
        // ReSharper disable once RedundantEnumerableCastCall
        => source.OfType<T>();
}
```

## 2.びっくりSelect
個人的にこう呼んでいます。

```c#
var uppers = array
    .Where(s => s != null)
    .Select(s => s!)
    .Select(s => s.ToUpper())
    .OrderByDescending(s => s);
```

> この例はあまりよくないので、この程度であればびっくりをいきなり付けていいですね。

>```c#
var uppers = array
    .Where(s => s != null)
    .Select(s => s!.ToUpper())
    .OrderByDescending(s => s);
```

せっかくnullableしているのにびっくり演算子付けたら負けな気がするし、かといって拡張メソッドはあまり作りたくないし、悩ましいところはあります。

## 3. SelectMany
あまりやりたくない案

```c#
var uppers = array.SelectMany(s => s == null ? new string[0] : new[] { s })
    .Select(s => s.ToUpper())
    .OrderByDescending(s => s);
```

この方法は、ほかには2回Parseしたくないときに使えたりします。

```c#
var array = new[] {"123", "abc", "一二三"};

// 素朴な方法
var numbers1 = array
    .Where(s => int.TryParse(s, out _))
    .Select(s => int.Parse(s));

var numbers2 = array
    .SelectMany(s => int.TryParse(s, out var i) ? new[] { i } : new int[0]);
```
[入門者向け]　AWS Solution Architect Associate 合格までの道

初心者エンジニアの合格体験記です。
一度不合格で再受験したため、失敗経験も併せて
合格までのポイントを伝えられたらと思います:money_mouth:  

#前提
###経験・能力について
・文系出身SE
・プログラミング経験なし(入社してからJavaの研修を7日ほど・・・)
・当然インフラ知識もなし
・入社するまでIT知識無し
・SIer勤務でPJ管理メイン・・・（書類作成に追われ業務ではほぼIT知識がつかない）

###AWS受験のきっかけ
配属した時に学習を推奨されていたため。
6月くらいに存在を初めて知り、なんとなく面白そうだし将来の武器になりそうだと思った

#学習期間
2019/12/9 ~ 2020/4/29
1回目の受験は3/7   スコア680  →不合格
2回目の受験は4/30  スコア820  →合格！！！
※1月、２月は業務が忙しい+サボりグセでおそらく合わせて10時間も勉強していないですが・・

学習に5ケ月かかっているので、とても優秀とは言えないですね:thumbsdown::thumbsdown:

#1回目の受験
###学習内容
・[AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/479739739X/ref=pd_lpo_14_t_1/356-0908904-9717742?_encoding=UTF8&pd_rd_i=479739739X&pd_rd_r=aba8f31e-e305-4846-9c7c-e77f8efb11c9&pd_rd_w=J4jLA&pd_rd_wg=B4XEz&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=4ERRBBZ5AYKVGDDCHRDZ&psc=1&refRID=4ERRBBZ5AYKVGDDCHRDZ)

通称オレンジ本。のみです。
他の方の合格体験記を見ても明らかに学習が足りないと思います。
参考書に書いてあることは一通り抑え、オレンジ本の例題や問題は100%解ける、という状態で受験に臨みましたが、結果としては不合格。(スコア680)

ただ、この参考書を貶めたい訳では全くありません。
むしろIT知識皆無の私が学習するのに非常にわかりやすく助けになりました！！

#反省点
上記のように初学の私にとってオレンジ本は非常に優秀でした。
では何が足りなかったかというと・・
・オレンジ本のみではサービスの理解のみになってしまう。
・問題演習量が全く足りない！！！
の2点が原因だと思います。

受験するのはソリューションアーキテクト。
つまり合格のために必要なのはサービスの理解だけでなく
「要件に合わせて、AWSサービスの設定やサービス同士の組み合わせが最適かを判断する」
能力だったのです。
この能力を育てるために手っ取り早いのが問題演習でした。

#２回目の受験
###学習内容
・[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/share/101rfMCEcbcFhRTXg=/)
・[AWS Web問題集で学習しよう](https://aws.koiwaclub.com/sample/)
この二つを重点的に取り組みました。
※便宜上「udemy模擬試験」と「小岩問題集」と呼びます。

udemy模擬試験のいいところは、実際の模擬試験と同様の時間・問題量を経験できること。
難易度は実際の試験より遥かに高いですが。
今の所あまり模擬試験レベルの問題を解ける教材などが少ないんですよね。。。

小岩問題集のいいところは、1セグメント7問でサクサク進められるところと解説に公式ドキュメントのリンクが貼ってあるところ。
隙間時間にサクサクできちゃいます。公式ドキュメントの確認も実は結構重要です。


###学習の進め方
1.udemy模擬試験で1回模試を受ける
2.小岩で学習する
3.udemy模擬試験で残りの模試を受ける

簡単にするとこんな感じ。
まずは模試としてudemy模擬試験を受けてみてください。
私は1回目の受験の後受けましたが36%でした・・・・。低過ぎ・・・。:robot:

その後小岩で実力をつけて、模擬試験で仕上げて終わり！！！！！


#締め
最後投げやりですが、以上です！w
【jQuery】超簡単　Twitter風　タブ切り替え

## 目的
jQueryを使ったよくあるタブの切り替えを使えるようにします。

## 前提
jQueryを導入済

##実装例
イメージとしてこんな感じができます。
https://gyazo.com/268f738d6ba83b40a592b2d01ec0b3d5

下記にシンプルにコードを書きます
まずはビュー

```index.html
 <ul class="tab">
　　<li class="select">投稿一覧</li>
　　<li>いいね</li>
　　<li>カレンダー</li>
  </ul>
  <ul class="content">
    <li>投稿一覧内容</li>
    <li class="hide">いいね一覧内容</li>
    <li class="hide">カレンダー内容</li>
  </ul>
```

```stylesheet.css
.tab{
  overflow:hidden;
  width: 100%;
  display: flex;
}
.tab li{
  border-bottom: 4px solid gray;
  width: 50%;
  text-align: center;
  font-size: 18px;
  padding: 15px;
}
.select{
  color:rgb(0, 212, 0) ;
  border-bottom: 4px solid rgb(0, 212, 0) !important;
}
.hide{
 display: none ;
}

```

```applicataion.js
// タブ切り替え
  $(function() {
    //クリックしたときのファンクションをまとめて指定
    $('.tab li').click(function() {
  
      //.index()を使いクリックされたタブが何番目かを調べ、
      //indexという変数に代入します。
      var index = $('.tab li').index(this);
  
      //コンテンツを一度すべて非表示にし、
      $('.content li').css('display','none');
  
      //クリックされたタブと同じ順番のコンテンツを表示します。
      $('.content li').eq(index).css('display','block');
  
      //一度タブについているクラスselectを消し、
      $('.tab li').removeClass('select');
  
      //クリックされたタブのみにクラスselectをつけます。
      $(this).addClass('select')
    });
  });
```

ポイントは.index()で何番目ののタブなのか取得し、同じ順番のコンテンツを表示するということ！
クラスを一旦全部取っ払って、全部非表示にしてクリックされたところだけにselectをつける。
この流れを分かっていれば、簡単にタブの切り替えが実装できます。
LANケーブルのストレートとクロスは気を付けましょう

#内容
L2スイッチのspeed/duplex設定およびLANケーブルのストレートとクロスは気を付けましょうという話
恥ずかしい話だけど備忘録のため

#事象
2年くらい前かな。ファイヤーウォールをリプレイス(国産FWからpfsense)するにあたりシングル構成のから冗長化へ変更
翌営業日になんか遅いんだけど…という事象が発生

![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624314/28f74b9e-eba3-8ca0-9f59-c5fc0feae6b0.png)

#問題

①ONU～Catalys2960Sのspeed/duplex不一致

元々、ONUはファイヤーウォールに直接接続していたが、冗長化にあたり2960Sを噛ませた
ONUのポート設定は100m/full固定であり、2960はautoとしたため、duplexがhalfとなっていた事が判明

②ONU～Catalys2960S間でストレートケーブルを利用していた

2960側のポート設定を100/fullに変更したらlinkdownとなってしまった
￥
え？ONU～スイッチってクロスなの？自動で判別してくれんじゃないの？speed/duplex固定すると自動判別offになるの？

ということでヨドバシカメラでLANケーブルを買いつつデータセンターに赴き、ケーブル交換したら事象解決

#言い訳と反省
ONUの設定を把握していなかった(資料がなかった)し、そもそも気にしてなかった
ポート固定するとAuto MDI-Xが解除されるなんて知らなかった
ONU～スイッチ間はクロスケーブルだと思っていなかった(これもそもそも気にしていない)
　→事前検証不足。もっと確認しましょう

スイッチのステータスを確認しなかった
速度を計測しなかった(適当なポート疎通が取れることでOKとした)
　→作業後、機器ステータス確認および速度計測をしましょう。リンク状態の目視も必要か

簡単な疎通さえ取れれば、トラブルがでても設定の問題であり、リモートでリカバリできると考えていた
物理作業でミスがあると、データセンター要ったりでリカバリにだいぶ時間がかかるので注意しましょう
Laravel Dump Server インストールエラー Argument 1 passed to Symfony\Component\VarDumper\Server\Connection::__construct() must be of the type string

https://github.com/beyondcode/laravel-dump-server Laravel Dump Serverのライブラリをインストールしようとしたところ謎のエラーが発生してしまいました。

## 環境

- PHP 7.4.5
- Laravel 7.5.1
- Laravel Dump Server 2.7.0

## 問題

```shell-session
$ composer require --dev beyondcode/laravel-dump-server

Using version ^1.4 for beyondcode/laravel-dump-server
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Package zendframework/zend-code is abandoned, you should avoid using it. Use laminas/laminas-code instead.
Package zendframework/zend-eventmanager is abandoned, you should avoid using it. Use laminas/laminas-eventmanager instead.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

In Connection.php line 32:
                                                                               
  Argument 1 passed to Symfony\Component\VarDumper\Server\Connection::__const  
  ruct() must be of the type string, null given, called in /work/backend/vend  
  or/beyondcode/laravel-dump-server/src/DumpServerServiceProvider.php on line  
   49                                                                          
                                                                               

Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1

Installation failed, reverting ./composer.json to its original content.
```

インストールに失敗してちょっとビビリました。

## 対策

https://github.com/beyondcode/laravel-dump-server/issues/48

こちらのイシューを見たところ、キャッシュが悪さしてるようです。

```shell-session
$ rm bootstrap/cache/config.php
```

キャッシュファイルを削除して、再度インストールしなおせばokです。

```shell-session
$ composer require --dev beyondcode/laravel-dump-server
```
Packers and Loader services

Packing Service, Inc. is a 100% professional packers and loader company that was established in 2003. 
Our diverse list of services includes: • Packing and Unpacking • Loading and Unloading • Shrink Wrap Palletizing • Custom Crating • Nationwide Shipping.

https://www.packingserviceinc.com/professional_crating_services_company.php
![uploading-0]()
[Rails]RuboCopが遅いときにやること

# はじめに
`AllCops`で対象外のファイルを指定したら急に動作が遅くなったRuboCopさんの動作速度を改善する方法。
# 原因
AllCopsで除外ファイルを指定する前は明らかな不要フォルダは検索してなかった。
除外ファイルを指定すると、指定ファイル以外は全部検索していた。
# 解決策
検索不要なフォルダを指定する。実際のやつはこんな感じ↓

```.rubocop.yml
AllCops:
  TargetRubyVersion : 2.6
  Exclude:
    - 'db/schema.rb'
    - 'db/migrate/*'
    - !ruby/regexp /old_and_unused\.rb$/
    - 'bin/*'
    - 'node_modules/**/*'
    - 'config/**/*'
    - 'public/**/*'
    - 'tmp/**/*'
    - 'log/**/*'
```
seeds.rbの使い方

# seeds.rbとは
初期データを生成してくれるファイルのこと。
このファイルにデータを生成するコードを書いておくだけで、アプリにデータを備えさせることができます。
簡単にテストデータを作ったりできます。

## 使い方
1.自分が用意したいデータをファイル内でcreateする。

```db/seed.rb

#通常の場合
User.create(name: "tanaka")
User.create(name: "sato")

#配列の場合
users = User.create([{name: "tanaka"}, {name: "sato"}])

#大量のテストデータの場合
100.times do |n|
  User.create(title: "test{n}人目", content:"test！#{n}回目")
end

```

2.seedファイルを実行する

```
$ rails db:seed
```

###おまけ
実際に存在しそうなデータを生成してくるgem(Faker)があるので一応載せておきます。

1.Gemfileに以下を追記

```
gem 'faker'
```

こちらも忘れず実行してください。

```
$ bundle install
```

2.seeds.rbを以下のように記述する。

```db/seed.rb
100.times do |n|
  name = Faker::Name.name
  email = Faker::Internet.email
  content = "test"

  User.create(
    name: name,
    email: email,
    content: content
  )
end
```

3.seedファイルを実行する。

```
$ rails db:seed
```

※Fakerの使い方一覧は以下の表参照。

| 種類 | 役割 |
|:--|:--|
| Faker::Name.name | 名前 |
| Faker::Internet.email | メールアドレス |
| Faker::Address.city | 都市の名前 |
| Faker::Food.ingredient | 食べ物の名前 |



###参考
https://diveintocode.jp/blogs/Technology/SeedData
商品情報と別のテーブルに保存している画像を一緒に表示させるためには

現在プログランミングスクールでチーム開発にてフリマアプリを作成中です。

## やりたいこと
- トップページの商品一覧でitemテーブルのアソシエーション先であるimageテーブルから複数ある画像の一つだけを表示させたい。
- 表示させたいのは出品中の商品のみ。



## 解決までの思考
とりあえず一覧表示するため商品全部の情報を持ってきてみる

```ruby:items_controller.rb
  def index
    @items = Item.all
  end
```
でもこれだと画像がない

```ruby:items_controller.rb
  def index
    @items = Item.includes([:images]).order(created_at: :desc)
  end
```
モデルにアソシエーションがあれば.includesで取得可能！


```ruby:item.rb
class Item < ApplicationRecord
  belongs_to :brand
  belongs_to :category
  has_many :images
```
念のためアソシエーション確認
これで商品情報と画像を持ってこれた。

でもそも欲しい情報は出品中の商品のみなので、このままだと販売済みなどの必要ない商品まであるよね？

じゃあモデルで定義しちゃおう！

```ruby:item.rb
class Item < ApplicationRecord
  belongs_to :brand
  belongs_to :category
  has_many :images

  enum status: { sell: 0, buy: 1 , trading:2}

  scope :on_sell, -> { where(status: 0) }
end

```

まずenumで出品中、購入済み、取引中を定義しておく。
これによってstatusカラムに数字で保存されている。

さらにscopeメソッドを使ってメソッドを定義する。
where句を使ってstatusが0（出品中）のレコードだけをon_sellに代入できた。
（コントローラーにも記述できるがこの方が可読性がいいのでモデル推奨）

```ruby:items_controller.rb
  def index
    @items = Item.on_sell.includes([:images]).order(created_at: :desc)
  end
```

あとはコントローラーに記述してあげれば
出品中の商品とそれに紐づいた画像を持ってこれた。ついでに.orderで最新順に表示できるようソートしておく。

あとはビューに表示させるだけ！

``` ruby
  .top-main__product__list__box
   - @items.each do |item|
    = link_to item_path(id: item.id) ,class:"top-main__product__list__box__item" do
     - item.images.first(1).each do |image| 
      = image_tag image.url,class:"top-main__product__list__box__item__img"    
     .top-main__product__list__box__item__body
      %h3.top-main__product__list__box__item__body__name 
       = item.name
      .top-main__product__list__box__item__body__details
       %ul
        %li 
         = item.price
         = "円"
       %p (税込)
```
itemをeachで順番に表示させたはいいもののそのままだと紐づいた画像を全て表示してしまう。


``` ruby
     - item.images.first(1).each do |image| 
```

eachは回数を指定できる、、、
じゃあ一回だけ回せば一枚だけ表示できるやん！とひらめき実装完了
（ただこの方法はあまり美しくない気が、、、）


## 今回学べたこと


- 関連するテーブルからの取得方法
- アソシエーションの必要性
- スコープを使ってモデルに定義しコントローラーに記述することで可読性アップ

初めはどこに何を定義し、どう記述するのか見当もつきませんでしたが必要なポイントを箇条書きにすることで少しずつ近づけました。
ビューの画像表示の方法はもう少しいい表示方法がありそう？なので今後の課題として！
【C++】Erase-removeイディオム

vectorの要素を削除したいとき。

##remove
```C++:remove.cpp
vector<int> a = {1,2,3,4};
auto p = remove(a.begin(), a.end(), 2); // {1, 3, 4, 4}
```
[1つ目の引数, 2つ目の引数)の範囲で、3つ目の引数と一致する要素を取り除き、有効な要素を前に寄せる。
この時、vectorのサイズは変わらず不要な要素は**末尾に寄せられただけ**となる。
pには1つ目の4のイテレータが入る。

##erase
そこでstd::vector::eraseを使う。

```C++:erase.cpp
vector<int> a = {1,2,3,4};
auto p = remove(a.begin(), a.end(), 2);
a.erase(p, a.end());
```
eraseでは[1つ目の引数,2つ目の引数)の範囲が削除される。
これで、後ろに寄せられた不要な要素が削除される。

##Erase-removeイディオム
組み合わせてこんな感じで使う。

```C++:erase-remove.cpp
vector<int> a = {1,2,3,4};
a.erase(remove(a.begin(), a.end(), 2), a.end());
```

##参考
https://cpprefjp.github.io/reference/algorithm/remove.html
https://cpprefjp.github.io/reference/vector/vector/erase.html
https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/消去・削除(Erase-Remove)
Google スプレッドシート＆Google フォーム＆GASだけでサーバーレスなリモート状況報告システム


## はじめに
だいぶ暖かくなってきて、半袖でいてもおかしくない時期になってきましたね。

そんな中、リモートから状況報告できる＆ページで出勤状況を確認できる仕組みを
[Google Apps Script](https://developers.google.com/apps-script/) (GAS)を用いてサーバーレスでサクッと作りました。

## 使うもの

- Google スプレッドシート（データベース）
- Google フォーム（入力）
- Google Apps Script

これらを連携させて全体を構成します。
逆に言えば、これしか使っていません。
なお、今回はhtmlページの表示にはVue.jsを使用しましたが、Vue.jsを使用しなくても構築できます。


## メリット / デメリット

### メリット
- Google アカウントがあれば作れる
- スプレッドシート、フォームは技術者以外でも編集できる！
- GASを使ってページが作れるので、サーバーがなくても構築できる
- 権限周りをある程度制御できる
  - 権限に関しては、かゆいところに手が届かない点もあるが、地道に設定すれば実現できることが多い
- 特別なツールがなくてもすぐ作れる
  - ネット環境さえあればOK、エディタすらいらない
- すぐ試せる


### デメリット
- Googleに全て依存
- スプレッドシート、フォームは技術者以外でも編集できる…
- GASの編集環境が基本的によくない
- コードが増えてくると乱雑になる
- デバッグ環境がログベースのものしかない
- 権限周りはかなり慎重に設定する必要がある
- 処理が重い
- 処理数/処理時間数の制限がある
- cssとjsを、拡張子がhtmlのファイルとして扱う必要がある（回避策あれば知りたいです）


全体的には、手軽さと開発スピードに重点を置く場合に強いですが
規模が大きかったり、しっかりとしたシステムとして組もうとするとなかなか障壁が高いです。

また、スプレッドシートとフォームは特に説明しなくても誰でも操作できるので
権限など正しく設定しておけば、スクリプトを経由しないで、DBを閲覧・操作してもらうことが可能です。
この点も、良くも悪くも…な点でありますが、使い所を選べばメリットを享受できます。

編集環境については、今回は見送りましたが、今後快適な環境を構築していきたいと考えています。


## 構成
構成は以下の図の通り。

![wsvs_system.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73231/8e6f584b-1150-5e53-8322-961a130cde8d.png)


一覧ページ　：Googleページで全員の状況を一覧表示
社員情報　　：Googleスプレッドシートで一覧表示に必要な社員情報を管理
入力フォーム：Googleフォームで状況を選択して打刻
補助ツール　：メール送信とslack通知
スクリプト　：これら全てを繋げるのがGAS

という構成です。

これらを連携させて全体の流れが繋がると、サーバーレスで手頃で手軽なテレワーク状況報告システムが出来上がります。

それぞれの詳細については、以下を2回に分けて書いています。
[1. GASのライブラリ化（その2）](https://qiita.com/rihok/items/eb7efed39b5a0261a4c6#1-gas%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E5%8C%96)
[2. 全員の状況を一覧表示する（その2）](https://qiita.com/rihok/items/eb7efed39b5a0261a4c6#2-%E5%85%A8%E5%93%A1%E3%81%AE%E7%8A%B6%E6%B3%81%E3%82%92%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)
[3. 一覧表示に必要な社員情報を管理（その2）](https://qiita.com/rihok/items/eb7efed39b5a0261a4c6#3-%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E7%A4%BE%E5%93%A1%E6%83%85%E5%A0%B1%E3%82%92%E7%AE%A1%E7%90%86)
[4. 状況を選択して打刻（その3）](https://qiita.com/rihok/private/42d8db51c3e8f7c56f46#4-%E7%8A%B6%E6%B3%81%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E6%89%93%E5%88%BB)
[5. 連携（その3）](https://qiita.com/rihok/private/42d8db51c3e8f7c56f46#5-%E9%80%A3%E6%90%BA)
[6. デバッグ（その3）](https://qiita.com/rihok/private/42d8db51c3e8f7c56f46#6-%E3%83%87%E3%83%90%E3%83%83%E3%82%B0)
[7. まとめ（その3）](https://qiita.com/rihok/private/42d8db51c3e8f7c56f46#%E3%81%BE%E3%81%A8%E3%82%81)
ngrokをバックグラウンドで実行する備忘録


#はじめに
ngrokとはlocalhostで建てたサーバをポート開放などを行わずに外部公開できるサービスです。

ngrokには有料版と無料版があり、有料版ではカスタムサブドメインを設定できるのでそのままバックグラウンドで実行させればできるみたいです。今回は無料版ngrokでのバックグラウンド実行方法を紹介します。

##導入方法
長くなるので割愛します。[こちら](https://qiita.com/hirokisoccer/items/7033c1bb9c85bf6789bd)を参考にしてください。


###アカウント登録
まず最初に[公式サイト](https://ngrok.com/)からアカウント登録（無料）を行います。

###アカウント接続
アカウント登録が終わったら認証トークンをコピーします。認証トークンは[こちら](https://dashboard.ngrok.com/auth)にあります。
開発環境にてターミナルを開き、下記のようにコマンドを記述します。

```
ngrok authtoken {先ほどコピーした認証トークン} 
```

##ローカルサーバを外部公開！
以下のように記述します。

```
ngrok http {ローカルサーバのポート番号}
```
すると以下のような結果が返ってきます。

```
Session Status                online                                                                                                                          
Account                       hogehoge (Plan: Free)                                                                                                        
Version                       2.3.35                                                                                                                          
Region                        United States (us)                                                                                                              
Web Interface                 http://127.0.0.1:4040                                                                                                           
Forwarding                    http://r4df3sfk91.ngrok.io -> http://localhost:3000                                                                               
Forwarding                    https://r4df3sfk91.ngrok.io -> http://localhost:3000                                                                              
                                                                                                                                                              
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                                     
                              0       0       0.00    0.00    0.00    0.00 
```
###アクセス
httpなら`http://r4df3sfk91.ngrok.io`
httpsなら`https://r4df3sfk91.ngrok.io`にアクセス出来れば成功です。

#バックグラウンドで実行
さて、ここからが本題です。
フォアグランドで実行している状態だとSSHの接続が切れたり、他のプログラムを実行したりするとngrokが落ちてしまいます。それを防ぐため、今回は`nohup`コマンドを使ってバックグラウンド実行を実現してみようと思います。

###nohupとは
簡単に説明すると、バックグラウンドでコマンドを実行するためのコマンドです。
詳しくは[こちら](https://www.atmarkit.co.jp/ait/articles/1708/24/news022.html)を参考にしてください。

以下のように記述します。

```
nohup ngrok 3000 &
```
これでバックグラウンド実行できました。

###リンクの確認
ngrokのリンクを確認するには`curl`で[localhost:4040/api/tunnels]を叩き、返ってきた結果から[ngrok.io]と書かれた部分を探します。
かなり長い結果が返ってくるので、`grep`も併用してあげるとよいでしょう。

```
curl http://localhost:4040/api/tunnels | grep ngrok.io
```
すると結果にリンクが返ってきます。

#参考リンク
https://stackoverflow.com/questions/27162552/ngrok-running-in-background
AWS ubuntu18.04で IAM RoleによるCode Commit からのgit cloneには awscliが必要

# AWS ubuntu18.04で IAM RoleによるCode Commit からのgit cloneには awscliが必要
##環境
ubuntu18.04 on AWS EC2
## Amazon linuxでは起きない？！
他のプロジェクトではamazon linuxを使っていて、ubuntuでやったのは初めてで気付かなかったので、メモ。※知っている人から見たら低次元の話です。すみません。

## まずはgit-configで設定
```
git config --global credential.helper '!aws --region us-east-1 codecommit credential-helper $@' 
git config --global credential.UseHttpPath true
```
※リージョンはご自身の使用内容に修正して下さい。

## これでhttpsでgit cloneしてもエラーになる！AWS Cliインストールを
```
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
sudo pip install awscli
```
結論から言うとAWS Cliのインストールが必要となります。
無事httpsでgit clone出来るようになりました！
MAMPを使ったWordpressでのWEB制作方法15　初心者向け

#MAMPを使ったWordpressでのWEB制作方法15　初心者向け

今回で最後の記事になります。
前回の記事はこちら

[MAMPを使ったWordpressでのWEB制作方法14　初心者向け](https://qiita.com/fumiya0414/items/abd9d1e320660b8ee9c4)

これまで固定ページはpage.phpでレイアウトを共通化してきました。

しかし実際には自由にレイアウトが必要な場面や
VSコードなどのエディタ側でページを制作するほうが
都合がいいことが多いと思います。

そこでレイアウトが自由なページを追加してみましょう。

##オリジナルテンプレートの作成

今回はサービス２という内容でオリジナルテンプレートを作成します。

まずpage.phpをコピーしてpage-service2.phpというファイルを作成します。
一番上にphpでテンプレートの名前を記述します。

```php:page-service2.php
<?php
/*
Template Name: サービス2
*/
?>

<?php get_header(); ?>

  <div class="wrapper">
    <div id="conL">
      <h2><?php the_title(); ?></h2>

      <?php if(have_posts()): while(have_posts()): the_post();?>
      <?php the_content(); ?>
      <?php endwhile; endif; ?>

      <!--ページの条件分岐-->
      <?php if (is_page(array('63'))) {?>

      <?php }else{ ?>
        <a class="btn" href="contact.html"><button class="btn1">お問い合わせ</button></a>
      <?php } ?>


    </div><!--conLend-->

<?php get_sidebar(); ?>
  </div>
<?php get_footer();?>
```

次に管理者画面から新規固定ページを以下で作成しましょう。
パーマリンクはservice2、ページ属性からテンプレートをサービス２に設定します。
入力が終わったら公開してページを表示します。
[![Image from Gyazo](https://i.gyazo.com/0fb5d94f4ec851acb23eafe286af3ea6.png)](https://gyazo.com/0fb5d94f4ec851acb23eafe286af3ea6)

すると以下のようにサービス２のページが表示されます。
[![Image from Gyazo](https://i.gyazo.com/888445b2cb56674d37d1f8e1d178854c.png)]
(https://gyazo.com/888445b2cb56674d37d1f8e1d178854c)

このページはpage-service2.phpのファイルと直接つながっています。
エディタで中身を編集してみましょう。

```php:page-service2.php
<?php
/*
Template Name: サービス2
*/
?>

<?php get_header(); ?>

  <div class="wrapper">
    <div id="conL">
      <h2><?php the_title(); ?></h2>
        <p>サービス２テスト</p>
        <p>サービス２テスト</p>
        <p>サービス２テスト</p>
        <p>サービス２テスト</p>
        <p>サービス２テスト</p>
    </div><!--conLend-->

<?php get_sidebar(); ?>
  </div>
<?php get_footer();?>
```

ブラウザで表示すると
[![Image from Gyazo](https://i.gyazo.com/afbdb558aeaad45e5fe84870f17a951f.png)](https://gyazo.com/afbdb558aeaad45e5fe84870f17a951f)
このようにファイルの内容が直接参照されます。

オリジナルテンプレートを使用すれば
固定ページのデザインをエディタから直接作成できます。
作りたいサイトの構成によって使い分けをしましょう。

以上でMAMPを使ったローカル環境でのテーマ作成は完了です。
ありがとうございました。
CodeIgniter4でDB接続まで

インストール〜環境設定までは[こちら](https://qiita.com/kohenji01/items/a36dbbbb19bb8808d104)をご覧ください。

#DB接続テストの前にコントローラについてかんたんに説明
あなたのホストは`http://exapmle.com/`だと仮定します。

まずは、ブラウザでCI4のトップページが見えている状態にしてください。
そして、現在は`ci4tset`のディレクトリ内にいると仮定します。

```text:ディレクトリの構成(今回出てくるファイルのみ表示)
/home/ci4test
├── .env                        <-- 前回作った環境設定ファイル
├── app
│   └── Controllers
│       └── Home.php            <-- 今回操作するファイル
├── htdocs                      <-- 前回書き換えたドキュメントルート
│   └── index.php
└── writable
```


このページは`app/Controllers/Home.php`のコントローラで動いています。
CI4ではControllerディレクトリ配下の（拡張子を除いた）ファイル名=クラス名=URLのパスの第一階層というルールで動作しています。

##URLはどうなっているのか？
apacheでmod_rewriteが有効ならば、`htdocs/.htaccess`が適切にURLの書き換えを行ってくれます。
この場合は、
`http://example.com/コントローラのクラス名/メソッド名/[引数1/[引数2/]...]`
という形でアクセスできます。無効の場合は
`http://example.com/index.php/コントローラのクラス名/メソッド名/[引数1/[引数2/]...]`
という形になります。
この辺はCI3の仕組みがそのまま踏襲されています。


##なぜトップページが`Home.php`なのか?
これは`app/Config/Routes.php`に`Home.php`の`Home`クラスの`index`というメソッド(関数)が`/`だぞという定義が記述してあるからなのですが、この辺は今回は割愛します。
（ここらへんのRoutingの仕組みはCI3とほぼ同じです）

そしてCIのルーティングに不慣れな人は面食らうかもしれませんが、現在の設定において
`http://exapmle.com/` (クラス名、メソッド名が省略)
は
`http://exapmle.com/Home` (メソッド名が省略)
であり
`http://exapmle.com/Home/index` （両方ちゃんと表記したもの）
でもあり、これはすべて同じページを指します。

この辺のURLの記述ルールは頭に入れておいたほうがいいと思います。

#接続テスト

いよいよDBに接続するテストをしてみます。

まず`app/Controllers/Home.php`のコントローラをエディタで開いてください。
ファイルのソースは次のような感じになっているはずです。

```php:app/Controllers/Home.php
<?php namespace App\Controllers;

class Home extends BaseController
{
	public function index()
	{
		return view('welcome_message');
	}

	//--------------------------------------------------------------------

}

```

ここに次のメソッドを追加してください。

```php:app/Controllers/Home.php
<?php namespace App\Controllers;

use Config\Database;

class Home extends BaseController
{
	public function index()
	{
		return view('welcome_message');
	}

	//--------------------------------------------------------------------

    public function connectionTest()
    {
        $db = Database::connect();
        echo "このDBのテーブル＝" . implode( ',' , $db->listTables() );
        return;
    }
}

```


動作をチェックするには`http://example.com/Home/connectionTest/`にアクセスしてください。
すでにDBが存在し、何がしかのテーブルがあれば、そのDBのすべてのテーブル名がカンマ区切りで表示されます。
テーブルがない場合は`このDBのテーブル＝`のみが表示されるはずです。
もしDBが存在しない場合は、DBドライバが`SQLite3`以外の場合はエラー画面が表示されます。

話が少しそれますが、`SQLite3`の場合、DBが存在しないときは`.env`ファイルの`database.default.database`で設定された名前のSQLite3のDBファイルが作られます。このパラメータはのパスを省略した場合ドキュメントルート直下にDBファイルが生成されます。
なお、このディレクトリが書込み可能でない場合はエラーになります。
このファイル名はもちろん絶対パスや、ドキュメントルートを起点とした`../writable/ci4test.db`のような相対パスで記述も可能です。


##照合順序も設定可能です
MySQLで文字コードや照合順序を指定する場合は、`.env`に

```text:.env
 database.default.charset = utf8mb4 あるいは utf8 など Collationに合わせた文字コード
 database.default.DBCollat = utf8mb4_general_ci や utf8_general_ci などお好みの照合順序
```
を記述することで指定した文字コード及び照合順序で接続が可能になります。

[次回](https://qiita.com/kohenji01/items/c87727e553c162b72548)はDBForgeを利用してDB自体を作る方法を解説したいと思います。
素人Python日記⑦ ～ネット上にある講座をなぞってみる（その2）

# この投稿の目的
日記みたいなものです。

前回に引き続き、Qiitaで見つけた初心者用講座を進めます。


## やったこと
 -  [@kaki_k](https://qiita.com/kaki_k)さんの[Python Django入門 (4)](https://qiita.com/kaki_k/items/6e17597804437ef170ae)から「[入門（5）](https://qiita.com/kaki_k/items/ebc8d8b07434e1721756)」まで
 -  書籍管理アプリを作っていくチュートリアル的なもの：とりあえず完走
 -  親モデルに紐づく子モデルのCRUD処理
 -  （6）のJSON処理は、JSONの知識が皆無なので後回し。いずれ書籍APIとか引っ張ってこれるレベルになったらもう一度見る（書影はやっぱりほしいのでがんばる）


## ちょっと理解がすすんだこと
 -  _で始まる変数・メソッド：アクセス制限（強制力なし）
 -  _ふたつで始まる変数・メソッド：アクセス制限（強制）＝プライベート（Markdownのエスケープがうまくできないので「ふたつ」と表記してます…）
 -  関数の引数を*で始める（*argsが一般的）：複数の引数をタプルで受け取る
 -  関数の引数をアスタリスクふたつで始める（*ふたつkwargsが一般的）：複数の引数を辞書で受け取る（Markdownのエスケープがうまくできないので「ふたつ」と表記してます…）
 -  タプルはリストに似ているがリストよりも制約が多い（原則要素を追加削除変更・sortできない）⇔代わりに中身を固定したいときに便利、計算も少し早い
 -  1要素のタプルには　,　が必要
 -  パッケージ＝モジュールと＿init＿.pyを含むディレクトリ
 -  モジュール＝クラスと関数を書いたファイル、だと思えばよい
 -  理解の順番はurls→views→models→templateだが、作業の順番はmodels（どんなDBなのか）→（マイグレート）→views（何をどうリターンするのか）→urls（viewのファンクションが決まっていないと書けない・必要なhtmlが確認できる）→template（urlsに従って作るだけ）がやりやすい
 -  モデルのverbose_nameはadmin上で表示されるカラムの名称設定
 -  urlpatternでnameを設定しておくとHTMLから呼び出しやすい
 -  モーダルダイヤログについて

 
## わかってないこと
 -  book_idの有無はどこで見ているのか
 -  HTMLタグへの組み込み方（この辺は先日購入した本でもう一度勉強）
 -  formとviewでのDB操作まわりの記述全般


講座に従って一通り作り終えた後、作業手順を思い出しながら、順番にコードを眺め、実際にどういう処理が行われているのかイメージを付けました。
リクエストが行って、urlsがルーティングし、viewがmodelを操作し（modelはどう定義されているかも確認）、どのhtmlに渡しているか。
html上では何がどう表示され、どこにリンクが返っているか。リンク先はurlsでどこにまとめられていたか。
回を重ねるごとになんとなく全体が見えつつありますが、ゼロから作れるレベルには程遠い。。
1行1行わからないことを調べながら、当面は反復練習をしたいと思います。

この講座でできた書籍管理アプリは手を入れれば作りたいものにしていけそうな感じがするので、しっかり習得しておきたいと思います。

---
＜次の一歩＞


＜牛歩的経緯：自宅環境構築＞
[自宅待機を有効活用する① ～思い立ちからゴール設定まで](https://qiita.com/wahahahagi/items/9bdb192d8a55a5087dfe)
[自宅待機を有効活用する② ～LET'S NOTE CF-W8のHDDをSSD換装する話](https://qiita.com/wahahahagi/items/bf216504dbb79d0f9863)
[自宅待機を有効活用する③ ～2020年、ようやくXPをWin10に](https://qiita.com/wahahahagi/items/411b6c0f06d816bac4cc)

＜牛歩的経緯：Djangoと仲良くなる＞
[素人python日記① ～Django導入までの思考回路](https://qiita.com/wahahahagi/items/304229a520f2b0650f03)
[素人Python日記② ～Djangoガールズのチュートリアルをやる（初日）](https://qiita.com/wahahahagi/items/28162eae687c4c793d14)
[素人Python日記③ ～Djangoガールズのチュートリアルをやる（2日目）](https://qiita.com/wahahahagi/items/cfca309d344b616ddeb2)
[素人Python日記④ ～Djangoガールズのチュートリアルをもっかいやる（6日ぶり3日目）](https://qiita.com/wahahahagi/items/373acaa269e35f2e2713)
[素人Python日記⑤ ～参考書を手に取ってみる](https://qiita.com/wahahahagi/items/dbbda23a151303b9395a)
[素人Python日記⑥ ～ネット上にある講座をなぞってみる](https://qiita.com/wahahahagi/items/f106b21fdbab6c51c12e)
Chromeで複数のローカルHTMLファイルを開く手順

# はじめに
Google Chromeで複数のローカルHTMLファイルを開く手順です。

# 参考
https://qastack.jp/superuser/833312/how-to-open-multiple-local-html-files-in-google-chrome-at-once
https://oshiete.goo.ne.jp/qa/8860259.html

# 手順
1. 開きたい複数のローカルHTMLファイルを1つのフォルダに入れる。

2. 同じフォルダに、新しいテキストファイルを作成し、以下を入力。```
start chrome.exe --new-window
start chrome.exe filename_1.html
start chrome.exe filename_2.html
　　・・・
start chrome.exe filename_n.html```
3. ファイル拡張子を.batに変更して、実行（ダブルクリック）

4. すべてのファイルが異なるタブで開く。
※最初の3ファイルは別のウィンドウで開きました。open速度の問題なのか。。。解決策をご存知の方教えてください！

#おわりに
plotlyのグラフをhtmlで10-20個出力した後の確認作業で、いちいちダブルクリックorブラウザへドラッグが面倒だったので。
自分と同じように困っている人がいるかなと思って記事にしました。
【Unity】Terrainをエクスポートして別プロジェクトで使う

<img width="480" alt="スクリーンショット 2020-01-02 0.21.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/6c322636-2e8a-2e1e-5340-d99e741c0b3c.jpeg">


---

##TL;DR
- テレインを別プロジェクトに共有する際にハマったのでメモ
- テレインのあるプロジェクトを丸ごとインポートする

##環境
- Unity2019.3.6(エクスポート元、インポートイ先共通)
- Windows10

##課題
- terrainをエクスポートして、別のプロジェクトで利用したいと考えました
- というわけで、とりあえずprefab化してインポート先に投げつけてみました(prefab化などがわからない人は別途おググりください)
- 結果、以下のようになってしまいました

<img width="480" alt="スクリーンショット 2020-01-02 0.21.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/97231620-6401-7216-cd93-772e2d3b803b.png">
形は再現できたのですが草木、といいますか表面のテクスチャが反映されません。~~(激怒)~~

というわけで、まずはterrainのテクスチャを出力する方法を探ったのですが<b>いい方法が見つからず、沼でした</b>。

##やったこと
プロジェクトをシーンごとエクスポートする

- <b>ツールバーのAssetsからExport Packageでプロジェクトをエクスポートします</b>
    - 関係ないファイルは除外しましょう
    - シーンを含めるのをお忘れなく！
- <b>先ほどエクスポートしてきたシーンを開き、共有先のプロジェクトで、テクスチャ付きでテレインがあるのを確認します</b>
    - ここでも反映されない場合は、共有元のプロジェクトからエクスポートする際に必要なものが抜け落ちているかもしれません
- <b>別のシーンで反映させたい場合は、prefab化したterrainを改めてヒエラルキーに投げます</b>

↓結果です
<img width="480" alt="スクリーンショット 2020-01-02 0.21.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/6b9134da-59d6-99fb-fadc-3ca8441d1950.png">

期待通り、表面のテクスチャ付きで反映することができました！(祝)

##追記(20200504)：上と同じ手順でやってもなぜかテクスチャ反映されない問題
上の記事を書いた翌日に同じことをやっても再現性がありませんでした。~~(は？)~~
unitypackgaeをプロジェクトをインポートする際に、ドラックアンドドロップでやらずに、
Assets>import packages>custom packageからインポートすることで解決しました。何が違うのかはわかりません。汗

##参考
なし
MAMPを使ったWordpressでのWEB制作方法14　初心者向け

#MAMPを使ったWordpressでのWEB制作方法14　初心者向け

前回の記事はこちら
[MAMPを使ったWordpressでのWEB制作方法13　初心者向け](https://qiita.com/fumiya0414/items/b6fd2999b00b892d4326)

#メニュ項目の追加
現在メニューバーには事業内容、会社概要、お問い合わせが表示されています。
ここにカテゴリーへのリンクを追加しましょう。

[![Image from Gyazo](https://i.gyazo.com/419ad15900eaf3942eeaadfd71c0fef1.jpg)](https://gyazo.com/419ad15900eaf3942eeaadfd71c0fef1)

管理者画面/外観メニューを開きカテゴリーから項目を追加しましょう

[![Image from Gyazo](https://i.gyazo.com/7479264957045c315e0aadc3f3e23142.gif)](https://gyazo.com/7479264957045c315e0aadc3f3e23142)

並び替えや削除も可能です。

[![Image from Gyazo](https://i.gyazo.com/e34eb4706454bd8b4a6a48c95dc062c6.jpg)](https://gyazo.com/e34eb4706454bd8b4a6a48c95dc062c6)

他にもページネーションやパンくずリストなど
プラグインの導入によって簡単に機能を追加できますので
必要なものを都度いれながら制作していきましょう。

次回はオリジナルテンプレートの作成をします。

[MAMPを使ったWordpressでのWEB制作方法15　初心者向け](https://qiita.com/fumiya0414/items/f0f5dc5202ad9b1e3f8c)
Nuxt.js + Socket.io のつかいかたメモ

[どどんてぃ](https://twitter.com/search?q=%23%E3%81%A9%E3%81%A9%E3%82%93%E3%81%A6%E3%81%83&src=typed_query) のリファクタリングにあたりフレームワークをNuxtに変えようと思ってタイトルのあれこれを調べてみたらなんか全然うまく行かなかったので、素朴に [socket.ioの公式ドキュメント](https://socket.io/)を見ながら実装したらあっさりうまくいきましたってお話。公式ドキュメント大事。

# 初期設定
```bash
npx create-nuxt-app projectName
```
からプロジェクト作るわけですが、

* サーバーサイドのフレームワークはExpressにしておく
* レンダリングの方法はユニバーサルレンダリングにしておく

がやりやすいかと。あとはお好きに。無事プロジェクトフォルダが完成したら

```bash
cd projectName
npm install --save socket.io 
npm install --save socket.io-client
```

と socket.io 関連のライブラリをインストール

# サーバーサイド

適当に動作確認ができればいいので改変は最小限。

```javascript:server/index.js
const express = require('express')
const consola = require('consola')
const { Nuxt, Builder } = require('nuxt')
const app = express()
// socket.io の require
const socket = require('socket.io')

// Import and Set Nuxt.js options
const config = require('../nuxt.config.js')
config.dev = process.env.NODE_ENV !== 'production'

async function start () {
  // Init Nuxt.js
  const nuxt = new Nuxt(config)

  const { host, port } = nuxt.options.server

  await nuxt.ready()
  // Build only in dev mode
  if (config.dev) {
    const builder = new Builder(nuxt)
    await builder.build()
  }

  // Give nuxt middleware to express
  app.use(nuxt.render)

  // Listen the server
  // サーバ情報を保存しておく
  const server = app.listen(port, host)
  consola.ready({
    message: `Server listening on http://${host}:${port}`,
    badge: true
  })

  // ソケットの作成
  const io = socket(server)

  // 接続された時の処理
  io.on('connection', (socket) => {
    // 適当にイベントを送り返してみる
    socket.emit('news', { msg: 'hello!' })
    // イベントを受信した時の処理定義
    socket.on('ev', (msg) => {
      console.log('ev', msg)
    })
  })
}
start()
```

# クライアントサイド

```vue:pages/index.vue
<template>
  <div class="container">
    <div>
      <logo />
      <h1 class="title">
        projectName
      </h1>
      <h2 class="subtitle">
        description
      </h2>
      <div class="links">
        <a
          href="https://nuxtjs.org/"
          target="_blank"
          class="button--green"
        >
          Documentation
        </a>
        <a
          href="https://github.com/nuxt/nuxt.js"
          target="_blank"
          class="button--grey"
        >
          GitHub
        </a>
        <!-- イベント送信のためのボタンを追加 -->
        <a
          class="button--grey"
          @click="sendEve"
        >
          sendEv
        </a>
      </div>
    </div>
  </div>
</template>

<script>
// クライアントライブラリのインポート
import io from 'socket.io-client'
import Logo from '~/components/Logo.vue'

export default {
  components: {
    Logo
  },
  data () {
    return {
      socket: io()
    }
  },
  // マウントされた時に初期化をする
  mounted () {
    this.socket.on('news', (data) => {
      console.log(data)
    })
  },
  methods: {
    sendEve () {
      this.socket.emit('ev', 'hogehoge')
    }
  }
}
</script>

<style>
(略)
</style>
```

これでサーバサイドとクライアントサイドのコンソールを見ながら、イベントの送受信が確認できればオッケー。