OmniAICreator/Qiita-1.07M huggingface dataset:
HP Spectre アクティブペン で GIMP の筆圧を有効にする

# HP Spectre アクティブペン で GIMP の筆圧を有効にする

HP Spectre に添付されていた Spectreアクティブペン が GIMP で認識されなかったので、GIMP に認識させる設定です。


## Microsoft Pen Protocol

Spectreアクティブペンは Microsoft Pen Protocol (MPP) に対応していて、Windows で何も設定せずに **スケッチ** や **Whiteboard** でペン入力が使えます。

Spectre アクティブペンは、見つけた[こちらのレビュー記事](https://okiniiripasokon.com/blog-entry-1071.html)で紹介されています。

そのまま、GIMP でも筆圧が使えるだろうと思ったらそうはいきませんでした。

![ペン入力1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9477/c211556f-e593-a6dd-d5d0-fc6008bfe88d.png)

GIMP の **入力デバイスの設定** に、筆圧対応のペンデバイスが表示されません。

GIMP を起動する時に「ペンのタッチで起動する」必要があるという情報もあったのですが、タッチで起動しても同じ状態でした。

この状態でも、一応ペンのタッチによるブラシの描画自体は可能でした。ただ、筆圧は全く反応しません。


## wintab ドライバが必要

MPP のペンを使って、 GIMP に筆圧を検出させるには wintab ドライバが必要でした。

👉[Surface Pro4でGIMPを使う-GIMPでSurfaceペンの筆圧感知を有効にする方法](https://plusablog.me/?p=1697)

こちらのページでは、Surface ペンを GIMP に認識させる方法が紹介されていますが、Surfaceペンも HP Spectreアクティブペンも、どちらも MPP を使う方式のようなので wintab ドライバをインストールして MPP デバイスを GIMP に認識させてやります。

wintab ドライバは、[Surface 4 pro のダウンロードページ](https://www.microsoft.com/en-us/download/details.aspx?id=49498) から入手可能です。

OSが64bitの場合は64bit版のドライバを選びます。

    Download > Wintab_x64_1.0.0.20.zip


> ※注意
> 
> wacom のタブレットも使う人は色々注意があるようです。
> 動作がおかしいなと思ったら調べてみてください。
> 
> 例えば [Bambooの利用時の注意](http://us.wacom.com/en/feeldriver/) 、[ペンの遅れ](https://ask.clip-studio.com/ja-jp/detail?id=27694) 等
> 

wintab ドライバをインストールして再起動すると、Microsoft Device * としてペンが使えるようになります。

![ペン入力2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9477/6a496e14-979b-52bb-2f1c-9be12350c838.png)
「WSL」コマンドで何も起動しなくなった場合の対処

# WSLコマンドで何も起動しなくなった場合の対処

「今までWSLって打ったらUbuntuが起動していたのに、なぜか何も起動しなくなったよー。でもUbuntuと打ったらUbuntuが起動するよー」
という状況になった場合の対処

## デフォルト設定をすると治ります

WindowsPowerShellを起動して、下記コマンドを打つ。

```shell
wsl -s Ubuntu
```

※Ubuntu以外の場合は下記コマンドで対象ディストリビューションを確認する。

```shell
wsl -l -v
```
Vuguに触れてみた(環境構築編)

# はじめに
一時期小耳に挟んだ `Vugu` という技術について、今更ながら触れてみたので記事にしてみました。

# Vuguとは
`Golang` で、 `Vue.js` っぽくフロントエンド を記述できるライブラリです。
`WebAssebmly` で実行されるのでコードの漏洩がなかったり、実行速度も比較的高速らしいです。
公式URLは下記
https://www.vugu.org/
`2020/04/26` に `v0.3.0` が出たようなので、まだまだ発展途上の技術ではあります。

# 環境構築
環境構築だけなら、下記公式の手順を行なっていけばできます。
https://www.vugu.org/doc/start

## 前提
`Golang` の `v1.14` 以上らしいので、予めインストールをお願いします。
Macで、homebrewを使っていれば、下記コマンドだけでGolangのインストール可能です。

```
% brew install go
```
その他の方法に関しては、公式のインストールをご確認ください。
https://golang.org/doc/install

## vgrunのインストール
下記コマンドでvgrunのインストール、その他ツール群をインストールします。

```bash
[hoge@mac] ~/vugu_sample
% go get -u github.com/vugu/vgrun
[hoge@mac] ~/vugu_sample
% vgrun -install-tools
2020/05/24 17:20:08 Installing vugugen
2020/05/24 17:20:13 Installing vgrgen
[hoge@mac] ~/vugu_sample
```

## サンプルプロジェクトのダウンロード
公式の方がサンプルプロジェクトを用意してくださっているので、
こちらをダウンロードして利用していきます。
https://github.com/vugu-examples

下記コマンドで可能です。
(今回はsimpleリポジトリを利用しています。)

```bash
vgrun -new-from-example=simple .
```
上記コマンドを実行すると、ファイルがダウンロードされているかと思います。
`go.mod` も落ちてくるので助かりますね。

```bash
% ls -la
total 56
drwxr-xr-x   9 user staff   288  5 24 17:29 ./
drwxr-xr-x+ 99 user staff  3168  5 24 17:29 ../
-rw-r--r--   1 user  staff    24  5 24 17:29 .gitignore
-rw-r--r--   1 user  staff  1070  5 24 17:29 LICENSE
-rw-r--r--   1 user  staff   231  5 24 17:29 README.md
-rw-r--r--   1 user  staff   662  5 24 17:29 devserver.go
-rw-r--r--   1 user  staff    39  5 24 17:29 generate.go
-rw-r--r--   1 user  staff    48  5 24 17:29 go.mod
-rw-r--r--   1 user  staff  2380  5 24 17:29 root.vugu
```

## サーバーの実行
下記コマンドでサーバーを立ち上げます。

```bash
% vgrun devserver.go
2020/05/24 17:31:39 Starting HTTP Server at "127.0.0.1:8844"
```

その後、 `http://127.0.0.1:8844/` にアクセスします。
下記画面が表示されれば起動しています！

![スクリーンショット 2020-05-24 17.34.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66330/5b970d8f-3d30-0701-18b3-3e051fa9026d.png)

ちなみに、 `root.vugu` の内容を修正すると、ホットリロードで変更を反映してくれます。


# 終わりに
ほぼ公式チュートリアルの通りの内容になってしまいましたが、以上で環境構築手順は終了です。
現状のフロントエンドの代替となるかと言われると微妙な気がしますが、 
`golang` でフロントエンドが書けるのは嬉しいですね。
次回はroot.vuguの内容を修正したり、構文について見ていこうかと思います。
Adobe Captureを使って見ました！

#イラストよく知らなくても簡単にキャラクターを描く✍


![Adobe Capture](https://spc-jpn.co.jp/wp-content/uploads/2017/10/blog_img_02-1.jpg "Adobe Capture")

Qiitaのプロフィールに使える簡単なキャラクターアイコンを作りたかったです。もちろん既存にある可愛いキャラクターを使ってもいいが私が直接作って見たかったです。 コンピューターでするイラストレートには自信がなくて直接描いた絵をきれいにアイコン化する方法を探してみました。

その中で今回自分が選んだAdobe Capture CCとAdobe Illustrator CCを利用したキャラクターデザイン方法をご紹介します。
自分は無料体験版でやって見ました。

#1.下絵描き✏

鉛筆で下絵を描いてください。(**必ず薄く描いてください!**)

<img width="400" alt="niwatori" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/dc8f7c38-1895-23bd-40e4-34841abfdd60.jpeg>

#2.ペン作業🖌
ペン作業の際は、小タッチや線が切れることなく作業しなければなりません。
<img width="400" alt="niwatori" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/e98a9ffa-0aff-cde7-97ea-4e9da4c7985d.jpeg>

#3.Adobe Capture CCの活躍📲
携帯電話にAdobe Capture CCアプリをインストール後、自分の描いた絵を撮ります。 この時、イラストレーターアカウントとCapture CCアプリアカウントが同じか確認します。

私は写真を先に撮って携帯のアルバムに既に保存された写真を持ってくる形式を選びました。
左右に調節してラインを抽出できる領域を設定します。 下にいろんなオプションがありますが(韓国語で設定されている部分は無視してください)、今度はキャラクターを作る計画なので模様を選択して進めます。

<img width="400" alt="niwatori" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/e0e411b5-be21-6231-8111-72563a497ad9.png>

汚れた線を消したり、簡単な修正作業を行った後、"次"を押して画像を保存します。 保存された画像は、ライブラリタブで確認することができます。

<img width="400" alt="niwatori" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/ccafba0a-a658-561f-3eef-ce562629ba66.png>

#4.Adobe Illustrator CCの活躍💻
PCでAdobe Illustrator CCを実行させます。 新しい文書を開いて画用紙を新しく取り出します。 先ほどアプリに保存した絵をお持ちします。(ライブラリからお取りします。)

既にラインがすべて抽出されているので、ライブペイントツールを利用して色を塗ります。
全体を選択してライブツールを選択すると、グループが結ばれます。 この段階で好きな色を選んで特定の領域に撮ると、面が生成されて色が付きます。

<img width="400" alt="niwatori" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/771550b2-478a-cb7b-ed58-d6a44a7400c0.jpeg>

ライブペイントツールアイコンは、以下の画像を参考にしてください。
<img width="400" alt="niwatori" src=https://s3.amazonaws.com/webucator-how-tos/2530.jpg>

すべての作業が終了した後、希望する画像形式で抽出します。

<img width="400" alt="niwatori" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/3b6ac806-93b4-a3e1-6c4e-36f434501a2e.png>

#まとめに
人生で初めてキャラクターを作ってみました。 自分は絵が下手なので苦労しましたんですが、絵がもう上手な方なら、簡単で素早く自分のキャラクターを創造するのに役立つアプリだと思います。アプリにもAdobe Illustratorにも紹介した内容より多くの機能があるので、ぜひご利用してください。
CKA受験記

#CKA受験記
CKAを受験して合格しました。
すでに色々な方が書いていますので自身のメモがてら書きます。

## 受験時の勉強ツール
私が勉強したツール類はこちらです。
1. [Kubernetes完全ガイド (impress top gear) (日本語) ](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804)
2. [Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術 (impress top gear) (日本語)](https://www.amazon.co.jp/Kubernetes%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-impress-top-gear/dp/4295006637/ref=pd_lpo_14_t_0/356-6038422-6530700?_encoding=UTF8&pd_rd_i=4295006637&pd_rd_r=3ae23106-4f5f-4837-8d8d-cd35023b0221&pd_rd_w=5s14g&pd_rd_wg=A82Y9&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=5DM8YD41RGCYYART9ENR&psc=1&refRID=5DM8YD41RGCYYART9ENR)
3. [Docker/Kubernetes 実践コンテナ開発入門 (日本語) 単行本] (https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2/dp/4297100339/ref=asc_df_4297100339/?tag=jpgo-22&linkCode=df0&hvadid=295704876452&hvpos=&hvnetw=g&hvrand=4562014218489147717&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009298&hvtargid=pla-526880560751&psc=1&th=1&psc=1)
4. [Udemy CKA認定コース](https://www.udemy.com/ja/topic/certified-kubernetes-administrator-cka/)
5. [公式ドキュメント](https://kubernetes.io/docs/)

この中でも1,4,5は熟読、視聴を繰り替えしました。
2,3はそれぞれの用語が分からなくなった時に確認程度で読みました。
4については講師が英語かつ字幕も英語です。字幕もたまに間違っているので、見る際は注意が必要です。
ただ、一から勉強したい人には１の本を読んだ後に視聴することをおススメします。
理由としては、何言っているのか分からなくしないためです。
コース費用も高いですが、Udemyでは定期的に90％OFF等のキャンペーンもあるので、
タイミングよく受講してください。
5についてですが、日本語ではなく、英語のドキュメントを読んでください。
試験で認められているのは英語版です。

##受験勉強期間
試験勉強期間ですが、私は呑み込みが悪く合格までに4か月かかりました。
2か月で受験したのですが、その時は惨敗しました。。

その後2か月間Udemyで毎日1時間ずつくらい勉強しました。
Udemyでは模擬試験環境も用意されているのも良いですね。

##受験時に必要なもの
[こちらの方の記事を参考](https://qiita.com/oke-py/items/46ecb3f530a92273b130)にしました。

それと、個人証明書ですが日本では下記2点のいずれが必要です。
・パスポート
・クレジットカード

**日本の運転免許証や保険証は認められていません。**

##試験中に注意すべきこと
1. コマンド操作が基本的な問題であったり、ファイルの書き換え問題もあります。
当たり前かもしれませんが、ファイルのコピーや確認は一つ一つしていってください。
2. 試験時間が3時間と長いですが、問題的に結構ぎりぎりです。**お手洗いは必ず済ませてください。**
3. 試験で不安な問題はフラグを立てましょう。あとで読み返しやすいです。
4. 間違って試験中に本番環境からログアウト「exitコマンド」してしまった場合、画面リフレッシュで何とかなりました。。試験官の方からチャットも飛んできます。テンパったので助かりました。
5. kubeadmコマンドに注意。どの環境でやっているのかしっかり確認してください。
6. 試験環境のアップデートは早いこと

私の場合、下記コマンドのオプション(--restart=Always)がタイミングよく使えなくなっていました。```
kubectl run --restart=Always --image=nginx nginx
```


##やっておいて良かったこと
1. 公式ドキュメントの読み込み
2. YAMLファイルの読み込み
3. コマンド操作　[kubectlの補完機能](https://qiita.com/ttt_okamoto/items/55a5406d28c3002931bb)など
4. kubeletなどの設定やPodのログが見れること(トラブルシューティングで役立ちます。)

1については検索機能で何とかなりますが、やはりどこに何が書かれているのかすぐに見つけられるのはマストです。
2については細かいオプションまで覚えるのは不要ですが、大枠はつかんでいることが大切
3については、コマンドでの確認が必要です。
それと、Linuxコマンドの下記それぞれは使いました。
・tr
・awk
・wc
・sort

##さいごに
試験中もコマンドミスいっぱいしましたが何とかなり、無事合格しました。
![CKAバッジ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549922/d0309bdb-0f3a-92df-47d5-9af3198cf831.png)
試験で大切なのは正しい知識と検索力、それと落ち着いて試験を受ける気持ちだと痛感しました。
一発合格できるならそれでも良いですが、試験に万が一落ちても2回目は無料ですので、これから受験される方は落ち着いて受験してください。
Linuxディレクトリ構造

#Linuxディレクトリ構造とファイルの種類
Linuxのディレクトリ構造もまともに把握できないまま開発をしていたのでこの機会に勉強してみました。 Linux入門者は、まずLinuxの構造について先に習得し、Linuxに適応するのに早いです。


##Linuxファイルシステム構造
**[全体構造図]**
![linux.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/5368736e-c77a-a84e-ad6b-01027097727e.png)
🚩me/はただのユーザー名の例として認識してください。
### **/** (root)

最上のディレクトリであるルートディレクトリを意味。リナックスのすべてのディレクトリたちのスタート地点。すなわち、すべてのディレクトリを絶対経路で表記する際にこのディレクトリから始める必要がある。

### **/bin**
/binフォルダはBinary Folderの略で、OSの最小限の正常な駆動のため、すべてのユーザーが使用する実行ファイルが入っているフォルダ。 つまり、基本的なコマンドが保存されたディレクトリで、cat、chmod、chown、cp、date、echo、kill、ln、ls、mkdir、etxなどのプログラムが含まれる。 また、ルートユーザー、一般ユーザーともにアクセス可能。

### **/boot**
システム起動に必要なファイルが位置。GRUBのようなBoot Loaderに関するファイルがこのディレクトリに存在。

### **/dev**
deviceの略字でハードウェア機器を表すファイルが保存される場所。 キーボード、マウス、プリンターなどのデバイスをファイルまたはディレクトリの形で/devフォルダの中に存在。標準入出力により読み書きもでき、ディレクトリどこでもアクセス可能。

例)フロッピーディスクを持っている場合、/dev/fd0ディレクトリのfd0

### **/etc**
Linux設定のための各種ファイルを持っているディレクトリ。 etc文字の意味の通り、そのシステム全体で使用する設定のようなエトセトラデータが保存されるフォルダ。
システムのほぼすべての設定ファイルが存在するディレクトリ。

例)/etc/registry

### **/home**
ユーザーホームディレクトリ。
useraddコマンドで新しいユーザを生成すると、ほとんどのユーザのIDと同じ名前のディレクトリが自動的に生成される。

### **/lib**
カーネルモジュールファイルとプログラム(C、C++など)に必要な各種ライブラリファイルが存在するディレクトリ。
/bin/と/sbin/にあるバイナリに必要なライブラリ。

### **/media**
/mntディレクトリと区別必要。/mntはユーザーがマウントするパスとして使用される場合、/mediaはOSで自動的にマウントしてくれるポイントとして主に使用。

例)DVD、CD-ROM、USBなどの着脱が可能な装置(移動式メディア)がOSに自動的にマウンティングされるとすれば、主に/mediaフォルダ内にマウンティングポイントが生成。

### **/tmp**
オペレーティングシステムが使用しようがプログラムが使用しようが、臨時にデータを解読·削除した動作が必要ならばtmpに位置付ける。 システム使用中に発生した臨時データ等が保存。
システムを使用する全てのユーザーが共同で使用するディレクトリ。

例)セッション情報やワープロで作業するなら、現在まで保存されていない現在の作業内容などが保存。

### **/mnt**
/mediaディレクトリと区別必要。取り外し可能な装置に対してファイルシステムを臨時に接続するディレクトリ。
/mntはユーザーがマウントするルートとして使用。/mediaに置き換わる傾向。

### **/sbin**
/sbinフォルダは/binと類似しているが、ルートユーザのみ実行できるプログラムが位置。主にシステム管理者が使用するシステム管理者用のコマンドを保存しているディレクトリ。

例)ifconfig、e2fsck、ethtool、haltなどのコマンドが保存されている。

### **/opt**
追加で選択可能なアプリケーションパッケージがインストールされるディレクトリ。

例)Chromeブラウザなどのサードパーティアプリケーションのためのインストールディレクトリ。

### **/proc**
カーネル関連情報が保存されるディレクトリで、システム運用において非常に重要。 各プロセス名によって数多くのフォルダが存在し、現在実行されているプロセスに対する情報とデータが含まれている。 ディスク上に実際存在するのではなくメモリ上に存在するため、仮想ファイルシステムと呼ばれる。
実際の運用状態を正確に把握する重要な情報を提供し、現在実行中のカーネルのオプション値を直ちに変更可能なパラメータファイルが存在。

### **/root**
システム最高管理者であるrootアカウントのホームディレクトリ。(/ディレクトリとは別。)

### **/sys**
Linuxカーネルに関する情報があるディレクトリ。 現在のカーネルデータの構造属性など、現在のシステム全般についての内容を提供。 毎回再起動するたびに新しく作成。

### **/usr**
~~システムではなく、一般ユーザーが主に使用するディレクトリ。~~
~~基本実行ファイルとライブラリファイル、ヘッダーファイルなどのファイルが保存されている。 各ユーザ名に合ったフォルダ名が生成されており、各フォルダごとにbin、sbin、shared、libのように各ユーザが使用できるフォルダが位置。~~ 
> 「ユーザーアプリケーションがインストールされるディレクトリ。実行ファイルは bin、依存ライブラリは lib などにインストールされる。」

参考先：[@poad1010さんのコメント](https://qiita.com/nys9302/items/a8ddeedd3cd9d0deb332)：詳しい説明はこの記事の@poad1010さんのコメントを確認お願い致します。

~~主にシステムで最も多くの領域を占め、ルートユーザと自分自身のみアクセス可能。~~
主にシステムで最も多くの領域を占める。


>usr には、全ての ユーザー が使えるアプリをインストールするディレクトリです。
 OS本体をシステム、OS本体以外のアプリをユーザーアプリ。ユーザーアプリのうち、システム(OS)にログインできる全てのユーザーが利用可能なユーザーアプリをインストールする先が /usr です。インストールには root 権限が必要です。
Cドライブ
Linux では / に相当します。
───────
例)Windowの場合、~~Cドライブ、~~Program and Files。


### **/var**
Variableの略。 システム運用中に生成されて削除されるデータを ~~一時的に~~ 保存するためのディレクトリ。 その他すべての多用途に使用できるファイルが保存され、ファイルのサイズが後ほど拡張し続ける場合、より適合。

例)ログファイル(/var/log)、データベースキャッシングファイル、ウェブサーバーイメージファイルなどが位置。
IT関連専攻したら知るべき知識👩‍💻 第一講

#ITが専攻でない皆さんに

ITとはかけ離れた専攻で卒業して開発者になった私は学部専攻がITである人々との差がいつも気になりました。 知人の意見を引用すると、個人差はもちろんありますが、専攻者と非専攻者の差はコンピューターの構造に対する基礎知識量の差です。この知識を教える講義を通じて初心者開発者としての自分も点検する必要があると思いました。講義の内容を整理したノートを記録して行くので、ここに整理された雑多な概念を是非皆さんも自分の知識をセルフチェック📝 してみてください!<br/> 

参考講義：[コンピューター工学専攻必須オールインワンパッケージOnline](https://www.fastcampus.co.kr/dev_online_cs)
👆 上記の講義はCとC++を言語を前提に説明しています。

#IDE
プログラムの開発に使用されるコーディング、デバッグ、コンパイル、配布の全過程を統合的に管理できるソフトウェア
例）visual studio

**📣 <ソースコードから実行ファイルまで>📣**

![Group 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/b32740bc-d243-d617-58c3-5b540d41aeed.png)

**リンカー**❓ 様々なライブラリと接続
**実行ファイル**❓ 現在使用しているVisual Studioも結局実行ファイルである。

#変数と定数
###🚧 ライブラリ読み込み<br/>
   🔧  C/C++では、#includeコマンドを利用して様々なライブラリを読み込むことができます。<br/>
   🔧  家を建てるには金槌のような道具が必要なようにstdio.hはいろんな基本的な機能を持っています。

```C++
#include<stdio.h>
int main(void){
  printf("Hello World!");
  system("pause");
  return 0;
}
```
**stdio.h**❓standardioの略=standardinput/output=標準入出力

###🚧 メーン関数
 🔧 C/C++では、様々な関数が使用できますが、プログラムは常に**メイン関数**から始まります。
 🔧 関数は、返り値(Return Value)がない場合もありますが、**メイン関数**では常に0を返しているのが一般的です。

###🚧 基本的な出力関数
 🔧 C/C++でユーザに特定の文字を出力するために**printf( )**関数を使用します。
 🔧 **printf( )**は、stdio.hヘッダファイルに含まれています。

###🚧 セミコロン
 🔧 C言語では一つのコマンドが終わったことを知らせるために**セミコロン(;)**をつけます。

###🚧 システム機能の読み込み
 🔧 C言語では、システム( )関数を利用してオペレーティング体制の基本的な機能を利用できます。
 🔧 命令プロンプトでpause コマンドは、キーボードを入力するまで待機する機能を実行します。
Ruby Python Java 大文字小文字を区別しないソート

# はじめに
ソートと言えば、数値順・辞書順ですが、それ以外のソートについて調べてみました。
# 嵌った話
@jag_507 さんの*[AtCoderでRuby学習10【第一回アルゴリズム実技検定 DoubleCamelCase Sort】](https://qiita.com/jag_507/items/5cc3e09121679ef48f51)*を読んで、*[AtCoder 第一回アルゴリズム実技検定 F - DoubleCamelCase Sort](https://atcoder.jp/contests/past201912-open/tasks/past201912_f)*をやってみましたが、ソートがうまくいかないです。

```sort.rb
a = ["FisH", "DoG", "CaT", "AA", "AaA", "AbC", "AC"]
a.sort
 # => ["AA", "AC", "AaA", "AbC", "CaT", "DoG", "FisH"] # 実際の返り値
      ["AA", "AaA", "AbC", "AC", "CaT", "DoG", "FisH"] # 期待する返り値
```
この記事：*[sortコマンド、基本と応用とワナ](https://qiita.com/richmikan@github/items/cc4494359b1ac2f72311#-f%E8%BE%9E%E6%9B%B8%E9%A0%86%E3%81%AB%E4%B8%A6%E3%81%B9%E3%82%8B)*の様な`-f`オプションはないのか、~~ドラえもん~~Google先生助けてー。
# 大文字小文字を区別しないソート
*Ruby* に限らず多くのプログラミング言語の`辞書順のソートはASCIIコード順での並び替え`になりますので、大文字と小文字では大文字が若くなります。
そこで、大文字小文字を区別しないソートが必要になります。
## Ruby
```ruby.rb
a = ['a', 'b', 'c', 'd', 'e', 'A', 'B', 'C', 'D', 'E']
p a.sort
 # => ["A", "B", "C", "D", "E", "a", "b", "c", "d", "e"]
p a
 # => ["a", "b", "c", "d", "e", "A", "B", "C", "D", "E"]
p a.sort{|x, y| x.casecmp(y).nonzero? || x <=> y}
 # => ["A", "a", "B", "b", "C", "c", "D", "d", "E", "e"]
p a.sort_by{ |s| [s.downcase, s] }
 # => ["A", "a", "B", "b", "C", "c", "D", "d", "E", "e"]
```
*[casecomp](https://docs.ruby-lang.org/ja/latest/method/String/i/casecmp.html)* が大文字小文字を区別しないメソッドになります。
**追記**
コメント欄より`sort_by`の解法をいただきました。
最優先`s.downcase`と次優先`s`の2つ条件でソートを行っています。
## Python
```python.py
a = ['a', 'b', 'c', 'd', 'e', 'A', 'B', 'C', 'D', 'E']
print(sorted(a))
 # => ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
print(a)
 # => ['a', 'b', 'c', 'd', 'e', 'A', 'B', 'C', 'D', 'E']
print(sorted(sorted(a), key=str.lower))
 # => ['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e']
```
*[ソート HOW TO](https://docs.python.org/ja/3/howto/sorting.html)* に、大文字小文字を区別しない文字列比較の例が載っています。
***Python*** のソートは安定なことが保証されていますので、2重にソートする方法が考えられます。
## Java
```java.java
        List<String> a = Arrays.asList("a", "b", "c", "d", "e", "A", "B", "C", "D", "E");
        a.sort(Comparator.naturalOrder());
        System.out.println(a); // [A, B, C, D, E, a, b, c, d, e]
        a.sort(String.CASE_INSENSITIVE_ORDER);
        System.out.println(a); // [A, a, B, b, C, c, D, d, E, e]
```
***Java*** の場合、`CASE_INSENSITIVE_ORDER`が準備されています。
# まとめ
+ 大文字小文字を区別しないソート に詳しくなった
+ Ruby に詳しくなった
+ Python に詳しくなった
+ Java に詳しくなった
+ 自然順のソートまで手が回らなかった

参照したサイト
*[AtCoderでRuby学習10【第一回アルゴリズム実技検定 DoubleCamelCase Sort】](https://qiita.com/jag_507/items/5cc3e09121679ef48f51)*
*[sortコマンド、基本と応用とワナ](https://qiita.com/richmikan@github/items/cc4494359b1ac2f72311#-f%E8%BE%9E%E6%9B%B8%E9%A0%86%E3%81%AB%E4%B8%A6%E3%81%B9%E3%82%8B)*
*[casecomp](https://docs.ruby-lang.org/ja/latest/method/String/i/casecmp.html)*
*[ソート HOW TO](https://docs.python.org/ja/3/howto/sorting.html)*
*[[Java 8]コーディングテストで使えるアルファベット順、文字列長順のソート方法](https://qiita.com/riekure/items/79df368a4cbc6be1dda2)*
spannerの設計時に気を付けたこと

GKE+cloud spannerを使ってプロダクトをリリースしました。
その際に、spannerについていろいろ調べたり、設計をしたので備忘録としてまとめていきます。
spannerがどういったものかは他の記事を参考にしてもらって、この記事では気づきや工夫についてまとめていきます。

# UUIDはString(32)
spannerはリレーショナルDBのようなインクリメントするidが存在しません。
そのため、uuidをprimary keyとして使用しますが、その際の方は `String(32)`とするのがいいです。
一番最初に設計したときに、 `String(64)`としてしまったためにインターリーブする際にずっとこの型を継承しなければならず、見る度に後悔しています。。

# インターリーブはやりすぎない
初期の設計では、リレーショナルDBの正規化のように至るところにインターリーブをしていました。
しかし、インターリーブされたテーブルにレコードが集中するとホットスポットが起こりやすくなります。
そのため、子テーブルのデータが無限に増える可能性がある箇所はインターリーブしませんでした。

# 開発時は本番とは別プロジェクトで作る
spannerの利用を始めた時点では、エミュレータがなかったので本番とは別プロジェクトに自分用のdbを作り運用しています。
プロジェクトでは初期データがなく、困ることが多々あったので、簡単にデータを作れるapiを用意しています。

# マイグレーションは別レポジトリ
spannerをサポートしているライブラリが少ないないですが、スター数と使いやすさからこちらを選択しました。
https://github.com/golang-migrate/migrate/tree/master/database/spanner

# まとめ
初期のときに気にした点を簡単にまとめました。
今後もあったら追記していこうと思います。
レコード作成時にファイルをアップロードできるか？

レコード作成時にファイルをアップロードできるか？という質問があがっていました。

[Uploading files when creating a record](https://success.salesforce.com/answers?id=9063A000000eda1QAA)

回答としては

- ファイルは、レコードが作成された後にのみアップロードできます。一部のカスタムメカニズムでも実行できます。フォームアプリケーションの一部もそうですが、ファイルサイズの点で非常に制限されます。
- 方法はありますが、カスタムの方法です！これを実現するには、LightningコンポーネントまたはVFページを作成する必要があります。現在、標準的な方法は考えていません。または、レコードの作成後にファイルを追加できます。他の方法は、レコードが保存されたときにユーザーをファイルのアップロードにリダイレクトすることです。

[Attach File when Creating Record](https://success.salesforce.com/answers?id=9063A000000Do7rQAC)

- Salesforceで構築されたカスタムソリューションは、小さいファイル（最大16MB以下）しか処理できません。大きなファイルをアップロードできるのと同じ種類のアップローダーを使用する場合は、事前にレコードを作成する必要があります。プラットフォーム外のファイルを保存しない限り、カスタムソリューションを近づけることはできません。

結果としては、レコードを保存しないとできないですよね。思った通り。
[GAS] Spreadsheetのセルに入力された「日付・時刻」をGASで扱うときのデータ型

GoogleAppsScriptを使ってスプレッドシートでの作業を効率化・自動化しようと思った時に避けて通れないのは日付の扱い。例えば「あるセルに書かれた日付と、現在の日付を比較して、3日以内だったら、ある処理をおこなう」みたいな。

そしてスプレッドシート側には「表示形式」が設定できるじゃないですか。この表示形式の違いによって「日付・時刻が入ったセル」から取ってきた値がGASのコードの中で何になるのかついて調べました。

# 実験

## サンプルスプレッドシート

1行目はどの「表示形式」を指定したか、です。
デフォルト=表示形式について何も設定していない状態

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8612/b564f995-0ff3-228c-8f1a-8b9fce3767c4.png)


## サンプルコード

```js
function myFunction() {
  const sheet = SpreadsheetApp.getActive().getActiveSheet();
  const data = sheet.getRange("A2:E2").getValues()[0];
  
  // デフォルト
  console.log(data[0] instanceof Date); // => true

  // 日付
  console.log(data[1] instanceof Date); // => true

  // 自動
  console.log(data[2] instanceof Date); // => true

  // 日時
  console.log(data[3] instanceof Date); // => true
  
  // 書式なしテキスト
  console.log(data[4] instanceof Date);   // => false
  console.log(data[4] instanceof String); // => false
  console.log(typeof data[4] ); // => string
}
```

# 結果

* 「デフォルト、日付、自動、日時」のときは `Dateオブジェクト` として取得されました。(はじめは「文字列」なのかなって思ってました)
* 「書式なしテキスト」のときは `string` として取得されました。 (Stringオブジェクトではなく、プリミティブ型の `string`。 参考: [Primitive \(プリミティブ\) \- MDN Web Docs](https://developer.mozilla.org/ja/docs/Glossary/Primitive) )


実務の中では「スプレッドシートで日付が入るセルは(書式なしテキストではなく)日付/時刻を表現できる表示形式を設定しておく」がいいと思います。
pion/webrtc のexampleのタイムアウトを伸ばす

[pion](https://github.com/pion/webrtc) は Go で書かれた WebRTC 実装です。
これを試してみようとして、まずexampleを動かしてみようとしました。

https://github.com/pion/webrtc/blob/master/examples/README.md

通信を行うときに両者でお互いの通信条件を取り交わす必要があります。これをシグナリングと呼んでいます。
WebRTCではシグナリングの方法は仕様で定めらていません。
ここのexamplesでは、それを「コピぺ」によって行うようになっています。

(1) webページのフォームに表示された文字列をコピぺして実行ファイルの標準入力に食わせる。
(2) 実行ファイルの標準出力に出てきた文字列をコピぺしてwebページのもうひとつのフォームに入力する。
(3) webページ上の'Start Session'のボタンを押す。

やってみると、これがなかなかうまくいきません。(3)のボタンを押す直前でタイムアウトしてしまいます。
コピペする文字列は百行近くある巨大なものなので、スクロールしている間に時間がたってしまいます。
何度やっても間に合わなくてイライラが爆発しそうになったので、exampleを修正してタイムアウトを伸ばすことにしました。

```diff
diff --git a/examples/save-to-disk/main.go b/examples/save-to-disk/main.go
index 6318220..9effce0 100644
--- a/examples/save-to-disk/main.go
+++ b/examples/save-to-disk/main.go
@@ -33,6 +33,8 @@ func saveToDisk(i media.Writer, track *webrtc.Track) {
 }
 
 func main() {
+       s := webrtc.SettingEngine{}
+       s.SetCandidateSelectionTimeout(30 * time.Second)
        // Create a MediaEngine object to configure the supported codec
        m := webrtc.MediaEngine{}
 
@@ -42,7 +44,7 @@ func main() {
        m.RegisterCodec(webrtc.NewRTPVP8Codec(webrtc.DefaultPayloadTypeVP8, 90000))
 
        // Create the API object with the MediaEngine
-       api := webrtc.NewAPI(webrtc.WithMediaEngine(m))
+       api := webrtc.NewAPI(webrtc.WithMediaEngine(m), webrtc.WithSettingEngine(s))
 
        // Everything below is the Pion WebRTC API! Thanks for using it ❤️.
 
```

これで30秒の猶予ができたので、ゆっくりと操作してexampleを動かすことができるようになりました。
windowsでiverilog その4

# 概要

windowsでiverilogやってみた。
フリップフロップをassignで書いてみた。

# サンプルコード


```
module rs_ff(input s, r, output q, o);
	assign q = ~(r | o);
	assign o = ~(s | q);
endmodule

```

# テストベンチ


```
module test;
	reg s,
		r;
	output q,
		o;
	rs_ff u(s, r, q, o);
	initial
	begin
		$display("s r q o");
		$monitor("%b %b %b %b", s, r, q, o);
		s = 0;
		r = 0;
		#10;
			s = 1;
			r = 0;
		#10;
			s = 0;
			r = 0;
		#10;
			s = 0;
			r = 1;
		#10;
			s = 0;
			r = 0;
		#10;
			$finish;
	end
endmodule



```

# 結果


```
s r q o
0 0 x x
1 0 1 0
0 0 1 0
0 1 0 1
0 0 0 1

```

以上
Railsでよく使うRubyのメソッド

# はじめに
Ruby on Railsをメインに扱うWeb受託開発企業に転職し、約4ヶ月が経過しました。
初心者ながらにプロジェクトにアサインして頂き苦し楽しい毎日を過ごしております。
開発していく中でよく使うなーと思うRubyのメソッドをまとめていきます！

# 修正
- 20200531 コメント頂いた内容を基に修正しました｡

# メソッド一覧
### if
説明不要の条件分岐を実現する制御構造。
true,falseで評価し、実行する処理を分岐させる。

```ruby
if 条件式
  ifに対するtrue処理
elsif 条件式
  elsifに対するtrue処理
else
  falseの処理
end
```

### each
配列の要素を繰り返しの形で取得するメソッド。
RailsではDBのレコードを順に取得する際に利用しています。

```ruby
[1, 2, 3].each do |i|
  p i
end
出力
1
2
3
```

### map
こちらもeachメソッドと似ていますが、
DBのレコードを取得する際にカラム指定する際に利用しています。

例えば以下のテーブルがあった場合

```ruby
Usersテーブル
id |name        | age  | sex  | 
1  | テスト　一郎　| 20　　| 男   |
2  | テスト　花子　| 18　　| 女   |
3  | テスト　二郎　| 15　　| 男   |
```

このようにカラムを指定して取り出せます。

```ruby
Users.all.map(&:age)

出力
[20, 18, 15]
```

カラム指定でテーブルのid等を取得して、
関連付けされたテーブルを参照したりするのに便利です。
また、Whereメソッドと組み合わせ使用したりもよくします。

### where
DBからレコードを取り出す際にカラムとデータを指定して検索する際に使用します。
[map](#map)と同様のテーブルが存在した場合、以下の通りに取得できます。

```ruby
Users.where(age: 15)

出力
id |name        | age  | sex  |
3  | テスト　二郎　| 15　　| 男   |
```


### first
複数レコードが存在するDBの最初のレコードを取得します。
[map](#map)と同様のテーブルが存在した場合、以下の通りに取得できます。

```ruby
Users.first

出力
id |name        | age  | sex  | 
1  | テスト　一郎　| 20　　| 男   |
```

### present?,blank?,nil?
present?:値が存在すればtrue,存在しなければfalse。配列を評価する際に[]の場合nilとなりfalseとなる。
blank?:値といえるものがない場合、真となる。
nil?:変数の値がnilまたは、値なしの場合、真となります。

### 三項演算子
ifによる条件分岐が1度しかない場合によく利用します。
1行で条件分岐することができ、個人的にはスマートだと思います。

```
条件式? trueの処理 : falseの処理
```

### count
DBのレコードをカウントしたり、ページネーションに利用したりします。
[map](#map)と同様のテーブルが存在した場合、以下の通りに取得できます。

```ruby
Users.count

出力
3
```

## 参考文献
[Ruby 2.7.0 リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/doc/index.html)
[【Ruby入門】真偽判定present?の使い方をわかりやすく解説](https://www.sejuku.net/blog/66030)
Qt for Python OS間のフォントの差異を調整する

備忘録かつ添削をお願いしたく。
Widgetの大きさはどのＯＳでもほぼ同様に再現されるのですが、フォントの大きさがそろわない。DPIの違いと関係あるのだろうと当たりを付けてＯＳ間のフォントの大きさを調整するコードを書いてみました。

```python
from PySide2.QtCore import QOperatingSystemVersion
from PySide2 import QtWidgets,QtGui

    currentOsType = QOperatingSystemVersion.currentType()

    if currentOsType == QOperatingSystemVersion.OSType.MacOS:
        font.setPointSize(20)
        return(font)

    if currentOsType == QOperatingSystemVersion.OSType.Windows:
        font.setPointSize(20/1.33333)
    else:
        print(currentOsType)
        font.setPointSize(20/1.33333)

    return(font)
```
1.3333は、Mac72dpi, Windows96dpiという数値から出したものです。
自分の使っている環境ではこれでほぼ良しなのでそれ以上は調べていません。
Mac/Linuxのaliasでaws ssmによるパスワード管理を直感的にする

公私共にお世話になっているSSMですが、都度コマンドは何だっけと苦労してたのでaliasにしました。
正確には、引数を使う必要があったので、aliasではなくfunctionとして実装しました。以下のように利用できます。

```bash
$ setssm TEST_KEY test_val #登録して
$ getssm TEST_KEY #参照する
test_val #出力
$ setssm TEST_KEY2 "test space日本語" #スペース、日本語の処理も可
$ echo HOGE$(getssm TEST_KEY2)FUGA #コマンド上で展開し変数としても扱える
HOGEtest space日本語FUGA
$ listssm | grep TEST #一覧の出力からgrepで検索し、TESTを含むキーと値を出力
TEST_KEY test_val
TEST_KEY2 test space日本語
```

実装は`~/.bash_profile`の終わりに以下を追加し、`source ~/.bash_profile`で更新するだけです。

``````bash:~/.bash_profile
function setssm() {
  command aws ssm put-parameter --name $1 --type "String" --overwrite --value "$2";
}
function getssm() {
  command aws ssm get-parameter --name $1 --query 'Parameter.Value' --output text;
}
function listssm() {
  command aws ssm get-parameters-by-path --path "/" --query "Parameters[].[Name,Value]" --output text
}
```

個人的に最も捗るのはコマンドを会社用と自分用に分けてしまうことです。`setssm_private`と`setssm_corp`などコマンドを２パターン用意し、--profile引数をそれぞれに付与するとパーソナルな情報を会社のssmにアップしたりその逆を避けれます。

最近は認証情報もSSM経由で取り扱えるフレームワークが増えてきて、レポジトリに認証情報をアップするリスクや心配が無くなってきていいですね。皆様も良いAWSライフを。

参考
https://github.com/aws/aws-cli/issues/1961
https://hacknote.jp/archives/8043/
https://dev.classmethod.jp/articles/aws-cli-all-ssm-parameter-get/
https://qiita.com/tomoya_oka/items/a3dd44879eea0d1e3ef5
C# 勉強(3)  ファイル入力

ファイルを入力し店舗別売上を集計する。

１、プログラム

```c#
:Program.cs
using System;
using System.Collections.Generic;
using System.IO;


namespace Sec0225
{
    class Program
    {
        static void Main(string[] args)
        {
            SalesCounter sales = new SalesCounter(ReadSales("sales.csv"));
            Dictionary<string,int> amountPerStore = sales.GetPerStoreSales();
            foreach(KeyValuePair<string,int>obj in amountPerStore){
                Console.WriteLine("{0}{1}",obj.Key,obj.Value);
            }
        }
        static List<Sale>ReadSales(string filePath){
            List<Sale>sales = new List<Sale>();
            string[] lines = File.ReadAllLines(filePath);       //テキストファイル読む
            foreach(string line in lines){                      //１行づつ処理
                string[]items = line.Split(',');                //行を分解
                Sale sale = new Sale{                           //分解したデータからオブジェクト作成
                    ShopName = items[0],
                    ProductCategory = items[1],
                    Amount = int.Parse(items[2])
                };
                sales.Add(sale);                                //オブジェクトをリストに追加
            }
            return sales;                                       //結果を返す
        }
    }
}
```

２．クラス

```c#
:Sale.cs
using System;

namespace Sec0225{
    public class Sale{
        public string ShopName { get; set; }
        public string ProductCategory { get; set; }
        public int Amount { get; set; }
    }
}
```

```c#
:SalesCounter.cs
using System;
using System.Collections.Generic;

namespace Sec0225{
    public class SalesCounter{
        private List<Sale> _sales;

        public SalesCounter(List<Sale>sales){
            _sales = sales;
        }
        public Dictionary<string,int> GetPerStoreSales(){
            Dictionary<string,int> dict = new Dictionary<string, int>();
            foreach(Sale sale in _sales){
                if(dict.ContainsKey(sale.ShopName))
                    dict[sale.ShopName]+=sale.Amount;
                else
                    dict[sale.ShopName]=sale.Amount;
            }
            return dict;
        }
    }
}
```
【UE4】Bindさせたい場合はAddBindingByTagを使おう【UnrealEngine4.24~】

#はじめに
「AddBindingByTag」というBlueprintノードがUE4.24から追加されたことを知っているだろうか？
僕は知らなかった
Bindさせたい場合、従来の「GetSequenceBinding」ノードを使ってBingingIDを取得していたのだが、普段から使っている人はわかってもらえると思うのだがこれがすごい面倒
たいていこの設定を行ってもらうのはエディタに慣れていないアーティスト側だったりするので色々なパターンに応じたドキュメントを作成しなくてはならなかったり手順書を保守し続けなくてはならないというPG側の負担がバカにできないのである
なので、文字列でBind指定できないかなぁと思っていたら「AddBindingByTag」の使い方を教えてもらったので記事として残しておく
内容はとても簡単なのだが、このノードの名前で検索してもびっくりするほどヒットしないので「お前が書くんだよ」という声が聞こえた
(2020/05/25現在の検索ヒット数)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/6ebea4c2-1f4b-0bf3-32c7-87f47ed67718.png)

#HowTo
ぶっちゃけ、おかずさんのこのツイートがすべてである
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">UE4.24で入った「新機能：シーケンサーにおける紐づけされた Object Binding」の使い方が分かった。こんな感じにタグ名指定でマスター・サブシーケンスに対してObject Bindingを一気にできる！ <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://twitter.com/hashtag/UE4Study?src=hash&amp;ref_src=twsrc%5Etfw">#UE4Study</a> <a href="https://t.co/a8OuyGpEPx">https://t.co/a8OuyGpEPx</a> <a href="https://t.co/uI0IYgtREG">pic.twitter.com/uI0IYgtREG</a></p>&mdash; おかず (@pafuhana1213) <a href="https://twitter.com/pafuhana1213/status/1212746397784539136?ref_src=twsrc%5Etfw">January 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

が、一応ここでも手順をおさらいしておく...

##1.任意のレベルシーケンスのBindさせたいObjectにTagを設定する
サンプルのレベルシーケンスはActorの位置座標をアニメーションさせるだけの単純なもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/2f8ff170-a1ce-3492-9537-ef2634a2a344.png)

##2.LevelSequencePlayerを使っているところで「AddBindingByTag」ノードの引数に先ほど指定したTagと同じ文字列を渡す
BindするActorはてきとーなものを用意している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138731/c3973b04-8be8-7957-a16e-21ff3646bd76.png)

###結果
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">記事用 <a href="https://t.co/5EA9Hjofgk">pic.twitter.com/5EA9Hjofgk</a></p>&mdash; ジョニー@JGS開発室 (@JGS_Developer) <a href="https://twitter.com/JGS_Developer/status/1264685268570796038?ref_src=twsrc%5Etfw">May 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
php（関数と引数）

関数と引数について理解したことを備忘録として記録します。

●ユーザー定義関数の型
function 関数名（引数１、引数２、…）{
//処理内容
return値；
}

例）
<?php
function heikin($num1, $num2){
    $result = ($num1 + $num2) / 2;
    print $num1.'と'.$num2.'の平均は'.$result.'です</br>';
}

heikin(10, 8);
heikin(3, 23);

・出力結果
PHPのテストです。

10と8の平均は9です
3と23の平均は13です
初心者によるプログラミング学習ログ 325日目

#100日チャレンジの325日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
325日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>325日目 1.5h<br>・架空LP模写12日目1.5h（<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a>）<br>・架空LP模写：お問い合わせ部分を作成<br><br>部屋の片づけをほぼ1日やっていた<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1264647481117126656?ref_src=twsrc%5Etfw">May 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
apache2 入門

# official page

[apache2 official page](https://httpd.apache.org/)



# how to install

```bash
$ sudo apt update
$ sudo apt install apache2
```



# how to start 

```bash
$ sudo service apache2 start
```



# comand line option

```
Usage: apache2 [-D name] [-d directory] [-f file]
            [-C "directive"] [-c "directive"]
            [-k start|restart|graceful|graceful-stop|stop]
            [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
-D name            : define a name for use in <IfDefine name> directives
-d directory       : specify an alternate initial ServerRoot
-f file            : specify an alternate ServerConfigFile
-C "directive"     : process directive before reading config files
-c "directive"     : process directive after reading config files
-e level           : show startup errors of level (see LogLevel)
-E file            : log startup errors to file
-v                 : show version number
-V                 : show compile settings
-h                 : list available command line options (this page)
-l                 : list compiled in modules
-L                 : list available configuration directives
-t -D DUMP_VHOSTS  : show parsed vhost settings
-t -D DUMP_RUN_CFG : show parsed run settings
-S                 : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG
-t -D DUMP_MODULES : show all loaded modules 
-M                 : a synonym for -t -D DUMP_MODULES
-t                 : run syntax check for config files
-T                 : start without DocumentRoot(s) check
-X                 : debug mode (only one worker, do not detach)
```

引用) https://httpd.apache.org/



# check for config files

```bash
# run syntax check for config files
$ apache2 -t
```



# /var/www/html

apache2が動いていることを確認する。

```bash
$ curl localhost && echo success || echo failed
```

Apacheがブラウザに送ってくれているhtmlは /var/www/html/ となっている。

ここを **ドキュメントルート** という。

ここにファイルを配置する事でApache経由で参照する事ができるようになる。



ドキュメントルートに移動する

```bash
$ cd /var/www/html
```

```bash
$ touch test.html
```

```bash
$ echo "Hello World!" > ./test.html
```



ブラウザを起動し、下記のように入力する。
`[IPアドレス]/test.html`



# ドキュメントルートの変更

`/etc/apahce2/apache2.conf`

を変更する。

```
<Directory /var/www/> 
</Directory>
```

となっている部分を以下のように変更する。

```
<Directory /home/ubuntu/www>    
</Directory>
```

その後、apache2を再起動する。

```bash
$ sudo service apache2 restart 
```
vercelでサブドメインを外部サービスに向ける方法

# 概要
vercelにカスタムドメインを設定すると自動的にサブドメインもvercelに向くようになります。
特定のサブドメインはvercel以外のサービスに向けたい時の方法を紹介します。

# 対応
CLIからDNS設定を追加します。
フォーマットとしては下記の通りです。

```
vercel dns add <DOMAIN> <SUBDOMAIN> <A | AAAA | ALIAS | CNAME | TXT>  <VALUE>
```


例えば `https://foo.mogurastore.com/` を別サービスに向けたい場合は

```
vc dns add mogurastore.com foo CNAME <VALUE>
```

のように設定します。

# 参考
https://vercel.com/docs/cli#commands/dns
https://vercel.com/knowledge/pointing-subdomains-to-external-services
Rubyのバージョンを変えたらbundle installができなくなった

#事件発生
ある日のことだった

```
$ bundle install
```
を入力すると

```
Traceback (most recent call last):
~/.rbenv/versions/2.5.0/bin/ruby: invalid option -:  (-h will show valid options) (RuntimeError)
```

ええええ何だこれ！
他のコマンドも受け付けてくれない、何をしでかしたんだ…
#これまでを振り返ってみよう
自分が致命的な何かをしてしまったはず…
##Ruby : 2.7 で開発していた
```
(自分の環境)/vendor/bundle/ruby/2.7.0/gems/active_hash-3.1.0/lib/associations/associations.rb:22: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
(自分の環境)/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.1/lib/active_record/associations.rb:1657: warning: The called method `belongs_to' is defined here
```
Railsコマンドを入力すると警告がたくさん出て鬱陶しいな
gemの警告は大事だけどまあいっか
##環境変数を追加して対処
```
export RUBYOPT='-W:no-deprecated -W:no-experimental'
```
`.zshrc`に上を追加したら警告が消えたよストレスフリーだね


##Rubyのバージョンを下げて開発しなければならなくなった
別バージョンでの開発が不可欠になったのでバージョンを下げました(Ruby:2.5)

```
Traceback (most recent call last):
~/.rbenv/versions/2.5.0/bin/ruby: invalid option -:  (-h will show valid options) (RuntimeError)
```
今までは別のバージョンにしてもこんなこと起きなかったのにな…

#結論
```
export RUBYOPT='-W:no-deprecated -W:no-experimental'
```
環境変数からこれを削除したら解決しました。
gemのバージョンが上がって警告が出なくなったら忘れずに削除しないとね。

#参考
https://qiita.com/mojihige/items/ce3282bec0c58f8ba637
https://qiita.com/hirocueki2/items/010c777d2125ee120a8e
機械学習の学習サイト紹介

#はじめに
＊インフォマティクス初学者が参照した学習サイトの紹介です。

初めまして。
メーカーで材料の研究開発に従事している技術者です。
最近はインフォマティクス系にも関わり、試行錯誤している最中です。

感染症拡大により在宅勤務が多くなってから、
現場で実験ができなくなったため、インフォマティクスに関する学習をしていました。
備忘録として参照させていただいたサイトをまとめました。
＊書籍や有料サイトなども活用していますが、今回は無料学習サイトに限定しました。

#学習サイト一覧
##1. データサイエンスのためのPython入門講座
米国でデータサイエンティストとして御活躍されているかめさんのブログです。<sup>[[1]](https://datawokagaku.com/python_for_ds_summary/
)</sup>
[1] https://datawokagaku.com/python_for_ds_summary/

初期の環境構築から基本的な動作方法まで詳細に記載されており、初学者の私でも何とか環境構築することができました。
今でも問題が発生した時には振り返るようにしています。

内容としては下記の通りです。
・環境構築
・Python基本
・NumPy
・Pandas
・matplotlib
・Seaborn
・その他便利ライブラリ・モジュール等

ここで環境構築および基礎となる動作方法を習得しました。

##2. KIKAGAKU
"最先端を、**最短距離で身につける。**初学者から始められる学習サイト"
との記載どおり一連の流れを学ぶことができます。<sup>[[2]](https://www.kikagaku.ai/)</sup>
[2] https://www.kikagaku.ai/

内容としては下記の通りです。
・はじめに
・データサイエンスの基礎
・機械学習の基礎
・ディープラーニングの基礎
・画像認識の基礎
・自然言語処理の基礎

特に"機械学習の基礎"部分を学習しました。<sup>[[3]](https://www.kikagaku.ai/tutorial/basic_of_machine_learning/learn/machine_learning_regression)</sup>
[3] https://www.kikagaku.ai/tutorial/basic_of_machine_learning/learn/machine_learning_regression

このパートでは、
・機械学習 実践（教師あり学習：回帰）
・機械学習 実践（教師あり学習：分類）
・機械学習 実践（ハイパーパラメータ）
・機械学習 実践（教師なし）
を学習することができます。

実際にデータを活用した機械学習ができるため、進め方のイメージを習得することができました。


##3. coursera
スタンフォード大学が提供する機械学習の学習サイトです。<sup>[[4]](https://www.coursera.org/learn/machine-learning?action=enroll&adgroupid=80109820241&adpostion=&campaignid=2070742271&creativeid=369041663186&device=c&devicemodel=&gclid=CjwKCAjwtqj2BRBYEiwAqfzur9NcopOC9leTvGIkuOeBlbDyZ77c381UXDOkFU5Tk7jfZ9QGuJZnnxoCpmsQAvD_BwE&hide_mobile_promo&keyword=machine+learning+mooc&matchtype=b&network=g&utm_content=07-StanfordML-ROW&utm_medium=sem&utm_source=gg)</sup>
英語講義となりますが、☆4.9と高い評価を得ています。
[4] https://www.coursera.org/learn/machine-learning?action=enroll&adgroupid=80109820241&adpostion=&campaignid=2070742271&creativeid=369041663186&device=c&devicemodel=&gclid=CjwKCAjwtqj2BRBYEiwAqfzur9NcopOC9leTvGIkuOeBlbDyZ77c381UXDOkFU5Tk7jfZ9QGuJZnnxoCpmsQAvD_BwE&hide_mobile_promo&keyword=machine+learning+mooc&matchtype=b&network=g&utm_content=07-StanfordML-ROW&utm_medium=sem&utm_source=gg

内容としては下記の通りです。
・Introduction
・Linear Regression with One Variable
・Linear Algebra Review
・Linear Regression with Multiple Variables
・Octave/Matlab Tutorial
・Logistic Regression
・Regularization
・Neural Networks: Representation

約54時間で修了の内容ですが、初学者である私にとっては非常に参考になりました。

#終わりに
様々なサイトを参照しましたが、独断で特に役に立ったサイトを御紹介いたしました。
まだまだ理解の至らないところが多々ありますが、都度調べて解決していければと思います。
皆様からも特に役に立ったサイトがあれば、ご教示いただけると幸いです。
1Z0-063 試験勉強＆自作問題 オラクルマスター Gold Oracle Database12c フラッシュバック機能編 

フラッシュバック機能編

#目的
silver12c受験時に、参考書から自分で問題を予想することで得点源になるのでは？と思ったので適当に自作問題。

オラクルマスター試験勉強用に参考書を読んでいるが、圧倒的テキスト量のため自分用にまとめてOracleDatabaseに関する知識・技術を整理する。
公式ドキュメントを調べ、内容を補完する。

##※注意
あくまで、自作問題のため実際の試験とは何の関係もありません。
試験内容チェックリストを元に公式ドキュメントを調べ、問題を予想し、作成しています。

■[マルチテナントアーキテクチャ](https://qiita.com/caster3045/items/51eb12b7a38de3167574)

■[RMAN機能](https://qiita.com/caster3045/items/5a9122555b805b9faef4)

■[その他](https://qiita.com/caster3045/items/ef1504f35c14cdc417f5)

___
Q：フラッシュバックデータアーカイブの概要
A：①テーブルがフラッシュバックデータアーカイブであり、作成時間よりも前の時間を指定した場合、クエリはエラーを発生させるのではなく、そのテーブルに対してゼロ行を返します
　 ②12.1.0.1の場合CDBではサポートされていない。
　 ③フラッシュバックデータアーカイブを無効にしないと表を削除できない。
　 ④フラッシュバックデータアーカイブの名前を設定していない場合、デフォルトのフラッシュバックデータアーカイブの名前が使用される。


Q：フラッシュバックトランザクションを実行するための条件は？
A：サプリメンタルロギングの有効化
　　DBMS_FLASHBACK.TRANSACTION_BACKOUTプロシージャのEXECUTE権限
　  ARCHIVELOGモードであること
　　実行ユーザーにSELECT ANY TRANSACTION権限がある
　　注意：表の論理構造を変更するDDL操作はできない


Q：フラッシュバックバージョンクエリでのバージョンの照会の指定方法を示してください。また、この機能では何を表示しますか？
A：①照会の指定方法
　　VERSIONS_STARTSCN～VERSIONS_ENDSCN、
　　VERSIONS_STARTTIME～VERSIONS_ENDTIME
　　VERSIONS_XID、
　　VERSIONS_OPERATION
　 ②行の変更を元に戻すために必要なSQLや変更を担当するユーザーなど、このトランザクションのメタデータを見つけることができる。
　 ③指定された時間間隔の任意の時点で存在した行の各バージョンの行を含む表を返す


Q：フラッシュバックデータベースを有効にしたい。前提条件を示してください
A：①高速リカバリ領域が構成されている
　 ②ARCHIVELOGモードである
　 ③必要な期間がDB_FLASHBACK_RETENTION_TARGET初期化パラメータに設定されている


Q：フラッシュバックデータアーカイブを設定する前提条件
A：自動UNDO管理/自動セグメント領域が有効

___
###コマンド
Q：FLASHBACK TABLE ExSchema.ExTable TO BEFORE DROP;
　 このコマンドが成功するための条件
A：①ExSchemaに同じ名前の表が存在しないこと
　 ②FLASHBACK ANY TABLE権限
　 ③ゴミ箱を有効化しておく


Q：フラッシュバックアーカイブが有効の表があります。トランザクションの保存期間を2年から1年に変更しようと思い、次のコマンドを実行しました。
　 ALTER flashback archive fda MODIFY RETENSION 1 YEAR;
A：1年より前のデータはfdaから削除される。


Q：exsample表を削除しました。FLASHBACK TABLEコマンドを使用して回復しました。
exsample表のオブジェクトはどうなりますか？
A：①参照整合性制約を除く、テーブルで定義されたすべての制約がフラッシュバックされる
　　　⇒トリガー、クラスタ、索引もフラッシュバックされる。
　　　⇒トリガーはフラッシュバック中はいったん無効になるが、完了後に再び有効になる
　 ②表に関連付けられたLOBセグメントがフラッシュバックされる


Q：フラッシュバックアーカイブが有効になっている表exampleがあります。この表に対し、ALTER TABLE example ADD newExampleColumn VARCHAR(10);を実行し、列を追加しました。
この動作はフラッシュバックデータアーカイブにどのような影響を及ぼしますか？
A：コマンドは正常に実行され、今後もexample表に対するメタデータを保存し続けます。
　　⇒ひっかけ問題、バージョン11ｇまではDDL文を実行できませんでしたが、12ｃからは実行可能です。また、フラッシュバックバージョン問合せのDDL以前のデータは確認できない。ということと勘違いしないようにしましょう
Ubuntu18.04にPython3.8を入れる

Ubuntu18.04のpython3デフォルトバージョンは3.6.9ですが、それを3.8.0にします.

# 結果
`Python3`でpython3.8.0が走る.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517356/7cfd030b-fb56-5b16-a1b1-203d4aed5d42.png)


# 手順
#### update.shを実行

```:update.sh
sudo apt update -y
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo apt autoremove -y
sudo apt autoclean -y
```
#### python3.8をinstall

```:python3.8.0のインストール
sudo apt install -y python3.8
```
#### デフォルトを変更する

```:デフォルトを変更

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
sudo update-alternatives --config python3
```
実行したら、下のようなやつが出てきたのでpython3.8の`Selection`を入力.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517356/fa44d5be-9b23-05fc-b9bf-2fd80f4da71f.png)

```:version確認
python3 --version 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517356/6340c13a-f3f6-e81d-b5b3-b911e896eb41.png)
#### pipが壊れた
pipでなんかインストールしようとしたら壊れた
(スクショ忘れましたが、pipコマンドがないよ！みたいに怒られます. ぜひお試しを)

#### pipを直す
[公式さん](https://pip.pypa.io/en/stable/installing/#upgrading-pip)に書いてあったので実行.

```:pipを直す
python3 -m pip install -U pip
```
(公式とは違い**`python3`で実行**してます.)
手順は以上です.

# 参考
[Ubuntu 18.04 に Python 3.8 をインストール（OS標準）](https://qiita.com/witchcraze/items/1054e297a9644c748492)@witchcraze さん
[Ubuntu 18.04 に Python3.7を入れる](https://qiita.com/rurou/items/edbb06538e81e01ec387)@rurou さん

# あとがき
前やったときはソースコードからビルドする必要がありましたが、今回は`apt`で済んだので楽だなぁって思いました.
データ活用人材育成

ビジネス力：事業会社、コンサル
データサイエンス：Kaggle
データエンジニア：SIer
英語：英会話


# ビジネスの課題に対してどのML技術を使えばいいかわかるためには
・数理モデル全体のイメージを掴むこと（HOW:技術の理解を広げる、深める）
・ビジネス適用事例を収集する、常にアンテナを張る。収集した事例は他にどのように応用できそうか妄想する。（APPLY)
・経営戦略を学ぶ、実践する（WHAT:)

以上を息を吸うように実践する。

# そもそも、今後の社会を生き抜くためのスキル
金融リテラシ：生きるための最も身近なツールであるお金をしっかり知る
経営リテラシ：新しい価値を創造する、課題を解決する
コンピューターリテラシ：ネットワークの動作原理、Webの動作原理など、基本を知らないと仕事を進める上でトラブルシュートができず、非効率
AI/MLリテラシ：AI/MLで何ができるかは、基礎スキルとして必須
英語：基礎スキルとして必須。最新技術は全て英語で展開されるため。


# 学習コンテンツ
## コード
東京工業大学「Python早見帳」
https://chokkan.github.io/python/index.html

東京工業大学「機械学習帳」
https://chokkan.github.io/mlnote/index.html

総務省監修の高校教材『データサイエンス・データ解析入門』
https://www.stat.go.jp/teacher/comp-learn-04.html

## スライド
東大 数理・情報教育研究センター『数理・データサイエンス・AI教材』
http://www.mi.u-tokyo.ac.jp/6university_consortium.html

## AWS
東大計数工学科が無料公開しているAWS講義ノート「コードで学ぶAWS入門」
https://tomomano.github.io/learn-aws-by-coding/

## 講義形式
筑波大学「機械学習講義」
https://ocw.tsukuba.ac.jp/course/systeminformation/machine_learning/

筑波大学「データサイエンス関連講義」
https://ocw.tsukuba.ac.jp/data-science/

ハーバード大学 コンピュータサイエンス入門講座「CS50」
https://cs50.jp
開発中に使用するGitコマンド

#はじめに
初めてGitを使いチーム開発をすることになり、使い方を検索しました。
Gitの情報はいっぱいありましたが、自分でリポジトリを作成して、
コミットするという内容が多く、実際に業務で使用するイメージがつかめませんでした。
今回は雑食系エンジニアの勝又健太さんが YoutubeでGitの使い方を解説していたので、
その動画を参考にして、以下にコマンドの使い方と流れをまとめました。

https://www.youtube.com/watch?v=wlY8YG-eB8E

下記の方法で実際にリモートリポジトリからクローンして、プルリクエスト、レビュー、
マージまで行うことが出来ました。

##開発の流れ
[1.リモートリポジトリからclone](#1リモートリポジトリからclone)
[2.ローカルブランチの作成](#2ローカルブランチの作成)
[3.開発作業](#3開発作業)
[4.編集したファイルの差分を確認](#4編集したファイルの差分を確認)
[5.ステージング環境へ追加](#5ステージング環境へ追加)
[6.ローカルブランチにコミット](#6ローカルブランチにコミット)
[7.リモートリポジトリへpush](#7リモートリポジトリへpush)
[8.プルリクエストの作成](#8プルリクエストの作成)
[9.レビューの結果を反映](#9レビューの結果を反映)
[10.ローカルブランチを最新化](#10ローカルブランチを最新化)

####[1.リモートリポジトリからclone](#リモートリポジトリからclone)

```git
git clone https://github.com/XXXXX
```

####[2.ローカルブランチの作成](#ローカルブランチの作成)
今回は「command_register_user」というブランチを作成して
作業していく想定で説明します。


ブランチを作成する

```git
git branch command_register_user
```

ブランチの命名法
プロジェクトの命名規約があればそれに従う。

追加　feature/command_register_user
修正　fix/command_register_user

masterから作成したブランチに移動

```git
git checkout command_register_user
```
####[3.開発作業](#開発作業)
issueの内容に沿って開発をする。

####[4.編集したファイルの差分を確認](#編集したファイルの差分を確認)
変更したファイルの一覧を確認

```git
git status
```

変更したファイルの差分を確認

```git
git diff
```

####[5.ステージング環境へ追加](#ステージング環境へ追加)
編集および追加したファイルをステージング環境へ追加する。
-Aとつけるとファイル全てを選択します。
指定したファイルのみaddしたければファイル名を指定します。

```git
git add -A
```

####[6.ローカルブランチにコミット](#ローカルブランチにコミット)
コミット
""内にコミットメッセージを記載する。
チームの方針に従い、英語や日本語でコメントを書く。

```git
git commit -m "コメント"
```
####[7.リモートリポジトリへpush](#リモートリポジトリへpush)
GitHubのリモートリポジトリにpush


```git
git push origin HEAD
HEADの部分はリモートリポジトリのURLでも可
```
####[8.プルリクエストの作成](#プルリクエストの作成)
プルリクエストの作成
Githubのページから「New pull requests」ボタンを押下
close #issue番号

####[9.レビューの結果を反映](#レビューの結果を反映)
レビューで指摘があった場合は、修正して、再度4～7の操作を実行する。

####[10.ローカルブランチを最新化](#ローカルブランチを最新化)
masterブランチの更新

```git
git checkout master
git pull origin master
```
[rails]Rspecで単体テストを行おう！


テストには、単体テストと統合テストの2種類がある。

-単体テスト
　１つのプログラムに対して、正常に動くかのテスト。
　(例)モデルクラスごと

-統合テスト
　1蓮の処理に関するテスト。
　(例)ユーザーの新規登録用画面から値を入力、送信して、データベースにレコードが追加されるまでの流れ

#「Rspec」と「factory_bot」の導入

「Rspec」はテスト行うためのjem、
「factory_bot」はテストを行う際に一時的に情報を作成してくれる
お助けツールです。

そのため、まとめてインストールしましょう。

①jemno
インストール

```:Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
end
```

```:ターミナル
bundle install
```

②RSpecの最低限必要なファイル/ディレクトリ構成をRailsにインストール

```:ターミナル
$ rails g rspec:install
#>      create  .rspec                  # RSpecの設定ファイル
#>      create  spec                    # スペックを格納する
#>      create  spec/spec_helper.rb     # スペック記述のためのヘルパ
#>      create  spec/rails_helper.rb    # Rails固有のスペック記述のためのヘルパ
```

<img width="176" alt="specフォルダ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635167/2e13d46e-84e8-be56-4e3e-3079d3b1b1d6.png">

ここに、必要なディレクトリ・ファイルを追加していきます。

③必要なファイルの作成
ここでは、usersモデルに対してのバリデーションテストを
行なっていきます。

◆テスト用ファイル
spec/内のファイルは、app/以下のテスト対象のrbファイルに対して1
対1で対応するかたちで配置します。

app/models/user.rbに対するスペックは
spec/models/user_spec.rbとなります。

<img width="173" alt="spec-file.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635167/69e797a8-cb4d-684c-3885-6bcb6a5590bf.png">


◆テストのためのデータ用ファイル(factory_bot)
spec/factoriesにファクトリを配置することで、
簡単にテスト用のデータを利用できます。

<img width="170" alt="factories.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635167/e8d9d66b-21b8-3678-aacc-623a171303e4.png">


④ファイルの記述

名前空間を省略できるように設定する。

```:spec/rails_helper.rb
RSpec.configure do |config|
+  config.include FactoryGirl::Syntax::Methods
end
```


```:.rspec
--format documentation
--require spec_helper
```


```spec/models/user_spec.rb

```

```:spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname               {"taro"}
    email                  {"kkk@gmail.com"}
    password               {"00000000"}
    password_confirmation  {"00000000"}
  end
end
```

⑤テストの実行

```:ターミナル
bundle exec rspec spec/models/user_spec.rb
```
playframework入門 form実装時につまづいたこと

書籍の「java/scalaフレームワーク　playframework入門」で練習中に書籍の記載ミスでつまずいたためあとで自分で見返す際に再度間違えないようにメモ的な意味で書きます。
（注：ホームページ上で著者が訂正しているかどうかは調べていません）

初投稿のため、書き方や使い方等おかしい箇所があれば指摘をお願いいたします。

›MyForm.scala
![スクリーンショット 2020-05-25 0.44.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325601/7befce7b-7b76-cdbf-0292-cdc090777181.png)

HomeController.scala
![スクリーンショット 2020-05-25 0.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325601/ae816976-35d5-5269-3c4a-56193d6510b6.png)

index.scala.html
![スクリーンショット 2020-05-25 0.47.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325601/66e1d533-fe1d-3d97-1f3f-e47d5c1a0fc0.png)

routes
![スクリーンショット 2020-05-25 0.48.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325601/24484c98-1314-b2bf-deff-412fe3f34be0.png)

これらのファイルを作成し[localhost:9000]にアクセスすると
![スクリーンショット 2020-05-25 0.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325601/38cb8679-db8f-317f-bdbf-6a7364905163.png)

と思ったように表示されるがname,passwordを入力しsend formのボタンを押すと
![スクリーンショット 2020-05-25 0.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325601/95aba691-44ef-1b33-5a2c-9ac6621948ef.png)
と言うふうに[NoSuchElementException: None.get]のエラー発生。
formの実装の書き方が変更になったのかと思いいろいろ調べたが解決できず。ひとつづつコードの意味などを考えながら見ていると
index.scala.htmlの
@helper.inputPassword(myForm("password"))
と書いていて、myForm("password")の参照先の
MyForm.scalaを見ていると
passwordではなくpassと記述していました。
index.scalaを
@helper.inputPassword(myForm("pass"))に修正すると無事エラーがなくなり想定通りの挙動をするようになりました。

今回の件はおそらく本側の誤植とは思いますがそれでも自分がそのまま書き写しただけでコードの各部分できちんと把握しながら書いていなかったことで気づくのに非常に遅れたのでもっと考えながら勉強が必要だと再度認識を改めました。