OmniAICreator/Qiita-1.07M huggingface dataset:
Rubocopを簡単にまとめてみた

# Rubocopとは

>RuboCop is a Ruby static code analyzer and code formatter. Out of the box it will enforce many of the guidelines outlined in the community

>rubocop-hq/rubocop - Git Hub

Rubyの静的コードアナライザーおよびコードフォーマッターです。
デフォルトでは[Rubystyle Guide](https://rubystyle.guide/)にもとずき、コード解析を行います。
Rubocopは柔軟性に優れ、設定次第で、様々な解析ツールにカスタマイズできます。

# 何ができる？
Ruby関連のコードを読み込み、[Rubystyle Guide](https://rubystyle.guide/)に基づいていない誤った表現の部分を提示します。
また、提示するだけでなく、それを自動修正することができます。

# 導入

導入方法は一般的なGemと同じです。
``$ gem install rubocop``

bundlerを利用する場合は下記の記述をGemfileに書き込みます。rubocopは一般的はdevelop環境でしか使わないので、以下のように入れると良いでしょう。

```ruby:Gemfile
group :development do
  gem 'rubocop', require: false
end
```

``require: false``になっている理由ですが、rubocopはスタンドアローン（外部に依存せずに扱うツール）なのでterminalから操作したいという意味でfalseとします。

また、rubocopは速い速度で開発が進められており、マイナーリリースの場合は下位互換性のない変更もあるため、不要にそのような変更を加えたくない場合は以下のバージョンで保守的にバージョンロックを行うのも一つの手です。

```ruby:Gemfile
gem 'rubocop', '~> 0.82.0', require: false
```

bundlerを使っている場合は``bundle install``を行い、gemをinstallします。

## 実行
```terminal
$ bundle exec rubocop
```
bundlerを使う場合は以上のコマンドで実行します。
その後、解析が始まります。

```terminal
$ bundle exec rubocop　--auto-correct
```

自動修正を行いたい場合は以上のようなオプションをつけます。

## オプション

``-a/--auto-correct``
自動修正をします

``--auto-gen-config``
rubocop_todo.ymlを作成し、察知した異常をtodoとしてファイルに書き込みます。

``-C/--cache``
キャッシュを使い、高速化させます。

``-d/--debug``
詳細デバッグ情報を出力します

``--display-only-fail-level-offenses``
指定された``--fail-level``以上のオフェンスメッセージのみを出力します

``--init``
現在のディレクトリに.rubocop.ymlファイルを生成します。

``-l/--lint``
誤りである可能性が高い部分やbad practiceを指摘するCopのみを実行します。 

``-x/--fix-layout``
Layoutのみを対象として自動修正を実行します。

# 関連ファイル

### .rubocop.yml

このファイルで、詳細なcopの設定を行います。
https://docs.rubocop.org/en/stable/cops/
に詳しく設定することができるcopのリストが載っています

### .rubocop_todo.yml

``--auto-gen-config``を実行した際にTodoが追加されるファイルです。

## 拡張

```
gem 'rubocop-rspec', require: false
gem 'pre-commit', require: false
```

この二つがおすすめです。一つ目はrspecに対してコード解析をするGemです。
もう一つはGitにcommitした際に自動的にrubocopを走らせるGemです。
以下の記事を見てcommit時の自動化を設定しました。
[rubocopをコミット時に自動で走らせる & 出来る限り自動で修正する](https://qiita.com/kazuooooo/items/d8dd165623a9bd6a5a69#%E8%A3%9C%E8%B6%B3-%E8%87%AA%E5%8B%95%E3%81%A7%E4%BF%AE%E6%AD%A3%E3%81%AF%E3%81%99%E3%82%8B%E3%81%8Cstaging%E3%81%AB%E8%BC%89%E3%81%9B%E3%81%AA%E3%81%84)


## 参考リンク
GitHub
https://github.com/rubocop-hq/rubocop
RuboCop公式
https://docs.rubocop.org/en/stable/
RuboCopをRailsオプションやLintオプションで使ってみよう
https://blog-ja.sideci.com/entry/2015/03/12/160441
psql: 無効なオプション -- ' 'っていうエラーに遭遇しました。

subprocess.check_output()を使って間接的にpsqlを実行しようとして「``psql: 無効なオプション -- ' '``」というエラーに遭遇しました。このメッセージだけでは何が悪いのか判らなかったので色々試して原因を探りました。

結果、引数の作り方に問題があることが分かりました。

# 問題

リモートからPostgreSQLサーバのユーザをリストアップするコマンドをPythonで実行しました。

```py:問題コードpsql01.py
#!/usr/bin/env python

import subprocess

cmd = [
    'psql',
    '-U ' + 'postgres',
    '-d ' + 'postgres',
    '-t ',
    '-c ' + 'select * from pg_user;'
]
try:
    result = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    result = e.output

print result
```

```bash:コマンド実行（エラー）
[user001@localhost ~]$ python psql01.py 
['psql', '-U postgres', '-d postgres', '-t ', '-c select * from pg_user;']
psql: 無効なオプション -- ' '
詳細は "psql --help" をごらんください。
```

# 解決

上記サンプルコードのcmd変数に設定するcheck_output()の第2引数の作り方を改修しました。

```py:check_outputの文法
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
```

例えばbashやC言語でコマンドラインを（getopt等で）解析する際は空白文字をデリミタとして解釈しますが、check_output()はリストの要素が引数の要素になるようです。悪い言い方をすれば、check_output()は空白文字をデリミタとして扱ってくれないようです。

## たぶんこれが正しい使い方

```py
cmd = [
    'psql',
    '-U' , 'postgres',
    '-d' , 'postgres',
    '-t',
    '-c' , 'select * from pg_user;'
]
```

## これでもOK

```py
cmd = [
    'psql',
    '-U' + 'postgres',
    '-d' + 'postgres',
    '-t',
    '-c' + 'select * from pg_user;'
]
```

# 環境

* CentOS 7.4
* Python 2.7.5

# 補足

* subprocess.Popen()を使っていればすんなりいってたのですが。
* 「``psql: 無効なオプション -- ' '``」というエラーは、'-t△'（tの後に空白文字）の文法エラーを指していたようです。
【JavaScript】配列の要素全てがある条件を満たしているか調べたい

## はじめに
競技プログラミングをやっていると、配列の各要素をゴニョゴニョして、最終的にある条件を全て満たしているか調べたい場面が多くあるようです。
例えば、パリティを使った問題とか。

この問題をJavaScriptで解く場合、使えるのが**every**です。

## everyの使い方
例をあげた方が早いですね。

```js
const nums = [[1,3], [4,4], [3,9], [8,4]]

const inValid = nums.every(ns => {
    const a = ns[0]
    const b = ns[1]
    
    return ((a + b) % 2 === 0)
})

if (inValid) {
    console.log('All Even')
} else {
    console.log('Odd numbers are included')
}

// => All Even
```

二次元配列内の各要素をそれぞれ取り出し、足し合わせた数が奇数か偶数か計算して、全ての合計が偶数であれば「All Even」と出力します。

numsを ```const nums = [[1,3], [4,4], [3,9], [8,3]]``` とすると、出力は「Odd numbers are included」 となります。

## おしまい
この手の問題は結構頻出なようです。
Web開発で使うかと言われれば微妙ですが、JavaScriptを使う上では知っておいて損はないように思います。
Spring BatchのRunIdIncrementerはジョブパラメータを今回未指定なら前回を引き継ぐ

spring-batchの```RunIdIncrementer```は、もし前回実行時のパラメータがあり、今回はそれが未指定であれば、前回実行時のパラメータを使用する。

# 動作確認
動作確認は以下のとおり。

まずパラメータを指定して実行する。

```
java -jar springbatchsample.jar sample.param=value001
```

以下のようにログに```run.id=2, sample.param=value001```と表示される。

```
Job: [SimpleJob: [name=myJobparam001]] launched with the following parameters: [{run.id=2, sample.param=value001}]
```

次に、パラメータを削除して実行する。

```
java -jar springbatchsample.jar
```

以下のようにログは```run.id=3, sample.param=value001```のようになる。```run.id```はインクリメントされ、```sample.param```は未指定なのに前回実行時のものが残っている。

```
Job: [SimpleJob: [name=myJobparam001]] launched with the following parameters: [{run.id=3, sample.param=value001}]
```

ちなみに、以下のようにパラメータを空文字にすれば、空文字になる。

```
java -jar springbatchsample.jar sample.param=
```

```
Job: [SimpleJob: [name=myJobparam001]] launched with the following parameters: [{run.id=4, sample.param=}]
```

# RunIdIncrementer
なぜこのような挙動になるか。該当箇所のソースは以下の箇所。

```java
	@Override
	public JobParameters getNext(@Nullable JobParameters parameters) {

		JobParameters params = (parameters == null) ? new JobParameters() : parameters;

		long id = params.getLong(key, new Long(0)) + 1;
		return new JobParametersBuilder(params).addLong(key, id).toJobParameters();
	}
```

引数の```parameters```は前回実行時のパラメータが入ってくる。ここに前回の```run.id```が含まれるのでインクリメントされる。そして、今回のジョブパラメータは前回のパラメータをベース（```new JobParametersBuilder(params)```）にする。なので、前回指定したパラメータで、かつ、今回未指定であれば、前回指定時のパラメータがそのまま使われることになる。

この挙動が合わないなら自前の```JobParametersIncrementer```作ってね、という事なのかな、と。それと、spring-batchはジョブパラメータが同一なら同一ジョブ実行と見なす仕様なので、あるジョブ実行だけパラメータ未指定にする、という使い方は仕様に合わないのかも、とも思う。
AWS認定 データベース - 専門知識に合格したので、実践した勉強方法を共有します

#はじめに
[AWS認定 データベース - 専門知識](https://aws.amazon.com/jp/certification/certified-database-specialty/)にスコア808点で合格しました。勉強期間は約2週間でした。

[<img width = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266372/87d91cac-bf74-7343-40b7-280d91a6d1b6.png">](https://www.youracclaim.com/badges/7715a4a8-33ba-4eaa-9ab3-e13caa2fbe50/public_url)


私が実践した勉強方法を共有しますので、これから受験する方の参考になれば幸いです。

#私とAWSとデータベース
AWS歴は約4年です。
データベース系のAWSサービスで言うとRDSを業務で構築/運用した経験があるくらいです。
また、IPAの[データベーススペシャリスト](https://www.jitec.ipa.go.jp/1_11seido/db.html)の資格を取得しています。

こんな感じの人が以下の勉強方法で約2週間勉強したら合格できたと思ってください。

#実践した勉強方法
私が実践した勉強方法を共有します。基本的に上から順番に実施していきました。

##先駆者の方々のまとめ記事を見る
既に受験された方々のまとめ記事を見て、出題範囲のAWSサービスや問われる知識分野を把握しました。
私は以下の記事を参考にさせて頂きました。

- [AWS Certified Database Specialty (DBS-C01) 試験のベータを受けてきてみた感想](http://drawing-hisa.seesaa.net/article/473054025.html)
- [AWS Certified Database Specialty — exam guide](https://medium.com/@vlad_13843/aws-certified-database-specialty-unofficial-exam-guide-4e38951481f5)

## BlackBeltを読む
出題範囲のAWSサービスが分かったら、対象サービスの[BlackBelt](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)を読んで、サービス概要をざっくり理解しました。

## AWSトレーニングルーム(eラーニング)を受講する
[AWS認定 データベース - 専門知識のトレーニングルーム](https://www.aws.training/Details/eLearning?id=47245)を受講しました。
講義内でサンプル問題を解くことができるので、満点を取るまで繰り返し解きました。

## サンプル問題を解く
[サンプル問題](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-database-specialty/AWS-Certified-Database-Specialty_Sample-Questions_v1.1.pdf)を満点取るまで繰り返し解きました。

## 公式の模擬試験を受験する
公式の模擬試験を受験しました。正答率は55%(20問中11問正解)でした。
終わった後も繰り返し解けるように、問題文と選択肢の画面を試験時間中にスクショしておきました。
公式の模擬試験は各問の回答が分かりません。なので、公式ドキュメントや機械学習系の記事を調べて、自分で答えを見つける必要があります。
本当に合っている答えかは分かりませんが、満点が取れるまで繰り返し解きました。

## 非公式の問題集を解く
### IT-PASSPORTS
IT-PASSPORTSという資格問題集サイトが提供している[Amazon AWS Certified Database DBS-C01](https://certprep.it-passports.com/DBS-C01-exam.html)のサンプル問題(8問)を解きました。ダウンロードするのにメールアドレスが求められますが、適当なアドレスを入力してもダウンロードできます。問題の質は良かったのですが、**いくつか解答が間違っているので、正解を自分で調べる必要があります。**製品版は¥6,000くらいするので今回は購入しませんでした。

### Udemy
Udemyから提供されている[AWS Certified Database Specialty Practice Exam | Exampods](https://www.udemy.com/course/aws-certified-database-specialty-practice-exam-exampods/)を購入しました。模擬問題が80問提供されています。定価は¥2,400なのですが、セール時に¥1,500で購入しました。本番の試験と同レベル程度の問題が多く提供されているため、**おすすめ**です。ただし、**解答の3割程度が間違っているため、正解を自分で調べる必要があります。**こちらは3周くらい解き直しました。

#感想
問題の半分以上がRDS関連のものでした。業務でRDSを触っていたこともあってか、比較的解きやすい問題が多い印象でした。今回の試験勉強を通して、今まで触ったことのないサービスの概要や特徴を多く知ることができました。今後学んだことが役立つ日がくれば良いなと思います。
GithubにSSHで接続する方法

インターネット上では"Git SSH"で調べると色々手順は出てきて、その通りにやっても以下のエラーが出て接続できなかった。

```:Linux
Cloning into 'xxxxxx'...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```
んでGithubの公式マニュアルを調べると微妙に手順が違ったのでやった手順を2020年4月現在の最新手順を作成しておきます。

今回の手順はEC2のLinux環境で実施しました。

参考：[Github公式の手順](https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh)

## SSH鍵の作成

```
ssh-keygen -t rsa -b 4096 -C "xxxxxxxxx@xxxxxx.com"

```

暗号化形式はRSA 4096bitを指定していないとNGなのだろう。

```
Enter a file in which to save the key (/c/Users/you/.ssh/id_rsa):[Press enter]
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
```

ファイル名はデフォルトでOKだろう。
しかしパスフレーズはきちんと入力しよう。

## SSHエージェントの登録

次にSSHエージェントに鍵を登録します。これも抜けている手順が多かったの忘れずにやること。

```
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
```

## 公開鍵をGithubに登録

Githubに公開鍵を登録します。

まずは右上のsettingに進む。

![2020-04-29_21h22_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247515/71cdebf1-f844-1afa-4998-723b0bc796b1.jpeg)

次にSSH ang GPG keys を選択。

![2020-04-29_21h22_23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247515/882bf1b3-713a-960a-4e44-d081e1d4ebab.jpeg)

そしたらNew SSH Keyを選択。

![2020-04-29_21h22_33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247515/212f732a-a207-946d-9a1a-a1480cb7becd.jpeg)

公開鍵は「~/.ssh/id_rsa.pub」をコピペする。

![2020-04-29_21h22_56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247515/a93bde20-1eaa-b120-2502-5d096b680633.jpeg)

```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDJGlvb06S8zt/9BAWV9CRXmo9KahHOlqU7229XC4DkYHcCrnkK1z3/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/VW32OtgbBnbpf8ErnZsZ+s9feZTt/TfOCDSwc8eGBzXxCOh6tSfH3RKaeIAFU76zE+YPWTSSX5wmgpN9dYVmCbR4AcW1g4+XXXXXXXXXXXXXXXXXXXXXXXXXXX/TyiNm9GTHnr0Qn99y1KgDgEHP2VxiNDAGArKzXqNw3C6dKC4h9kTwjrhCYPW4yP0Kebm6rkN9JKG13oMLIdM06QY7WHZnmVuAzzm/cyQenmsxorJskXTM3e6bktNztEdS9N8I9XpMq27X7x+MH1KYVSbv0BdQK/DKzkfelNZkKbKLF9hKRtp9498nG+ScKIYo9YILGmIQdJY8CdOclM2p+6jGzqmZ9Inxbf+EbZVuV6p0KHDfxZL59NxXdEcDfZ2SdwFGJjPp1QBRkawraFwlkJcoYGUqy52/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
```

ssh-keygen で鍵を作成するとメールアドレスが付与されるが、コピペしない点に注意。

コピペが終わったらAdd SSH Key

![2020-04-29_21h27_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247515/03783314-9fac-9f7c-7b6b-fa59442bcd40.jpeg)


## Githubとの接続テスト

SSHコマンドで接続確認をします。

```
ssh -T git@github.com
```

```
RSA key fingerprint is XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
RSA key fingerprint is MD5:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,52.192.72.89' (RSA) to the list of known hosts.
Hi username! You've successfully authenticated, but GitHub does not
```
上記のように 「You've successfully authenticated」が出ればOK！

## SSH接続でGithubからClone

上記の設定が終わったらgit cloneコマンドでクローンしてみます。

```
git clone git@github.com:username/xxxxxxxxxxxxxx.git
```

## 結論

公式のマニュアルを読め！
terraform-modeでファイル保存時にformatする

最近Terraformの学習を進めていてemacs-terraform-modeを利用させてもらっている。
`M-x terraform-format-on-save-mode` をするとファイル保存時にフォーマットを掛けてくれることに気づいた。
とても便利だが、バッファを消した時には再度コマンドを実行する必要があった。

コードを読んでたら、そのままやりたいことがコメントアウトされていたのでinit.elで有効化した。
これでメジャーモードがterraform-modeの時は常にフォーマットしてくれる。やったぜ!

```init.el
(require 'terraform-mode)
(add-hook 'terraform-mode-hook #'terraform-format-on-save-mode)
```

(参考)
[emacs-terrform-mode](https://github.com/pcn/emacs-terraform-mode)
【Docker-Compose】コンテナ起動から入るまでを丁寧に

こんにちは。'20/4/20からWebエンジニアのインターンを始めた専門1年の18歳です。

エンジニア歴10日なので、間違った表現があればご指摘いただけると幸いです。

# What
Dockerコンテナを起動 → コンテナに入るまでの手順

環境・前提
・Docker version 19.03.8
・docker-compose version 1.25.4
・macOS Catalina 10.15.4
・プロジェクトがある(元々あるか、GitHubなどからcloneしてきた)
・[Dockerのインストール](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)が済んでいる

# Why
4/20からWeb開発の長期インターンを始めました。

しかし、初業務×リモート作業という状況の中、ローカルでの統合開発環境しか使ってこなかった僕にとって「Dockerの中に入って...」という表現すらよく理解できていませんでした。

そんな駆け出しエンジニア様のサポートに少しでもなれば幸いです。

# How
####1. 現在のコンテナを確認
ターミナルを起動し、プロジェクトのあるディレクトリ内で

```
$ docker-compose ps   # コンテナ一覧表示
```
を実行します。コンテナが存在すればコンテナの名前や状態（起動していないときStateの項目はExit）が表示されているはずです。

もし、上記のコマンドを実行し、

```
ERROR: Couldn't connect to Docker daemon. You might need to start Docker for Mac.
```
とエラーメッセージが出ていたら、Macのナビゲーションバーを確認してください。
![スクリーンショット 2020-04-29 18.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305969/5d1bea03-4781-71c2-f106-09b3ba8d5eb4.png)
このようなDockerのアイコンが表示されていなければDockerアプリケーションが起動していませんので、アプリを起動した状態にしてください。

---
####2. コンテナ起動
コンテナがあることが確認できたら、それらを起動していきます。

```
$ docker-compose up   # プロジェクト内のコンテナすべて起動
```
最初の起動には少し時間がかかるかもしれません。コンテナの数が少なければ30秒程度ですが、2,3分かかる場合もあります。起動が成功すると、コマンドラインに`Use Ctrl-C to stop`と表示され、入力待ち状態（$や#の表示）でないままになります。

---
####3. 起動の確認
コンテナを起動すると入力ができない状態になってしまうので、ここからは別のタブで操作していきます。

まず、ターミナルのウィンドウを選択した状態で`⌘キー+T`を行い、別タブを開きます。このとき、現在のディレクトリはDockerを起動した先ほどのままなので移動する必要はありません。

先ほどの`$ docker-compose ps`をここで実行すると、コンテナがきちんと起動していればStateの項目がUpになっています。

####4. コンテナに入る
※この後も【3.起動の確認】のように別タブの状態で進めていきます。

```
$ docker-compose exec #{container} ${command}  
```
起動しているコンテナに対してコマンド実行を行うには、この操作が必要になります。Docker execコマンドは簡単に表現すると、『対象のコンテナで、対象のコマンドを実行する』というものです。（[参考ページ](https://www.nyamucoro.com/entry/2018/01/11/224932)）

今回はコンテナの中に入りたい。つまり、中でLINUX操作を行える必要があります。そのために、Bashを起動するとします。すると、

```
$ docker-compose exec #{container} bash  
```
これでbashを起動する、コンテナに入るということになります。

そしてコンテナ名は`docker-compose.yml`の中に書かれています。（以下は一部）

```docker-compose.yml
version: '3'
services:
  web:      <-- サービス名（コンテナ名）
    build: .
  db:       <-- サービス名（コンテナ名）
    image: mysql:5 
```
説明が長くなりましたが、つまるところコンテナ内に入るには

```
$ docker-compose exec web bash
```
ということになりますね！（コンテナ名はdocker-compose.ymlの内容によって変更して下さい）

# End
僕自身Dockerを知ったのがつい9日前なので、まだまだ理解が追いついてない部分が多いです。
今回使用したDockerコマンドは'exec'と'ps'のみですが、他にもたくさんコマンドが用意されてるようですね。

今後も自身がつまづいた部分などを中心に情報発信できたらと思います。ありがとうございました！
Railsのコントローラー(controller)

##1.コントローラの役割
Action Controllerは、MVCモデルのCに相当します。MVCとは、M(Model)、V(View)、C(Controller)の3つの要素のことであり、リクエストを処理するコントローラがルーティング設定によって指名されると、コントローラはリクエストの意味を理解し、適切な出力を行なうための責任を持ちます。これらの処理はほとんどAction Controllerが行い、しかも吟味された規則を使うので、リクエストの処理は可能な限り素直な方法で行われます。
つまり、コントローラー層では、ブラウザなどから発行されたHTTPリクエストの宛先となっているURLや、HTTPメソッド(GETやPOSTなど)を元に、routes.rbで定義された「そのリクエストを処理する担当箇所」を特定し、どのコントローラー（クラス）の、どのアクション（メソッド）が処理をするのか決定する層、ということです。
<br><br>
1.クライアントからのリクエストをWebサーバを介して受け取るます(routes)

2.ルーティング機能がそのリクエストの処理を行うべきコントローラー（クラス）とアクション（メソッド）を特定し、アクションを呼び出します。

3.アクション（メソッド）では必要に応じてモデルを利用します。例：

```ruby:ruby
def new
  @user = User.new
end
```
4.モデルがデータベースで永続化されている場合、モデルはデータベースへの書き込みや読み出しも担当します。例：

```ruby:ruby
def index
  @tasks = Task.all
end
```
5.アクションごとに、対応するビューテンプレートを用いてHTML等を作成します。例：show.html.erb

6.コントローラがレスポンスを作成し、Webサーバを介してクライアントへ返します。
<br><br>

##2.コントローラの命名規則
Railsのコントローラ名(ここでは「Controller」という文字は除く)は、基本的に名前の最後の部分を「複数形」します。例えば、ClientsControllerの方がClientControllerより好ましく、SiteAdminsControllerはSiteAdminControllerやSitesAdminsControllerよりも好ましいということです。
<br><br>

##3.メソッドとアクション
newメソッドの内容が空でも正常に動作します。これは、Railsではnewアクションで特に指定のない場合にはnew.html.erbビューをレンダリングするようになっているからです。Clientを新規作成すると、newメソッドはビューでアクセス可能な@clientインスタンス変数を1つ作成できるようになります。

```ruby:ruby
def new
  @client = Client.new
end
```
<br><br>
##4.パラメータ
コントローラのアクションでは、ユーザーから送信されたデータやその他のパラメータにアクセスして何か作業を行なうのが普通です。Railsに限らず、一般にWebアプリケーションでは2種類のパラメータを扱うことができます。
1番目は、URLの一部として送信されるパラメータで、「クエリ文字列パラメータ」と呼ばれます。クエリ文字列は、常にURLの"?"の後に置かれます。
2番目のパラメータは、「POSTデータ」と呼ばれるものです。POSTデータは通常、ユーザーが記入したHTMLフォームから受け取ります。これがPOSTデータと呼ばれているのは、HTTP POSTリクエストの一部として送信されるからです。Railsでは、クエリ文字列パラメータの受け取り方とPOSTデータの受け取り方に違いはありません。どちらもコントローラ内ではparamsという名前のハッシュでアクセスできます。
<br><br>
参照：Railsガイド：https://railsguides.jp/action_controller_overview.html
AWS EC2 (Amazon Linux 2)初期設定のノウハウ集




## (1). パッケージ更新

- インストール済のパッケージを最新の状態にするコマンド
- yum updateは自動的にアップデートすることも可能。
- yumを自動アップデートする事で環境差分がでる可能性があるため、設定は要注意。


```bash:パッケージ更新
#パッケージ更新
yum update -y
#パッケージ自動更新
sudo yum install yum-cron -y
sudo sed -i "s/^apply_updates.*$/apply_updates = yes/g" /etc/yum/yum-cron.conf
systemctl status yum-cron
sudo systemctl start yum-cron
sudo systemctl enable yum-cron
```

## (2). タイムゾーンの変更/日本語ロケールの追加

```bash:タイムゾーン変更
#タイムゾーン変更
timedatectl status
sudo timedatectl set-timezone Asia/Tokyo
#日本語ロケール追加
localectl status
sudo localectl set-locale LANG=ja_JP.UTF-8
sudo localectl set-keymap jp106
```


## (3). 時刻同期

- Amazon Time Sync Serviceを設定。
- NTPで配信される時刻同期サービスで、追加料金なくすぐに全リージョンのVPCの稼働中の全インスタンスで利用可能。
- 以下で設定できるが、Amazon Linux 2を使用している場合はデフォルトで設定してあるっぽい。
【Windows】【Excel】リモートワークで需要増！なショートカットキーを紹介する

##はじめに
新型コロナウイルスの影響でリモートワークが普及し、外付けモニタが需要増になっているとのこと。でも、**何も買わずに作業効率を高める方法**だってあるんじゃないかと思っている。（貧乏性）

##概要
リモートワークになったことで、オフィスで2画面でやっていたことを、**ノートPCのモニタ1画面のみ**でやらざるをえなくなった。狭いモニタで効率よく作業するために、特に表示関係のショートカットを多用するようになったので、同じ境遇の方に共有したい。

##紹介
###Windowsショートカットキー

####表示レイアウト変更
`Ctrl + Shift + 1～8`
基本的に「6：詳細」を使っていたが、1画面に表示されるファイル数が減ったので、「5：一覧」も併用するようになった。画像系フォルダの場合は「2：大アイコン」も使う。**数字が大きくなるほど、表示は細かくなる**。
今までは左のCtrl・Shiftばかり使っていたが、この配置の同時押しのために、右のCtrl・Shiftも使うようになった。

####リボン表示切替
`Ctrl + F1`
これも**ファイル数を多く表示させる**ことが目的。どうせ表示させていてもほとんど使わない。たまに使う「パスのコピー」は、`Alt → H → C → P`で。

####ウィンドウを左右に寄せる
`Windows ＋ [←] [→]`
2画面でやっていたものを、**1画面を左右に分割して使う**ことで代用。このショートカットで、左右半分のぴったりサイズにしてくれるので便利。

###Excelショートカットキー
####リボン表示切替
`Ctrl + F1`
Windowsと共通。よく使うコマンドは、Altキーから実行できるように覚えたり、**[QATB](https://qiita.com/AnPanda/items/f942ca6fcec31e893155)** に登録したりして、リボンをたたんで**表示セル数を増やす**。

####左右のページ移動
`Alt + PageUp`：右
`Alt + PageDown`：左
なぜ今まで使っていなかったのか、後悔しかないショートカットキー。モニタが横長とはいえ、ずらずら右に続いていく管理表が多いので、**左右に高速で移動したい**機会は多い。
※F.luxを使ってると、そちらのショートカットキーが優先されて画面照度が変わるだけなので注意。Optionでショートカットキーを停止できる。

####行・列のグループ化
`Alt + Shift + [→]`：グループ化。`Alt → A → G → G`でも可。
`Alt + Shift + [←]`：グループ化解除。`Alt → A → U → U`でも可。
`Alt → A → H`：グループ折りたたみ
`Alt → A → J`：グループ展開
作業中の見やすさ向上のために**不要な行・列を一時的に非表示**にするときに活用。後述の非表示や幅調整でも同じようなことができるが、再表示・非表示の切替が楽なので、グループ化が一番好き。

####行・列の非表示
`Ctrl + 9`：行非表示
`Ctrl + Shift + 9`：行再表示
`Ctrl + 0`：列非表示
`Ctrl + Shift + 0`：列再表示
個人的には可逆性の高いグループ化を推しているが、計算用の関数を仕込んでいて**編集されたくない行・列を恒久的に非表示**にしてしまいたいときなどは、こっちの方が適していると思う。
※`Ctrl + Shift + 0` はデフォルトだと使用できず、Windowsの設定をいじるひと手間が必要。
https://supvalue.net/archives/795

####参考：非表示系操作のメリット・デメリット比較
一部の行・列を非表示にする方法として、グループ化・非表示・列幅調整がある。パッと思いついたメリット・デメリットを列記してみた。

|種類 |メリット|デメリット|
|----|----|----|
|グループ化|表示・非表示の切替が楽|飛び飛びの行・列を非表示にするのが面倒|
|非表示|飛び飛びの行・列を非表示にするのが楽|再表示すると、元の非表示状態に戻すのが面倒|
|列幅調整|最初の何文字かを表示できる<br>セル選択すれば内容が確認できる|元の列幅に戻すのが面倒(自動調整はできる)|

##おわりに
リモートワークの影響で2画面が使えなくなり作業効率は落ちてしまったが、**今まで活用できていなかったショートカットキーを手になじませること**でリカバリは可能。また、セルの表示を瞬時に操作するショートカットキーを身に着けることで、Excel画面をもとに他者に説明するときなどに、余計な時間を取られずに済む。
【システム設計】エラー処理のパターン

システムで発生するエラーは、以下のように分類できる。

1. 業務エラー
    1. 単体入力エラー
    1. 突合せエラー
1. システムエラー
 
##業務エラー
アプリケーション側で想定可能で、発生しても以後の処理に復帰できるようなエラー。
業務における不正データを入力出来にように、実装が必要。

1. 単体入力エラー（バリデーションチェック）

- 必須チェック
- データ型チェック（文字列、数字、日付等）
- 期間（日時）や量（数字）などの範囲チェック
- 入力パターンチェック（郵便番号、メールアドレス、URL等）
- 日付の前後関係などのデータ項目の相関チェック

1. 突合せエラー（DBチェック）

- 入力した値が既に登録されている（重複チェック）
- マスターテーブルに存在しないコードが入力された（マスタチェック）

##システムエラー
アプリケーション側で想定しておらず、発生したときには以後の処理には復帰できない致命的なエラー。
システムエラーが発生した場合、アベンド、異常終了といわれる状態になる。
業務ロジック内の例外であれば、DBのロールバック、コネクションの開放等を実施するよう実装する。

##参考
・エラーチェックの体系的な分類方法
https://docs.microsoft.com/ja-jp/archive/blogs/nakama/293

・エラー処理をパターンにはめよう
https://codezine.jp/article/detail/6553
はじめまして＊ひよっこプログラマーの初投稿🐣（8/13更新）

##ごあいさつ
はじめまして。" ちな "と申します。

アウトプットする場所を作ろうと思い、開設しました🐣



##身につけたいこと・気になっていること

・とにかく自信をつけたい（切実）
・Gitを使いこなしたい
・PHP（Cake/Laravel）を勉強したい
・ネットワークやLinuxの知識を身に着けたい

##目標
・AWS　SAAを受験する
　→インフラの分野を体系的に勉強したい
・LPIC（101/102）を受験する
　→Linuxの知識が欲しい
・CCNAを受験する
　→ネットワーク？なにそれおいしいの？を抜け出したい
・個人開発でなにか作ってみる
　→筋トレ共有ツール的なものを作ろうかなと考えています


最後に、いろいろと投稿できればと思っておりますので、
アドバイス等いただけると幸いです(*'ω'*)

よろしくお願いいたします♡
Pandasの基本的な使い方 まとめ

Pandasの使い方の備忘録として、
基本的な操作方法をまとめました。


## 0.前提
```
import pandas as pd
```

## 1.データを定義する

### pd.DataFrame()
- データフレームを定義できるメソッド
- index引数を指定することが出来る。指定しなかった場合は自動で0から割り振られる

```
df = pd.DataFrame({
'Country': ['JPN', 'USA', 'CHI', 'GER', 'AUS'],
'Greeting':['こんにちは', 'Hello', 'Ni Hao', 'Guten Tag', 'GDay'],
'Capial':['Tokyo','Washington', 'Beijing', 'Berlin', 'Canberra']},
index=['a','b','c','d','e']
)

df

"""
以下のように出力される
	Country	Greeting	Capial
a	JPN	こんにちは	Tokyo
b	USA	Hello	Washington
c	CHI	Ni Hao	Beijing
d	GER	Guten Tag	Berlin
e	AUS	GDay	Canberra
"""

```

## 2.データフレームの操作方法

### a.データの存在確認
#### df.isin()メソッド
- 配列(['hage', 'hige','huge'...])を引数にとり、その値の有無を真偽値で返す

```
df.isin(['JPN', 'Berlin'])

"""
Country	Greeting	Capial
a	True	False	False
b	False	False	False
c	False	False	False
d	False	False	True
e	False	False	False

"""

```

#### df.isnull()メソッド
- 欠損値(NaN)の有無を確かめ、真偽値を返す(TrueがNaNの意)。


### b.データの呼び出し

#### df.loc[]
- 行・列をラベル(名称)で指定する
- 添字([])には行と列それぞれを指定する必要がある。```:```で全箇所という意味を表す

```
df.loc[:,['Country', 'Greeting']] 
# 意:'Country'列、'Greeting'列を取得してきてね。行は全部

df.loc[['a','c'],['Country']] # ->
# 意:'Country'列を取得してきてね。行はa行とc行のみ

```

#### df.iloc[]
- 行・列を数字の位置(integer location)で指定する
- ちなみにiはindexでもindiceでもiteratorでもなく、***i***nteger ***loc***ation('整数位置')の***i***です[^1]。

```
df.iloc[:,1:3]
# 意:1列目から3列目まで(つまり、1行目と2列目)を出力してね、行は全部

df.iloc[2:5,1:3]
# 意:1列目から3列目まで(同)を出力してね、行は2行目から5行まで(つまり2,3,4行目)

"""
	Greeting	Capial
c	Ni Hao	Beijing
d	Guten Tag	Berlin
e	GDay	Canberra
"""

```

#### df.ix[]
- ラベル(loc)、整数番(iloc)どちらを呼び出しても機能する。Pandasのバージョン0.20.0より非推奨(depricated)[^2]。
- そんなのがあったんだな、と知っておく程度で良いと思われる。 


## 編集後記
- 列の削除の仕方やクエリライクな活用などは近日中に加筆します
- NumpyやMatplotlib等と並び最も基本的なライブラリの1つであるからこそ、操作方法で躓くことのないように復習が欠かせないライブラリだなあと思いました。同じような方のお役に立てば幸いです。

### 参考にさせていただいた記事
- [Pandas でデータフレームから特定の行・列を取得する
](https://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA)
- [pandas の loc、iloc、ix の違い – python](http://ailaby.com/lox_iloc_ix/)


 [^1]:  [pandas.DataFrame.iloc](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html)
[^2]: [IX indexer is deprecated](https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#ix-indexer-is-deprecated)
Ubuntu 18.04 & GT1030 & 4Kディスプレイで､YouTube(4K 60fps動画)がサクサク観れたよ!!

## 【はじめに】
在宅勤務を効率的に実施するため､4Kディスプレイ(JAPANNEXT  JN-T2888UHDR)を購入しました｡
4K環境は予想以上に効果があり良かったのですが､ふとYouTubeで4K 60fps動画を閲覧してしまい､そこから試練が始まりました｡｡｡
※結果､うまくいきました!!

##【問題発生】 4K 60fps動画､3秒間隔で止まってしまい満足に観れません!!



4K 60fps動画を閲覧しようとすると､3秒おきに動画が止まります｡
しかも常時CPU高負荷状態(80〜90%)です｡
状況からハードウェアの動画再生支援が効いてなさそう｡｡｡

## 【環境】


```
OS:  Ubuntu 18.04
CPU: Xeon E3-1275v2 (古い...)
GPU: NVIDIA GT1030
ブラウザ: Firefox 75.0 or Chrome 81.0.4044.129 
```

## 【調べて分かったこと】
YouTubeの4K 60fps動画のコーデックはVP9｡
NVIDIA GT1030はデコード(NVDEC)だけVP9に対応｡ ※[NVDEC Support Matrix](https://developer.nvidia.com/video-encode-decode-gpu-support-matrix)参照
__NVDEC__に賭けるしか!!

## 【結果】サクサク観れるようになったよ!!

FirefoxおよびChromeでNVDECを使おうと思ったのですが､やり方が分からず断念｡｡｡
代わりにmpvという動画再生ソフトでNVDECが使えることが判明｡
ただUbuntuの公式リポジトリにあるmpvではNVDECが使えなかったため､
開発元のPPAから最新版をゲットしたところ､うまくいきました｡__サクサクヌッルヌルです｡__


```shell:
$ sudo add-apt-repository ppa:mc3man/mpv-tests
$ sudo apt-get update
$ sudo apt install mpv
$ mpv -fs --hwdec=nvdec  'YouTubeのURL' ※コマンド実行後､動画が再生されます｡CPU負荷は10〜20%程度､GPU負荷は90%程度でした｡
```

##【最後に】
~~GT1030だって､少しはやれるんだから!!!~~
もっといい方法があれば教えてください!!!
Kinx アルゴリズム - バブルソート

# アルゴリズム - バブルソート

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。「プログラム＝アルゴリズム＋データ構造」。アルゴリズムの実装例をご紹介。

元ネタは「C言語による（30年経っても）最新アルゴリズム事典」。今回はソート（バブルソート）です。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。  

アルゴリズムと言えばソート。今回はバブルソートです。

## バブルソート

* https://ja.wikipedia.org/wiki/バブルソート
    * 遅いが単純で分かりやすい
    * $O(n^2)$
    * 安定

### テスト・ドライバ

テスト・ドライバコードは [前回](https://qiita.com/Kray-G/items/d2305cd5e97e803af25c) と一緒です。

```javascript
function display(name, a) {
    System.println(name, a.map(&(e) => "%2d" % e).join(' '));
}

function demo(N, func) {
    var a = N.times(&() => Integer.parseInt(Math.random() * 100));
    display("Before: ", a);
    a = func(a);
    display("After:  ", a);
}
```

### サンプル・コード

```javascript
function bubblesort(n, a) {
    var k = n - 1;
    while (k >= 0) {
        var j = -1;
        for (var i = 1; i <= k; i++) {
            if (a[i - 1] > a[i]) {
                j = i - 1;
                [a[i], a[j]] = [a[j], a[i]];
            }
        }
        k = j;
    }
}

demo(20, &(a) => {
    bubblesort(a.length(), a);
    return a;
});
```

### 結果

```
Before: 87 50 94  9 30 62  4  2 31 10 59 85 46 46 58 83 24 44 27 33
After:   2  4  9 10 24 27 30 31 33 44 46 46 50 58 59 62 83 85 87 94
```

## おわりに

さすがに **C系統のシンタックス** を目指しただけあって、元ネタ（C言語）のコードからほとんど修正せずに使えています。素晴らしい。

ではまた、次回。
Xcodeでのフォルダの作り方

#フォルダの作り方
作成したいフォルダの上で、右クリック → New Groupを押す
以上！
<img width="354" alt="スクリーンショット 2020-04-29 20.43.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/5586ea4f-c38e-c16a-43f3-00a680520071.png">

##メモ
Finderでフォルダを作成し,Xcodeにドラッグ＆ドロップするという方法を見つけたが、
プロジェクトとフォルダの関係性がだめだったのか、ファイルを読み込めなかったので、
他の人には同じことをやってほしくないと思い、投稿しました。
【TeraTerm】自動ログインマクロ

###SSH公開鍵認証
```sample1.ttl
username = '[ユーザ名]';
hostname = '[ホスト名]';
keyfile = '[秘密鍵のパス]';
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile

connect msg
```
###SSH公開鍵認証(パスワード要)
```sample2.ttl
username = '[ユーザ名]';
hostname = '[ホスト名]';
keyfile = '[秘密鍵のパス]';
pass= '[パスワード]';

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
strconcat msg ' /passwd="'
strconcat msg pass
strconcat msg '"'

connect msg
```
###SSHパスワード認証
```sample3.ttl
username = '[ユーザ名]';
hostname = '[ホスト名]';
pass= '[パスワード]';
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = hostname
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd="'
strconcat msg pass
strconcat msg '"'

connect msg
```
Cakephp3で取得したオブジェクトを元にチェックボックスを作る

Cakephpでfindした結果でcheckbox作りたい時、どうすればよいかわからなかったが
色々やってこの方法に落ち着いた。
toArray()を使う方法もありましたが、
json_encode と json_decode を使う方法に落ち着きました。
シンプルだけど疑問が残ります。

```php:php

//$usersオブジェクトをjsonに
<?php $user_array =  json_decode(json_encode($users), true);?>

//フォーム生成
<?= $this->Form->create($blog) ?>
<?php echo $this->Form->control('roomname');?>

<?php foreach ($user_array as $user_data): ?>
<?php echo $this->Form->control('user[]', array(
    'label' => $user_data['users']['username'],
    'value' => $user_data['users']['id'],
    'id' => 'user_id_'.$user_data['users']['id'],
    'type' => 'checkbox'
));?>
<?php endforeach; ?>

<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>

```
Pythonのsympyで連立一次方程式を解いてみよう！

# Sympyとは
SymPyは、Pythonで記号計算を行うためのライブラリ（無料！)
Mathematicaみたいなやつ！

## 公式ページ
こちら

- https://www.sympy.org/en/index.html

# やってみよう
## 環境
```bash
$ python3 -V
Python 3.7.3
```

## 仮想環境の構築
```
$ mkdir algebra-homework
$ cd algebra-homework
$ python3 -m venv venv
$ source ./venv/bin/activate
```

## sympyインストール
```bash

$ pip install sympy
Collecting sympy
  Downloading https://files.pythonhosted.org/packages/ce/5b/acc12e3c0d0be685601fc2b2d20ed18dc0bf461380e763afc9d0a548deb0/sympy-1.5.1-py2.py3-none-any.whl (5.6MB)
    100% |████████████████████████████████| 5.6MB 1.2MB/s 
Collecting mpmath>=0.19 (from sympy)
  Downloading https://files.pythonhosted.org/packages/ca/63/3384ebb3b51af9610086b23ea976e6d27d6d97bf140a76a365bd77a3eb32/mpmath-1.1.0.tar.gz (512kB)
    100% |████████████████████████████████| 522kB 1.6MB/s 
Installing collected packages: mpmath, sympy
  Running setup.py install for mpmath ... done
Successfully installed mpmath-1.1.0 sympy-1.5.1
You are using pip version 19.0.3, however version 20.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```

## 連立方程式を解いてみる

-7x +2y +10 = 0
3x  +5y +9  = 0

```python
$ python
Python 3.7.3 (default, Mar  6 2020, 22:34:30) 
[Clang 11.0.3 (clang-1103.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> import sympy
>>> x=sympy.Symbol('x')
>>> y=sympy.Symbol('y')
>>> sympy.solve([-7*x+2*y+10,3*x+5*y+9])
{x: 32/41, y: -93/41}

```

## 手でxについて解いてみる

-7x +2y +10 = 0
3x  +5y +9  = 0

-35x+10y+50=0
6x+10y+18=0

-41x+0y+32=0

x=32/41

----
なんかあってそうね！よかったよかった
リンク先のページでイベント発火させたい時のメモ

## リンク先でイベントを発火
wordpress案件で、フッターリンク先が、コンタクトフォームの固定ページに飛び、
そこでモーダルを表示させたいという要件

最初は、いやいやいや、それは、ワードプレスだから、みたいなノリで流そうかなと思ったけど、きちんと実装

```javascript


$(".footer-privacy-link-modal").on('click',function(event){
   event.preventDefault();
   var linkUrl = $(this).attr('href');
 
   // ここにリンク先への遷移直前に実行する内容を記述
 
   function action() {
     location.href = linkUrl;
 
     // ここにリンク先への移動直後に実行する内容を記述
     $(".privacy-modal-contents").fadeIn(); //ここでモーダルを表示
   }
   setTimeout(action,1000);
 });
```



## なぜ起きた？
ワードプレスのとある案件で、とにかくデザイナーさんがうーんうーんという感じのタイプの方で（本当はいいたい、実にいいたいけど、それはよくないのでそっとしておく）、あれもこれもっていうパターンが多かったが、再認識をできた良い経験でした。
ワードプレス もまだまだ需要あるのと、久々やると色々と忘れていましたが、良い学びになりました。
【PowerShell】クリップボードの画像をPNGファイル化

##処理概要
クリップボードの画像を「yyyyMMdd_HHmmss.png」の名前のPNGファイルとして保存。

###処理
```powershell:clipToPng.ps1
# タイムスタンプ
$time = Get-Date -Format "yyyyMMdd_HHmmss"  
# ファイル名
$filename = $time + ".png" 

# System.Windows.Formsアセンブリを追加
Add-Type -AssemblyName System.Windows.Forms
# クリップボードから画像を取得
$clipboardImage = [Windows.Forms.Clipboard]::GetImage()
# クリップボードに画像が存在する場合
if ([Windows.Forms.Clipboard]::ContainsImage())
{
  # 保存先にデスクトップを指定
  $outputFilePath = Join-Path (Join-Path $Env:UserProfile "Desktop") $filename
  # 保存
  $clipboardImage.Save($outputFilePath)
}
```
###実行ファイル
```run_clipToPng.bat
@echo off
echo clipToPng.ps1を実行中です…
powershell -NoProfile -ExecutionPolicy Unrestricted .\clipToPng.ps1
echo 完了しました！
exit
```
Qiita APIで記事のLGTM数と、View数を習得する

# アクセストークン取得

[ユーザの管理画面](https://qiita.com/settings/tokens/new)から、対象アカウントへのアクセストークンを取得する

> [Qiita API v2 documentation - Qiita:Developer](https://qiita.com/api/v2/docs)
> 認証認可
Qiita::TeamのAPI、またはQiitaのGETリクエスト以外のAPIを利用するには、アクセストークンをリクエストに含める必要があります。アクセストークンは、後述するOAuthを利用した認可フローか、ユーザの管理画面から発行できます。

# 記事のLGTM数を習得する

```sh:sample.sh
#!/bin/bash

QIITA_TOKEN=[アクセストークン]
QUERY_STR="https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=100"
LGTM_TOTAL=0

### LGTM total
LGTM_TOTAL=`curl -sH "Authorization: Bearer ${QIITA_TOKEN}" \
    "$QUERY_STR" \
    | jq -r '.[] | [.likes_count] | @csv' | awk '{s += $1} END {print s}'`
echo "LGTM_TOTAL--->"
echo $LGTM_TOTAL
```

テスト

```
$ bash sample.sh
LGTM_TOTAL--->
131
```

# 記事のView数を習得する

```sh:sample2.sh
#!/bin/bash

QIITA_TOKEN=[アクセストークン]
QUERY_STR="https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=100"
VIEW_TOTAL=0

### VIEW total
ITEM_IDs=`curl -sH "Authorization: Bearer ${QIITA_TOKEN}" \
    "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=100" \
    | jq -r '.[] | [.id] | @csv'`

for ITEM_ID in $ITEM_IDs
do
    ITEM_ID=`echo $ITEM_ID | tr -d '"'`
    TMP=`curl -sH "Authorization: Bearer ${QIITA_TOKEN}" \
        "https://qiita.com/api/v2/items/${ITEM_ID}" \
        | jq -r '.page_views_count'`
    VIEW_TOTAL=$(( $VIEW_TOTAL+$TMP ))
done

echo "VIEW_TOTAL--->"
echo $VIEW_TOTAL
```

テスト

```
$ bash sample2.sh
VIEW_TOTAL--->
91141
```

# その他

記事100個以上に対応する場合は、page/per_pageを調整する。
per_pageの最大値は100に設定されているため。

>[Qiita API v2 documentation - Qiita:Developer]
>ページネーション
一部の配列を返すAPIでは、全ての要素を一度に返すようにはなっておらず、代わりにページを指定できるようになっています。これらのAPIには、1から始まるページ番号を表すpageパラメータと、1ページあたりに含まれる要素数を表すper_pageパラメータを指定することができます。pageの初期値は1、pageの最大値は100に設定されています。また、per_pageの初期値は20、per_pageの最大値は100に設定されています。

### Macで jq: command not found のエラーが出る場合

```
bash sample.sh
sample.sh: line 5: jq: command not found
```

Macの場合はhomebrewでインストールする

```
$ brew install jq
```

これでjqが使える

# 参考
[Qiita API v2 documentation - Qiita:Developer](https://qiita.com/api/v2/docs)
[jqコマンドでjsonを扱う](https://qiita.com/tomitz/items/f48a6bfae1123cadc69a)
[Qiita APIを利用して記事のViewsとストック数がまとめて取得できるAPIを作ってみた](https://cloudpack.media/43823)
[Qiita API でいいねとVIEW数をCurlで取得する方法](https://icck.github.io/posts/0009-qiita-curl/)
[【Qiita API】いいね！閲覧数の自動集計](https://qiita.com/Naoto9282/items/252c4b386aeafc0052ba)
[awk で気軽に集計](https://qiita.com/kitsuyui/items/3647bd5b8a5b3e858d3c)
CarthageでRswiftを導入する方法(Xcode) 

#はじめに
XcodeにCarthageでRswiftを導入する手順をまとめました。


参考にした記事
https://qiita.com/nesskazu/items/38e1e325392780b65ce4
https://github.com/mac-cain13/R.swift  (Manuallyの部分)
https://qiita.com/lovee/items/5617cdaa28a470b141c2

##1. Carthageをインストール
まずCartthageを導入する。
https://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1

Cartfileを作成する。

```:ターミナル 
$touch Cartfile
```

##2. Rswiftをインストール
作成したCartfileに下記をコピペ。

```:Cartfile
github "mac-cain13/R.swift.Library"
```
![スクリーンショット 2020-04-29 18.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/5d1da04f-7b6d-02b0-82bf-8eae3b5baaa4.png)

ターミナルでcarthage updateを実行。

```:ターミナル 
＄carthage update
```
プロジェクトのCarthage/Build/iOSに、Rswift.frameworkが生成される。

##3. Xcodeでの設定
①Generalにフレームワークを追加
プロジェクトをクリック→GeneralのFrameworks, Libraries, and Embedded ContentにRswift.frameworkを追加。
(FinderからCarthage/Build/iOSと移動し、Rswift.frameworkをドラッグ＆ドロップ)
![スクリーンショット 2020-04-29 18.25.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/5f48a2d2-adab-d900-9848-1703b43d3794.png)

②Scriptを2つ追加する
Build Phases → ＋ボタン → NewRunScriptPhaseを押す。
スクリプトに

```
/usr/local/bin/carthage copy-frameworks
```

を追加して、さらにInput Filesに

```
$(SRCROOT)/Carthage/Build/iOS/Rswift.framework
```

を追加する。
![スクリーンショット 2020-04-29 18.31.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/42d73b13-bf78-c825-8893-9ef64be0491f.png)


もう一度Build Phases → ＋ボタン → NewRunScriptPhaseを押す。
スクリプトに

```
"$SRCROOT/rswift" generate "$SRCROOT/R.generated.swift"
```

を追加して、Input Filesに

```
$TEMP_DIR/rswift-lastrun
```

Output Filesに

```
$SRCROOT/R.generated.swift
```

を追加する。
追加したら2つ目のscriptをCompile Sourcesの上にドラッグ＆ドロップで移動させる。
![497683_7c2ebc46-6a83-4456-7288-da9e5540c43d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/2a3c8485-b1fd-ce65-ab1b-17e1e619330d.png)


③rswiftをダウンロード
下記から最新のrswift-v-.zipをダウンロードする。
https://github.com/mac-cain13/R.swift/releases
<img width="994" alt="スクリーンショット 2020-04-29 19.58.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/b10b0ea4-7818-580a-0a07-40cc2c6e560f.png">

下記の２つのファイルをプロジェクトのrootに追加する。(rootじゃないとビルドできないので注意してください。)
![スクリーンショット 2020-04-29 18.30.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/6b09d95d-1d7c-1946-45d1-4206f1627dd6.png)


##4.ビルド
ビルドするとR.generated.swiftが生成されるのでプロジェクト内に移動させる。
![スクリーンショット 2020-04-29 18.33.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/2449e4cc-0bf4-6fbc-c324-640707d72470.png)


##5. .gitignoreに追加

```:.gitignore
# R.swift
*.generated.swift
```

##おわりに
これでRswiftの導入は完了です。
コピペ用！git＋herokuデプロイまでの忘備録

#gitでローカルリポジトリからリモートリポジトリにpushするまでのコマンドとコマンド毎の各種エラーを解説

//gitの設定を削除
rm -rf .git


gitでローカルリポジトリからリモートリポジトリにpushするまでワークフローはだいたいこんな感じ

//ローカルリポジトリとして登録
git init

//リポジトリの初期設定
git config --global user.email メールアドレス
git config --global user.name ユーザ名


//originのリモートリポジトリ登録
git remote add origin https://github.com/ユーザ名/リポジトリ名


//指定のファイルをステージングエリアへ
git add -A

//ステージングエリアのファイルを、ローカルリポジトリに確定
git commit

//ローカルリポジトリのファイルをリモートリモジトリにアップロード
git push origin master
//上記のコマンドを無理やりpush
git push -f origin master

それでは一連の流れを再現するコマンドを学んだことで、続いて各コマンドの深い所まで学んでいきましょう。

------------------------------------------------------------------------------

###指定のファイルをステージングエリアへ移動

```
//指定のファイルをステージングエリアへ
git add
```

//オプションの解説
//配下のファイル全てを指定
git add -A

//配下のファイル全てを指定
git add .


###ステージングエリアのファイルを、ローカルリポジトリに確定

```
//ステージングエリアのファイルを、ローカルリポジトリに確定
git commit -m "1st"
```

//オプションの解説
//配下のファイル全てを指定
git commit --amend

//ローカルリポジトリのファイルをリモートリモジトリにアップロード
##git push origin master


###git push origin masterで発生するエラー一覧
error: failed to push some refs to 'https://github.com/repogitori.git
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

###参照:GitHubにpushする時にエラー：一部の参照をプッシュできませんでしたと表示されてpushできない時
https://qiita.com/kazuki0714/items/ceda3a6721a9a99082de

上記のエラーの解決法として「git push -f origin master」で無理やりpushすることが可能。


//git commit をリセットする。
git riset

//コミット後にブランチを消す、コミットを一つにまとめる、
git rebase -i

リモートリポジトリ名前指定なし、push
git push -f origin HEAD


//git addをキャンセル、リセットする。
git stash

gitコンフリクト解消

------------------------------------------------------------------------------

##herokuデプロイコマンド集

##ヘロクにログインする
heroku login

##ヘロクのアップ置き場を作る。
heroku create リポジトリ名（かぶるとエラー）

（例）
##ヘロクのアップ置き場を作る。（ララベルオプション付き）
heroku create リポジトリ名 --buildpack heroku/php

##ヘロクのアップ置き場を作る。（レイルズオプション付き）
heroku create リポジトリ名 --buildpack heroku/ruby


##herokuにデプロイ
git push heroku master


##railsプロジェクトを本番環境(heroku)にマイグレーション
heroku run rails db:migrate


##laravelプロジェクトを本番環境(heroku)にマイグレーション
heroku run php artisan migrate



-----------------------------------------
##railsプロジェクトをheroku用に書き換え

1.Gemfileの設定
2.config/datebase.ymlの設定
3.config/environments/production.rbの設定


1.Gemfileの設定
sqlite3を以下のように上書きしよう

```gemfile
gem 'sqlite3', groups: %w(test development), require: false
gem 'pg', groups: %w(production), require: false
```

-----------------------------------------
2.config/datebase.ymlの設定


```config/datebase.yml
production:
#半角スペース２個分の空白を開ける
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
```

-----------------------------------------
3.config/environments/production.rbの設定


```config/environments/production.rb
#デフォルトでfalseとなっている以下の箇所をtrueに変更
  config.assets.compile = true

```
  
-----------------------------------------
Chromeのアドレスバーから直接GoogleのUS(英語)版で検索する方法

初期設定だと、Chromeのアドレスバーに検索ワードを打ち込んで検索すると、日本のGoogleサイトでの検索結果が表示される。youtubeで検索する方法や、weblioで検索する方法などはいろいろ記事があるが、当記事はUS版のGoogleサイトで検索する方法について。


#先に結論
Chromeの、[設定＞検索エンジン＞検索エンジンの管理＞追加]より、以下の通り設定する。
（アドレスバーにchrome://settings/searchEnginesと打ち込んでも開けます）



- 検索エンジン：Google_US(わかりやすいように任意で設定）
- キーワード：us(呼び出しやすいように任意で設定）
- URL：{google:baseURL}search?gl=us&hl=en&pws=0&q=%s&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:searchClient}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}

![スクリーンショット 2020-07-09 18.30.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484294/f0c41172-b0ab-cdc0-fdec-90d9c76d86cc.png)

精査していないので、不要なパラメータも含まれているかも。。


#参考記事
###Chromeの検索エンジンの設定について
こちらを参照して試みた。
検索地域はUSになったが、パラメータが足りないようで、日本の記事が検索される。
<a href="https://kitaney-google.blogspot.com/2020/01/google-chrome-us.html" target="_blank">Google Chrome のアドレスバーの検索エンジンの検索地域を US に変更する方法（別窓）</a>

###パラメータについて
こちらの記事に詳しい。ここを参照してパラメータを追加した結果が、上述のURLになる。
<a href="https://www.suzukikenichi.com/blog/how-to-search-on-google-com-in-english-from-japan/" target="_blank">日本からアメリカのGoogle (google.com) で英語で検索する方法（別窓）</a>
Pandasのgroupby処理で発生するマルチカラムをシングルに直す方法

## 概要

Pandasのgroupby処理をする際に、`.agg()`を利用して、`[max, min]`等、複数の統計量を計算すると、返ってくるデータフレームがマルチカラムになっている。このマルチカラムを簡単にシングルカラムに直す方法を紹介する。

## 準備

0, 1のみから成る5行2列のデータフレームをサンプルとして作成する。

```{python: input}
import numpy as np
import pandas as pd

mat = np.random.rand(5, 2)
mat[mat > 0.5] = 1
mat[mat <= 0.5] = 0
df = pd.DataFrame(mat, columns=['A', 'B'])
```

```{python: output}
     A    B
0  0.0  1.0
1  1.0  0.0
2  0.0  1.0
3  0.0  1.0
4  0.0  0.0
```

## 状況

`.agg()`で`[min, max]`を指定すると、マルチカラムになってしまう。

```{python: input}
df.groupby('A').agg({'B': [min, max]}).columns
```

```{python: output}
MultiIndex([('B', 'min'),
            ('B', 'max')],
           )
```

## 解決策

for文で`zip`を扱う時のように変数（以下の例では`level1, level2`）を用意し、fstringを用いて文字列として結合する。

```{python: input}
[f'{level1}__{level2}' for level1, level2 in df.groupby('A').agg({'B': [min, max]}).columns]
```

```{python: output}
['B__min', 'B__max']
```

## 追記

### 2020/09/23

上記の他にも、以下の方法があったのでメモとして残しておきます。両方とも、`droplevel()`を用いて、マルチカラムを解消しています。

#### タプルで列名を直接指定する方法

```{python:input}
df.groupby('A').agg({'B': [("B__min", min), ("B__max", max)]}).columns.droplevel()
```

```{python:output}
Index(['B__min', 'B__max'], dtype='object')
```

#### add_prefix()で指定する方法

```{python:input}
df.groupby('A').agg({'B': [min, max]}).add_prefix("B__").columns.droplevel()
```

```{python:output}
Index(['B__min', 'B__max'], dtype='object')
```
UE4でSpriteStudioを使ってみよう

本当はUE4とJenkinsの連携を記事にしようかなと思っていましたがお仕事やプライベートが思っていた以上に忙しくなりあまり進捗がなかったので書くのを断念しました。
申し訳ありません・・・・・・
またアドベントカレンダー遅刻して大変申し訳ございませんでした。

仕事でUE4上でSpriteStudioを使う機会があったので導入方法とかを簡単に書いてみました。

##プラグインの導入
まず公式のGutHubからプラグインを落としてきます。
[UE4用プラグイン](https://github.com/SpriteStudio/SS6PlayerForUnrealEngine4)

**※必ずブランチのタグから自分のUE4のバージョンに対応したものを選択して落としてきてください**

落としたらファイルを解凍して中にある
\SS6PlayerForUnrealEngine4-master\Ss6PlayerExamples
直下にあるPluginsを自分のプロジェクト直下(contentフォルダとかがある場所)にコピペしてください
その状態で再度UE4を起動し、編集タブからプラグインを選択しSpriteStudio6のプラグインがあるかチェックしてください。
![SpriteStudioエビデンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252878/8b391d4b-5f46-4b30-772d-73dc858e5634.png)

これでプラグインの導入は完了です。

##SSPJファイルのインポート
インポート自体はずごく簡単でSSPJファイルをコンテンツブラウザ上にドラッグ＆ドロップするだけです。
コンテンツブラウザのインポートボタンからも可能です。

インポートしたSSPJファイルをダブルクリックするとViewerを起動することができます。
![SpriteStudioエビデンス1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252878/97b9e86c-2367-1848-8e2d-4afed463ca8b.png)

AnimPackでアニメーションのパックを選択して隣のAnimationから再生したいアニメーションを選択することで実際のアニメーションを確認できます。

##実際に表示してみる
次は実際に表示してみましょう。

私はUMG上に表示してみました。
![spritestudio2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252878/00dea4d7-db46-6d0f-9579-31b85e871284.png)

こんな感じでパーツを配置してます。
ボタンでアニメーションの切り替え、ポーズができるようにしてます。
SpriteStudioのウィジェットは「SsPlayerWidget」と検索で入力すると出てきます。
パーツを配置した後に
・詳細の中のSpriteStudioAssetでSSPJファイルを選択できます。
・SpriteStudioPlaySettingsで再生するアニメーションパック(AutoPlayAnimPackName)、アニメーション(AutoPlayAnimationName)を設定できます。インデックスでも指定できます。

ブループリントはこんな感じで組んでみました。

イベントグラフ
![SpriteStudioエビデンス3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252878/e82c9167-c47f-9d83-5793-b0f7cf6c27cf.png)

changeEffect関数
![SpriteStudioエビデンス4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252878/8e663d41-f0ac-3ec1-db61-bd0e89a4dd46.png)

GetNumAnimPacksでSSPJファイル内のアニメーションパックの総数を取得できます。
PlayByIndexでアニメーションパック、アニメーションのインデックスを指定してアニメーションを再生できます。
Playノードを使ってアニメーションパック名、アニメーション名を指定しての再生もできます。

changeAnim関数
![SpriteStudioエビデンス5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252878/34011d80-b659-5b4f-6319-7b64e52e8d21.png)

changeEffect関数とそんなに変わらないです。
GetNumAnimationsbyIndexノードで指定したアニメーションパック内のアニメーション数を取得できます。
再生方法は変わらないです。

PauseAnim関数

![SpriteStudioエビデンス6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252878/26b25663-114e-0144-3781-2a277f256893.png)

ポーズ用の関数です。
IsPlayingノードでアニメーションが再生中か取得できます。
再生中ならPauseノードでアニメーション停止、停止中ならResumeノードで再生という感じです。

再生するとこんな感じになると思います。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">サクッと <a href="https://t.co/4oqzshNapd">pic.twitter.com/4oqzshNapd</a></p>&mdash; フミッツ (@fumittu) <a href="https://twitter.com/fumittu/status/1255444382041419782?ref_src=twsrc%5Etfw">April 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

公式からプラグインが用意されているので結構簡単にUE4上でSpriteStudioのアニメーションを再生させることができます。
他にもいろいろなノードが用意されているので是非試してみていただけたらと思います。

##参考にさせていただいたサイト
[公式チュートリアル](https://www.webtech.co.jp/help/ja/spritestudio/guide/output6/unrealengine4/)
MySQLのエラーERROR! The server quit without updating PID file (/usr/local/var/mysql/S.local.pid).の対処法



rails sをしてもMysql周りのエラーでうまくいかない。

調べると
・mysql.sockの権限がない
・mysqlを起動させていない
・socketファイルがない

いくつか原因がある。



socketファイルがあるかどうかを確認。

```
 $  mysql_config --socket
/tmp/mysql.sock
```

ある。


```
$  mysql.server start

ERROR! The server quit without updating PID file (/usr/local/var/mysql/S.local.pid).
```

エラーが出ます。

次に権限を確認。



```
$  chmod 777 /tmp/mysql.sock

$  mysql.server start
```

権限周りの問題だった。

終わり。
Google Chrome Remote Desktop で、よくホストから切断されてしまう場合は、原因はこれかもしれません

## 問題
　コロナのせいで在宅勤務を余儀なくされ、Google Chrome Remote Desktop を利用しているのだけど、頻繁にホストから良く切断されてしまい、原因不明で困っている

## 原因（仮説）
　不安定なネットワークだったり、ホストOS側の環境だったり※1、原因は多種多様なのですが、本記事で挙げた原因が、あなたに刺されば幸いです。WindowsOS は、IPv6 より IPv4 を好む傾向（設定に因りけりですが）があり、ゲストOS（あなたのPC）が IPv6 で、ホストOSへ繋ごうとすると問題となることがあるようです。もし切断された際は、以下のURLにアクセスし、現在、IPv4 若しくは、IPv6 で接続されているかを確認してください。（両方の場合もあり）

http://v6v4.net/

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71427/88785b21-2358-80d3-8148-f23c85e31d30.png)

＜参考＞
Disable IPv6 protocol
http://windowsbulletin.com/fixing-chrome-remote-desktop-not-working/#Disable_IPv6_protocol

## 対応方法
ゲストOS（あなたのPC）の IPv6 を無効にします。
無効化にする方法はネットに沢山あるのでリンクを掲載いたします。

https://novlog.me/win/win10-disable-ipv6/

## ※1

ホスト側の環境等で、IPv6に対応していない場合があります。
ホスト側PCで以下のURLにアクセスすることで確認できます。

あなたの IPv6 接続性をテストしましょう。
https://test-ipv6.com/index.html.ja_JP

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71427/7d775d02-a2be-503d-fbfb-d1e4284ac06a.png)
2行でgatsby-config.jsで補完を効かせる方法

※この記事は @akameco さんの [2行でwebpack.config.jsで補完を効かせる方法](https://qiita.com/akameco/items/e12377e55e379d29636e) のオマージュです。

## How

`gatsby-config.js`の`module.exports`の前に次のようなJSDocを追加します。

```gatsby-config.js
/**
 * @type import('gatsby').GatsbyConfig
 */
module.exports = {};
```

これで、`siteMetadata`や`plugins`などのプロパティの補完および型の表示がされるようになります。

## Why

@akameco さんの [2行でwebpack.config.jsで補完を効かせる方法](https://qiita.com/akameco/items/e12377e55e379d29636e) が詳しいので、そちらを参照してください。
Vue の SFC のパーサーをブラウザで動かすやつを vue-next で作った

Vue の SFC の正しい構文をシュっとブラウザで試せるやつがほしいので作った。

https://github.com/sosukesuzuki/vue-sfc-parser-playground

## 1. Vue の SFC の公式のパーサーを Rollup でブラウザ向けにビルドする。

https://github.com/vuejs/vue-next/tree/master/packages/compiler-sfc の `parse` という関数をそのままでは動かないので Rollup でごにょごにょしてブラウザ向けにビルドする。ビルドしたのがこちら。

https://github.com/sosukesuzuki-sandbox/vue-sfc-parser-browser

Rollup よくわからないので雰囲気でプラグイン突っ込んだり書いたりしたら動いた。[vue-next 本家の `rollup.config.js`](https://github.com/vuejs/vue-next/blob/master/rollup.config.js) が大変参考になった。

## 2. せっかくなので vue-next を使ってみる、でも TSX を tsc のみでコンパイルしたい。

Vueっぽいツールを作るので、せっかくだから vue-next を使ってみたいと思ったけど、tsc のみで TSX のコンパイルができたらかっこいいなと思ったので、そういうサンプルを探してみる。potato4d さんの https://github.com/potato4d/vue-next-tsx-only-tsc を見つけたので参考にして tsx で書いてみる。できた。この書き方でやると、書き心地がだいぶ React に近くなる気がする。

## 3. Web Worker でパースができるとかっこいい。

パースなんて重い処理をメインスレッドにさせちゃあかんので、Web Worker 上で動かせたらかっこいい。webpack でバンドルしているので、`worker-loader`、WorkerPlugin つっこんで Comlink でやったら動いた。

## 4. まあ便利なんだけど使い所が限られすぎる

よく考えたらあんまり欲しいときがないけど楽しかったのでよし。
RailsでTypeError can't quote Rack::Session::SessionIdが起きる場合の解決策

`session.id`をそのまま使ってクエリを実行すると、`TypeError can't quote Rack::Session::SessionId`が起きる。

```
# Bad
user = User.find_by(session_id: session.id)
# => TypeError can't quote Rack::Session::SessionId

# Good
user = User.find_by(session_id: session.id.to_s)
# Success!
```

上記のコードは`Rails 5.2.4.2`で実行している。認証情報を扱うgemでこの例外が起きることもあるので、Railsのバージョンによって`session.id`の実装が異なるのかもしれない。

##### 参考リンク

[ruby on rails - TypeError - can't quote Rack::Session::SessionId - Stack Overflow](https://stackoverflow.com/questions/60019801/typeerror-cant-quote-racksessionsessionid)