OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub

・GitHubにリモートリポジトリを作成する
・ローカルリポジトリにリモートリポジトリを登録する
・ローカルリポジトリのブランチ名を変更する
・登録したリモートリポジトリへプッシュする
・GitHubのリモートリポジトリにプッシュされたか確認する

git remote add origin リモートリポジトリURL
ローカルリポジトリにリモートリポジトリを登録する

git remote -v
ローカルリポジトリに登録されたリモートリポジトリの一覧を表示する

git push origin master
登録したリモートリポジトリへプッシュする

originのURLが間違っている場合
git remote remove origin
git remote add origin リモートリポジトリURL

ローカルリポジトリを作りなおして、既存のリモートリポジトリにプッシュする場合
git push -f origin master
RxSwiftのメソッドチェーン

# はじめに
初めまして！
タップルでRxSwift武者修行中のせーたろです。

RxSwiftを書き始めてから知ったメソッドチェーンの備忘録兼メモです。

# メソッドチェーンとは
メソッドを組み合わせた書き方をすることによって、関数型プログラミングの副作用を避ける方法を取り入れたプログラミングをし、より読みやすく宣言的なコードを書いています。
宣言的なコーディングを実現するため、メソッドチェ-ンによる処理の記述が基本であり重要です。

# map と subscribe による例

```swift
// 入力されたInt型の値を2倍する
_ = Observable.just(10) 
.map { $0 * 2 } 
.subscribe(onNext: { print($0) // => 20 
})
```

型が同じ限り一生.mapとかの処理をつなげられるけど、
この場合.subscribeしたら型が変わるのでdisposeBagして終了

(多分このつなげて書くやつをつよつよの人は"比較的宣言的な書き方"と言ってるっぽいです)

そして、mapのクロージャの戻り値を Int → Stringにすると
購読できるイベントもInt → Stringになります。
**map に使われているクロージャの戻り値によって購読できる型が変わるということです**

RxSwiftのオペレータはジェネリクスを使ったインタフェースを定義することで、メソッドチェ-ンを実現しています。
【Android】pecoを使って特定のシステムサービスのdumpsysを簡単にする

## dumpsysとは？

Androidデバイス上で動作しているシステムサービスの状態をダンプしてくれるツールです

https://developer.android.com/studio/command-line/dumpsys

## dumpsysの面倒なところ

`adb shell dumpsys`を実行すると、すべてのシステムサービスの状態がダンプされます。
しかし、通常使う場合には特定のシステムサービスの状態のみダンプしたいことがほとんどです。
例えば、バッテリーの状態をダンプしたい時には`adb shell dumpsys battery`って感じで、特定のシステムサービス名を指定します。
ただ、システムサービスの数が多いので名前を覚えるのがちょっと面倒です。

## pecoを使って特定のシステムサービスのdumpsysを簡単にする

システムサービス名をなんとなく覚えるだけでいい感じに特定のシステムサービス名を指定してdumpsysできるコマンドを組んでみました。
そのコマンドが以下になります。

```bash
adb shell dumpsys -l | sed -e '1,2d' | peco | xargs adb shell dumpsys
```

まず`adb shell dumpsys -l`でシステムサービスの一覧を取得しています。
次に`sed`で出力される不要な行を削ります。
次に[`peco`](https://github.com/peco/peco)に渡します。
最期に`peco`で選択したやつを`adb shell dumpsys`に渡すことで、特定のシステムサービスのdumpsysが行えます。

## Demo

こんな感じ:relaxed:
pecoを使うことでインタラクティブに絞り込みができるので、システムサービス名をなんとなく覚えるだけ大丈夫！

![adb_dumpsys_peco.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43637/609e1b29-f4c2-462c-04ad-fc90ac65d5d4.gif)

## aliasにするとさらに楽

こんな感じで✨

```bash
alias dumpsys="adb shell dumpsys -l | sed -e '1,2d' | peco | xargs adb shell dumpsys"
```

## おわりに

快適なadbライフをお過ごしください💪
Gitコマンド

 git init
リポジトリを作成し、Gitのバージョン管理下に置きます。

git status
リポジトリを作成し、commit-tutorial/をGitのバージョン管理下に置きます。

git add
ワークツリーから変更箇所をステージしてインデックスに移動させる

git commit
コミット、つまりバージョンを作る

git log
現在コミットした履歴を確認

git diff
前回のコミットと、今回変更したファイルの差分を抽出

-mオプションを使用してコミットメッセージを直接入力
git commit -m ""

インデックスとローカルリポジトリの基準コミットとの差分
git diff --cached
Gitの基本概念

#リポジトリ

バージョン管理をするには、1つ1つのバージョンの情報（いつ、誰が、どのファイルのどの箇所を、どんなメッセージを残して変更したか）を保存しておく必要があります。

その保存先のことをリポジトリと呼びます。

リポジトリは、ただの入れ物（箱）です。リポジトリという箱の中にGitで保存しているバージョン情報が保管されているとイメージしてください。

また、リポジトリには2つ種類があります。

ローカルリポジトリ
リモートリポジトリ

ローカルリポジトリは、実際に作業を行うリポジトリのことで、自分のPCやCloud9上で作られるリポジトリ。
リモートリポジトリはGitHub上に作られる。

#コミット

Gitでは、1つ1つのバージョンのことを、コミットと呼びます。また、コミットを作成することをコミットすると言います。

リビジョン番号（1e010f4572625f3741a306b8e996cのような値）
コミットした人（誰が）
コミットした日時（いつ）
コミットしたときのファイル内容の差分（どのファイルの、どの箇所を）
コミットメッセージ（どんなメッセージを残して）
親コミット（1つ前のコミット）のリビジョン番号

リビジョン番号は、コミットを一意に指定できるIDのような役割を果たします。

コミットメッセージは、コミットするときに必須のメッセージで、どういった内容の変更をコミットするのか簡単なメッセージにまとめて書いておきます。

リポジトリ内では、1つ1つのコミットが親コミットのリビジョン番号を持っているので、コミットは親コミットを辿ることで連なるように変更履歴を管理できているのです。

#ワークツリーとインデックス

ワークツリーとは、Gitでバージョン管理されているフォルダ内のことです。

次に、ワークツリーから次のコミットに含めたいファイルの変更箇所を選択します。変更箇所を選択することを、ステージすると言います。ステージされた変更箇所はインデックス（ステージングエリアとも言う）に反映されます。インデックスはローカルリポジトリへコミットする一歩手前で、コミットする変更箇所を選ぶ段階です

最後にコミットを行い、バージョンが1つ進みます。このときコミットされる変更箇所は、インデックスにステージされた変更箇所のみです。

インデックスはコミットを行う前に、ワークツリーの変更箇所の中から関連性のある変更のまとまりを選択するという重要な役割があるのです。
リーダブルコード読んで意識していきたいことをまとめる part1

# 目的
リーダブルコードを読んだアウトプットとして、今後自分が意識していきたいことを複数回に分けてまとめて行こうと思います。
(1章はそこまで具体的な話はなかったので2章からまとめていきます。)

# 2章 命名関連
2章は命名規則に関連する話がまとめられてました。基本的に `名前に情報を詰め込む` ということがメインになってきます

## 明確な単語を選ぶ
例えばGetという単語を選ぶより、状況に応じてdownloadやfetchなどのより明確に情報が伝わる場合がある。
個人的には場合によるかなと思いますが、get系の処理を関数に切り出している場合などは単語に気をつけた方がいいかなと思いました。daoなどのDBアクセスなどを目的としたgetであればそこまで気にしなくてもいいのかなーとも思いました。

## 具体的な名前を使って、物事を詳細に説明する
例えばTCP/IPポートをサーバーがリッスンできる状態かを確認するメソッドの場合、 `ServerCanStart()` よりも `CanListenOnPort()` という名前の方がより正確に情報が伝わる。
具体的に命名しようとすると名前が長くなりそうだなーと思いましたが今のエディタは優秀なので長くてもちょっと打てば補完ができるので問題ないかなと思います。ただ、読みにくくはなると思うのでなるべく簡潔に。

## 変数名に大切な情報を追加する
例えば、ミリ秒を表す変数名には `_ms` をつけるとか。個人的には結構意識していたことで、scalaで変数の型がわかった方がいい場合などは、Futureなら `hogeF` とかって付けたりしています。

## スコープの大きな変数には長い名前をつける
個人的にはスコープにかかわらず今のエディタは補完が効くんだから変数名はわかりやすい方がいいと思っていたのですが、スコープも意識すると明らかにわかる変数とかは簡略化できそうなのでコードもすっきりしそうなので意識したいです。

# 3章 誤解されない名前
3章は誤解を招かないような命名をするための内容でした。

## 限界値を含める時は境界にminとmaxを使う
範囲を決める場合にその値を含める時は、minとmaxを使う。5以上10以下を表したい時とかに使う。

## 範囲を指定する時はfirstとlastを使う
例えば配列のindexを指定するような場合にfirstとlastを使う。

今回はここまでにしようかなと思います。
Gitが保存する履歴情報

・Gitが保存する履歴情報

いつ
誰が
どのファイルの、どの箇所を
どんなメッセージを残して変更したか


・Gitを使うことで解決すること

ファイルを変更する際に、バックアップファイルを作成する必要がない
変更する前のファイルの内容にいつでも戻れるので、安心してファイルを変更できる
複数人でファイルを変更したり、共同開発を行うことができる
【VSCode】〜python利用時のtips〜


#tips1: IntelliSenseがjupyterファイルで機能しない場合の対処法

下記の方法により解決した
1. VSCodeの拡張機能でPylanceをインストールする
2. ショートカットキー(Windows: Ctrl + ,)または，メニューバーから基本設定 > 設定 で設定画面を開き、settings.jsonファイルを開く
3. ファイル内に"python.languageServer": "Pylance",を追加or変更する

#tips2: 置換
以下コマンドで置換可能
command + shift + H
【Rails】RSpec キホンのキ 【導入編】

# はじめに
RSpecはRailsで定番のテストフレームワーク。
minitestと比べると必要なGemが多い。
とはいえ一度に全てのGemを入れると、どのGemがどこでどういう働きをするのかが曖昧になってしまう。
そこで、RSpecの学習に至っては、テストの内容に応じてGemを逐次追加していく手法を取ることにした。

# RSpecとFactoryBot

## Gemの導入と設定
``RSpec``と、テスト用データの生成用となる``FactoryBot``を導入する。
FactoryBotはminitestにおけるfixture的な役割を担う。
ここで``spring-commands-rspec``を入れておくと、RSpecを``binstub``から実行し、``spring``を使ってテスト開始にかかる時間を短縮できるとのこと。

```Gemfile.rb
group :development, :test do
  gem "rspec-rails"
  gem 'spring-commands-rspec'
  gem "factory_bot_rails"
end
```
``bundle install``したら以下のコマンドでRSpec用のデータを生成する。

```console
$ bundle exec rails generate rspec:install
```

RSpecの設定を追加する。
設定は``config/application.rb``に書く。
ここでは``generate``コマンド実行時にRSpec用のファイルを生成するかを設定している。
``true``か``false``かはプロジェクトによって適宜変更する。

```config/application.rb
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    config.generators do |g|
      g.test_framework :rspec,
        controller_specs: true,
        fixtures: true,
        helper_specs: true,
        model_specs: true,
        request_spec: true,
        routing_specs: false,
        view_specs: false
    end
  end
end
```

次にFactoryBotの設定。
以下のように記述することで、FactoryBotクラスの呼び出しを簡略化できる。

```spec/rails_helper.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end
```
```ruby
# FactoryBotクラスの呼び出し
user = FactoryBot.create(:user)

#省略版 
user = create(:user)
```

テスト用データの設定をもう一つ。
以下の一行のコメントアウトを外しておく。
``spec/support/``配下のファイルを読み込めるようになる。
ここにはテスト用のヘルパーを記述するファイルなどが置かれる。

```spec/rails_helper.rb
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
```

最後に、RSpecのbinstubを導入する。
これで``$ bundle exec rspec spec/``に加えて``$ bin/rspec spec/``でテストを実行できるようになる。

```
$ bundle exec spring binstub rspec

# 実行コマンド
$ bin/rspec spec/
```

## specファイルの生成
RSpecで使用されるファイルは全て``*_spec.rb``というファイル名になっている。
これをコントローラやモデルに合わせて各種用意していく。
例えばusers_controller用のspecファイルは以下のように生成する。

```console
$ rails g rspec:controller users
    create  spec/controllers/users_controller_spec.rb
```

## テスト用データの用意
FactoryBotを使って、各種クラスのテスト用データ（インスタンス）を定義する。
例えばUserクラスなら、``/spec/factories/users.rb``に定義していく。

```/spec/factories/users.rb
FactoryBot.define do

  # Userモデルのテストデータmichaelを定義
  factory :michael, class: User do # Class: Userはいらないかも
    name { 'michael' }
    email { 'michael@example.com' }
  end

  # 汎用データをたくさん用意する
  factory :user do
    sequence(:name) { |n| "name-#{n}"}
    sequence(:email) { |n| "test-#{n}@example.com"}
  end
end
```

定義したテストデータを呼び出してインスタンス変数に格納し、テストで使用する。

```/spec/models/users_spec.rb
RSpec.describe User, type: :model do
  before do
    # モデルのみの作成
    @michael = build(:michael)
    # DBへレコード生成
    @michael = create(:michael)
    
    # 汎用データの活用
    @user1 = build(:user)
    @user2 = build(:user)
    @user3 = build(:user)
  end
  .
  .
  .
end
```

続く
ふと、aタグの機能を無くしたいと思った

今サイト制作を行っているのですが、パンくずリストを作る際にaタグの機能（リンク、cursor）を無くしたいと思ったので、その備忘録として書いていきたいと思います。

まず、``cursor: none,cursor: default``にしてもaタグの機能を消すことができません。

なので、ここで出てくるのが``pointer-events``です。

ただ、このCSSは``CSS3``なので、IEでの動きはあまりよくないそうです。

```style.css
a {
  pointer-events: none;
}
```

これで、aタグの機能を無くすことができました！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
Vagrantを使って起動した仮想マシン(ubuntu)からWindowsのChromeを自動操作したい

##やりたいこと
Vagrantを使用して起動した仮想マシン上(ubuntu)のSelenium(python)から、ホスト(仮想マシンを実行しているWindows10)上のChromeにリモートアクセスする。

##環境
#####仮想マシン側
* ubuntu(64bit) 18.04.5(LTS)
* python        3.8.0
* selenium      3.141.0

#####ホスト側
* virtual box 6.1.16
* vagrant     2.2.14
* chromedriver 87.0.4280.88

#問題のある操作
#####前提
* 事前にvagrantfileの設定がなされ、`vagrant up`によって仮想マシンが起動している。
* 接続した仮想マシン(ubuntu)上にpythonの実行環境があり、必要なライブラリ(selenium等)がインストールされている。
* seleniumでブラウザを自動操作する際に必要となるドライバ(今回はchromedriver)がインストールされている。

#####操作
１．ホスト上のWindows Power Shell(chromedriverがカレントディレクトリにある状態)で以下のコードを実行

```powershell
.\chromedriver.exe --port=4444
```

２．vagrant上にある以下のpythonコードを実行する。

```python:test.py
from selenium.webdriver import Chrome, ChromeOptions, Remote

options = ChromeOptions()
driver = Remote('http://10.0.2.2:4444', options=options)
#以下省略
```

３．以下のようなエラーが出力される

```bash
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    driver = Remote('http://10.0.2.2:4444', options=options)
#中略
  File "/home/vagrant/scraping/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 
208, in check_response
    raise exception_class(value)
selenium.common.exceptions.WebDriverException: Message: Host header or origin header is specified and is not whitelisted or localhost.
```

また、ホスト側で実行しているchromedriverでは以下のようなログが吐き出されている。

```powershell
[1610458155.162][SEVERE]: Rejecting request with host: 10.0.2.2:4444. origin is
```

#原因
chromedriverのデフォルト設定では、ローカルからの接続しか許容しない。

#対策
リモートホストからの接続を許可するためには、chromedriver実行時の
コマンドに --allowed-ipsを付加してやればよい。

```powershell
.\chromedriver.exe --port=4444  --allowed-ips
```
ホスト側でchromedriverを実行している状態で、再度仮想マシン上のpythonコードを実行してやれば、仮想マシンのubuntuからWindowsのChromeを自動操作できる！

#参考
紹介した方法はchromedriverの公式ドキュメントに記載されています。
＊セキュリティ上の考慮点にも言及しています。
https://chromedriver.chromium.org/security-considerations

Seleniumに関する知識は以下のサイトで入手可能
https://www.selenium.dev/documentation/ja/
Googletransを使ってDataFrameのカラム名を日本語から英語に変換する

# はじめに

pandasでデータフレームを扱う際に、カラム名が日本語だと何かと不便なことがあります。
そのような場合に、日本語のカラム名を手動で変換すると手間なので、googletransを用いることで楽をしようという魂胆。


# 環境とバージョン

- googletrans 4.0.0-rc.1
- Google Colaboratory


# Googletransについて
Googletransは、google翻訳のAPIを使うためのpythonライブラリです。Google colaboratoryの場合、以下のコードでインストールできます。


```python
!pip install googletrans==4.0.0-rc1
```

**※1月12日現在、バージョンを指定せずインストールすると、googletrans 3.0.0 がインストールされます。このバージョンではうまく動作しません。**
参考：https://qiita.com/_yushuu/items/83c51e29771530646659


# googletransの使い方

```python
from googletrans import Translator
columns = df.columns

translator = Translator()
str = 'こんにちは'
print(translator.translate(str, dest='en').text)
```

出力結果

```result
Hello
```

destのデフォルトは英語なので dest='en' は略しても問題ないです。目的から逸れますが、destを変更することで、他の言語への翻訳が可能です。


```python
print(translator.translate(str, dest='fr').text)
```

出力結果

```result
Bonjour
```


# 日本語カラムから英語カラムへ変換

いよいよ本題です。日本語から英語カラムに変換していきます。まずはデータフレームの準備です。

## データフレームの準備

```python
import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(25).reshape(5, 5),
                  columns=['顧客ID', '店舗ID', '個数', '価格', '店舗面積'])
df.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993875/9720fe8a-bdef-9237-77e3-691c1eb46ad0.png)

データフレームの準備ができました。日本語カラムだと、lightGBMで訓練する際にエラーが出るなど厄介です。英語に変換していきましょう。

## Googletransを用いた英語変換

```python
eng_columns = {}
columns = df.columns
translator = Translator()

for column in columns:
    eng_columns[column] = translator.translate(column).text

print(eng_columns)
```

出力結果

```result
{'顧客ID': 'Customer ID', '店舗ID': 'Store ID', '個数': 'Quantity', '価格': 'price', '店舗面積': 'Store area'}
```

無事に英語に変換できました。しかしこのままだと、空白が入っており煩わしいです。
空白をアンダーバーに変換するコードを実装します。

```python
eng_columns = {}
columns = df.columns
translator = Translator()

for column in columns:
    eng_column = translator.translate(column).text
    eng_column = eng_column.replace(' ', '_')
    eng_columns[column] = eng_column

df.rename(columns=eng_columns, inplace=True)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993875/5fa2ad8b-af6d-eee7-1344-c99b2f9f2bf5.png)

無事に英語のカラムにすることができました。
[メモ] fatal error: 'wchar.h' file not found

ビルドエラーの修正履歴

macOSで今までビルドできていたプログラムがビルドできなくなって、以下のようなビルドエラーが発生する時のメモ。CommandLineToolsのSDKが変わってしまったらしい。

```terminal
#include_next <wchar.h>
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/wchar.h:              ^~~~~~~~~118
:15: fatal error: 'wchar.h' file not found
```

### 環境
macOS Catalina (10.15.7)
XCode12.3
Apple clang version 12.0.0 (clang-1200.0.32.28)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

### 作業

https://github.com/phracker/MacOSX-SDKs/releases からMacOSX10.15.sdk.tar.xzをダウンロードして、
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs にコピー。

```
cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
sudo tar xvf MacOSX10.15.sdk.tar.xz
sudo rm MacOSX10.15.sdk.tar.xz
```

MacOSX.sdkのリンク修正

```
ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk'
```

以上で再びビルドできるようになった。
Rails gmailを使ったaction mailerでContact formを作成

#早速作っていこ〜

Railsガイドによると
>Action Mailerを使うと、アプリケーションのメイラークラスやビューでメールを送信することができます。メイラーの動作はコントローラときわめて似通っています。メイラーはActionMailer::Baseを継承し、app/mailersに配置され、app/viewsにあるビューと結び付けられます。

ということなのでgemとかいらないんです。

今回はcontact formに件名と内容をユーザーに打ってもらってそれをdbに保存してメールにも送るという構成で作っていきます。では必要なもの作っていきます
(docker-compose run 書くの長いので割愛 docker使ってないひとはこのままでok)

```
#モデル作っていきます
$ rails g model Contact name:string message:text
#おまじないいきま〜す
$ rails db:migrate

#ユーザーに入力してもらうformを作るためにコントローラー、ビューも作ります
$ rails g controller contacts new(newだけで十分です)

```

そういえば、modelにバリデーションで どちらのカラムにもpresence: true書いておくといいと思います。
空のメールが何件も届くかもしれないので

コントローラーの処理書いていきます

```ruby:controllers/contacts_controller
def new
  @contact = Contact.new
end

def create
  @contact = Contact.new(contact_params)
  if @contact.save
    #↓あとで定義します(これでメール送信)
    ConatactMiler.contact_mail(@contact).deliver
    flash[:success] = 'メールを送信しました'
    redirect_to root_path #←お好きな場所へ
  else
    flash[:danger] = 'メールの送信に失敗しました'
    render :new
end

  def contact_params
    params.require(:contact).permit(:name, :message)
  end
```

ビューも書いちゃいましょう

```html:views/contacts/new
<%= form_with(model: @contact, local: true) do |f| %>
    
  <%= f.label :name, '名前' %>
  <%= f.text_field :name %>

  <%= f.label :message, 'お問い合せ内容' %>
  <%= f.text_area :message, size: "5x10" %>

  <%= f.submit '送信' %>
  
<% end %>
```

ここまではいつも通りですね

本命のaction mailer作っていきます

```
$ rails g mailer contact
```

次はさっきのcontact_mailerを定義していきます

```ruby:mailers/contact_mailer.rb
def contact_mail(contact)
  @contact = contact
  mail to: '自分のeメール', subject: 'メールの件名'
end
```
お次はメールの内容を作ります。

```html:views/contact_mailer/contact_mail.text.erb←作ってください
<%= @contact.name %>様からお問い合わせがありました

・お問い合わせ内容
<%= @contact.message %>
```

次にgmailの設定を行っていきます

```ruby:config/environment/development.rb
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address: "smtp.gmail.com",
    domain: 'gmail.com',
    port:587,
    user_name: '自分のgmail',
    password: 'パスワード',　#←これはgmailのパスワードではなくgoogleアカウント管理画面で作成します    
    authentication: :login
  }
```
これの内容全部説明するのはめんどくさいので説明します

上からメール送信有効にする、送信できなかったらエラー吐く、メイラーはコントローラーとはHTTPリクエストのコンテキストが異なるから明示する、メールの送信方法、その設定諸々。

最後に

```ruby:mailers/application_mailer.rb
  #default from: "from@example.com" ←デフォルト
  defult from: "自分のeメール"
  layout 'mailer'
```
これはしなくてもいいかもしれない。

完成！！

エラーがでたらエラーを潰していくしかないです。あと、eメールとpasswordは環境変数で設定しておかないとgitに上がっちゃいますのでご注意を！！！！
Ruby製REST-like APIフレームワーク「grape」の最小構成 (RSpec入り / Heroku対応)

`GET /ping` で `{"response": "pong"}` を返すAPIサーバを、Ruby製REST-like APIフレームワーク「[grape](https://github.com/ruby-grape/grape)」で作成する最小構成。

## ファイル/ディレクトリ構成

```
.
├── Gemfile
├── Procfile
├── config.ru
├── api.rb
└── spec
    ├── spec_helper.rb
    └── api_spec.rb
```

### ユニットテスト

```
bundle exec rspec spec/api_spec.rb
```

### ローカル開発

```console
bundle exec rackup
## もしくは
heroku local:start
```

## ファイル解説

### Gemfile

`bundle init` で作成した後、以下を行う。

- Ruby のバージョン指定 (Heroku向け)
- grape、rspec、puma の指定
- rack-test はユニットテスト(RSpec)向け

```ruby:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

ruby "~> 3.0.0"

gem "grape"
gem "rspec"
gem "puma"

group :development do
  gem "rack-test"
end
```

### Procfile

[Procfile](https://devcenter.heroku.com/ja/articles/procfile) は Heroku 向け。Herokuを使わない場合は不要。

```:Procfile
web: bundle exec rackup config.ru -p $PORT
```

### config.ru

rackup 向け。

```ruby:config.ru
require_relative File.join("api")
run APIserver
```

### api.rb

API本体。

```ruby:api.rb
require "grape"

class APIserver < Grape::API
  format :json

  get "/ping" do
    {"response": "pong"}
  end
end
```

### spec/spec_helper.rb

RSpec向け。
`require_relative` は config.ru と同じものを指定していく。

`require "rack/test"` 以下は [grape/RSpec](https://github.com/ruby-grape/grape#rspec) に書いてある通り、おまじない的。 `app` が API のインスタンスを返すようにする必要がある。

```ruby:spec/spec_helper.rb
require_relative File.join("..", "api")

require "rack/test"
include Rack::Test::Methods
def app
  APIserver
end
```

### spec/api_spec.rb

ユニットテスト本体。

```ruby:spec/api_spec.rb
require "spec_helper"

context "GET ping" do
  it "return pong" do
    get "/ping"
    expect(last_response.status).to eq(200)
    expect(JSON.parse(last_response.body)).to eq({"response" => "pong"})
  end
end
```

## 今後の拡張ポイント

rackup(webサーバ)のエントリーポイントは `config.ru`、RSpec(ユニットテスト)のエントリーポイントは `spec_helper.rb` です。require等はここに集中する(もしくは共通化)するようにしましょう。

APIのデータ構造を実装したければ、[grape-entity](https://github.com/ruby-grape/grape-entity)が使えます。Nestedな1:N構造も実装可能です。[RESTful APIにおいて一対多関係のデータ構造をGrape::Entityを使って表現する](https://qiita.com/ma2shita/items/fa7a315655e364301e8e)

複雑なJSONの検証には [rspec-json_matcher](https://github.com/r7kamura/rspec-json_matcher) が使えます。複雑なケースの例は [rspec-json_matcherでJSONの検証を自由自在に行う](https://qiita.com/ma2shita/items/a75e43512b43cde712e6) をご覧ください。

EoT
JUCE: iOSでファイルの読み込みを行うための設定

JUCEを使ってiOS用アプリ・プラグインを作る際に、ユーザーが保存および読み込みを行うファイルの読み書きを行うための設定。

## 前提 ##
Projucerを使ってAudioプラグインを作っている。

## 問題 ##
何も考えずにMac/Windowsのプラグインを作っている感覚でファイルの読み書きを行おうとすると、書き込みはできるが読み込みができなかった。保存したファイルを読み込もうとFileChooserを使って表示すると、保存したファイルはグレーアウト状態で選択できない。
![IMG_0051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/798ba0e5-3381-e7a4-89e8-f28200bb2939.png)

## 解決方法 ##
XcodeでExported Type Identifiersやらを設定する必要があり、これで読み込みもできるようになった。ただしアイコンはアプリのアイコンをそのまま使おうと思ったが何故か設定できなかった。

* TARGETSでアプリを選択し、InfoのExported Type Identifiersを表示。
* Descriptionに適当な説明を入れる。
* Identifierも適当に設定。自分のアプリのidentifierにファイルの拡張子とか？
* Conforms Toにpublic.data。
* Extensionsに読み込みたいファイルの拡張子を記述。
![Screen Shot 2021-01-12 at 22.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/128091b4-4995-ebe0-c061-974bdf23b6a2.png)

![IMG_0052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/28d73dd0-5865-d587-0c77-e06168a01e97.png)

Document Typesも設定すると何かいいことがあるのかわからないが（なくても読み書きができるので）、一応設定はしてみた。
![Screen Shot 2021-01-12 at 22.22.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/bc598a88-9ece-dd7e-0542-c69fb927d3af.png)

## 未解決の問題 ##
ローカルでの読み書きはできるようになったが、iCloudはまた別問題らしい。iCloud Document?の設定を見よう見まねでやってみたが、書き込みはできても読み込みができなかった（ファイルのオープンでどうも失敗する様子）。ContentSharerを使ったファイルの共有（AirDropとか）はまた更に別の問題。
Dockerでngrokを利用する

# ngrokとは
ngrokは、ローカルホストを外部に公開(トンネル)できる

# やりかた

公式のイメージを用いる
docker composeを利用してnginxを公開します

まずはtokenを発行します

以下から登録して発行してください

https://ngrok.com/

```yml:docker-compose.yml

version: "3.8"

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    ports:
      - 80:80
    depends_on:
      - app

  ngrok:
    image: ngrok/ngrok:latest
    restart: unless-stopped
    command:
      - "start"
      - "--all"
      - "--config"
      - "/etc/ngrok.yml"
    ports:
      - 4040:4040
    volumes:
      - ./ngrok.yml:/etc/ngrok.yml
```

docker-composeと同じ階層に`ngrok.yml`を作成します

```yaml:ngrok.yml
version: "2"
authtoken: "ここに取得したToken"
tunnels:
  nginx:
    proto: http
    addr: nginx:80 #ここに接続したいサービス
    host_header: rewrite

```

あとは、起動して、localhost:4040にアクセスするとurlが発行されているのでそれをもちいて確認してください。

その他のオプションはこちらで確認できます。

https://ngrok.com/docs/agent/config/

便利だし、サクッと使えるので助かる...!
LinebotのようなSSL必須の自己証明不可の外部APIをローカルで開発する場合にはすごく役立ちそうです。
【jQuery】pagePiling.jsを使ってスクロールをかっこよくして見た

ポートフォリオ作品において、架空の映画告知サイトを作りたいと思い、pagePiling.jsを使ってスクロールがかっこよくなるようにしました。


## ダウンロード
[pagePiling.js](https://alvarotrigo.com/pagePiling/)
より、プラグインをダウンロード。
ダウンロードしたZIPファイルを解凍し、実装したい作品のローカルリポジトリにファイルを突っ込みます。

今回は動画背景にしたかったので、ダウンロードしたファイル内の「examples」から、「videoBackground」のhtmlを使用しました。

## プラグインを読み込ませる
ファイルを突っ込んだら、HTMLの`head`タグ内で、
・jquery.pagepiling.css
・jquery.pagepiling.min.js
を読み込ませます。

```HTML:HTML
<link rel="stylesheet" type="text/css" href="jquery.pagepiling.css">
<script type="text/javascript" src="../jquery.pagepiling.min.js"></script>
```
別で、jQueryを読み込んでおくのも忘れずに。



## 実装結果

簡単に実装することができました！
スクロールに動きがつくだけでも、かっこよくなりますね。



## 参考サイト様
[【jQuery】pagePiling.jsで1ページスクロールを実装する](https://www.miso.blog/jquery-pagepiling/)
MQL5言語 基礎（メモ）

基本的にC++に近いので、よく使われると思うところだけまとめます

#コメント#
```
//--- 一行コメント
/*  複数
   行の         // 入れ子にされた一行コメント
   コメント
*/
```
#データ型#

整数型（char、short、int、long、uchar、ushort、uint、ulong）
論理型（bool）
リテラル型（ushort）
文字列型（string）
浮動小数点型（double、float）
カラー型（color）
日付時刻型（datetime）
列挙型（enum）

構造体（struct）
配列
ユーザー定義型（typedef）
オブジェクトポインタ

#演算子#
##ブロック##

```
if(x==0)
 {
  Print("invalid position x = ",x);
  return;
 }
```

##If-Else 条件演算子##

```
if (式)
    演算子 1
else
    演算子 2
```

##三項演算子 ?:##

```
式 1 ?式 2 : 式 3
```

##Switch 演算子##

```
switch(式)
 {
  case constant: operators
  case constant: operators
     ...
  default: operators
 }
```

##while反復演算子##

```
while（式）
 演算子;
```

##For 反復演算子##

```
for（式 1 ; 式 2 ; 式 3 ）
  演算子
```

##do while 反復演算子##

```
do
  演算子;
while（式）;
```

#関数#

##外部関数の記述##
別のモジュールで定義された外部関数は明示的に記述されるべきです。

```
#import "user32.dll"
int     MessageBoxW(int hWnd ,string szText,string szCaption,int nType);
int     SendMessageW(int hWnd,int Msg,int wParam,int lParam);
#import "lib.ex5"
double  round(double value);
#import
```
##関数のエクスポート##
MQL5 プログラムで export 後置修飾語とともに宣言された関数は別の MQL5 プログラムで使用することが出来ます。

```
int Function() export
 {
 }
```

##イベント処理の関数##
OnStart：スクリプトの実行のみに自動的に生成されます。
OnInit：EA開始時の処理を記述する。
OnDeinit：EA終了時の処理を記述する。このサンプルでは処理なし。
OnTick：価格変動発生時の処理を記述する。
OnTimer：Timer イベントがエキスパートアドバイザーと指標のシステムタイマーによって生成される時に呼ばれます。
OnTrade：この関数は Trade イベントの発生時に呼ばれます。
OnTradeTransaction：取引口座にいくつかの明確なアクションを実行すると、状態が変更されます。
OnTester
OnTesterInit 
OnTesterPass 
OnTesterDeinit 
OnBookEvent：BookEvent は板情報の変更時にエキスパートアドバイザーと指標のために生成されます。
OnChartEvent
OnCalculate 

#プリプロセッサ#
##マクロ代入（ #define ）##
プリプロセッサディレクティブはコンパイルする前にソースコードを前処理するためにコンパイラによって使用されます。

```
#define 識別子式                           // パラメータなしの形式
#define 識別子 (パラメータ1,... パラメータ8) 式   // パラメトリック形式
```

ディレクティブ(#undef) :　前に定義されたマクロ代入の宣言を解除します。

##プログラムのプロパティ (#property)##
全ての MQL5 プログラムは、明示的に起動せずにプログラムの中で適切なサービスを提供してクライアント端末を補助する #property という付加的な特定のパラメータを指定することが出来ます。

```
#property 識別子の値
```

##ァイルの読み込み (#include)##

```
#include <ファイル名>
#include "ファイル名"
```

##関数のインポート (#import)##

```
#import "file_name"
   func1 define;
   func2 define;
   ...
   funcN define;
#import
```

##条件付きコンパイル（ #ifdef、#ifndef、#else、#endif ）##

```
#ifdef 識別子
  //ここにあるコードは、識別子がすでに #define ディレクティブのプリプロセッサに定義されている場合にコンパイルされます。
#endif

#ifndef 識別子
  // ここにあるコードは、識別子がすでに #define ディレクティブのプリプロセッサに定義されていない場合にコンパイルされます。
#endif
```

#オブジェクト指向プログラミング#

##型の封裝と拡張##

```
class CPerson
 {
protected:
  string            m_name;                     // 名称
public:
  void              SetName(string n){m_name=n;}// 名称を付ける
  string            GetName(){return (m_name);} // 名称を返す
 };
```

##継承##

```
class クラス名 :
         (public | protected | private) opt  基本クラス名
 {                                    
   クラスメンバの宣言
 };
```
コントローラーについて【Rails初心者向け】

🔰　〜プログラミング初心者　〜🔰
勉強を始めてまもないので、
認識や表記が違うところがあれば、コメンツお願いします！！

**目次**

- [x] 用語の解説
- [x] コントローラーについて
- [x] コントローラーのアクション説明 
- [x] ソースコードの記述式

このブログでは以上の４点を説明します。

---
## 覚えておきたい用語

・リクエスト＝データや情報を要求すること。
・レスポンス ＝リクエストの要求を返却すること。
・アクション  ＝コントローラーが出す処理のカテゴリー
・ルーティング
リクエストに対してどのような処理をするか道筋を明記する仕組み。

#コントローラーについて

クライアントサイドから送られてきたリクエストに対するアクションをまとめて用意しておき、ルーティングからリクエストを受けて処理を行った後クライアントにレスポンスを返す役割
この他にもモデル、ビュー、データベースが働いてくれますが説明は割愛させてもらいます。

##コントローラーアクションカテゴリー
アクションはコントローラーにインスタンスメソッドとして定義

|  アクション名 |  リクエストに対してどのように動くか  |
| :---: |:---: |
|  index  |  一覧表示ページを表示する |
|  new |  新規投稿ページを表示する  |
|  create  |  データの投稿を行う  |
|  show  |  個別詳細ページを表示する |
|  edit  |  投稿編集ページを表示する  |
|  update  |  データの編集を行う |
|  destroy  |  データの削除を行う |

##コントローラーの記述例


```sample_controller.rb
def new
〜
〜
end
```

他にも

```routes.rb
 get "URL/〜/"　     => "コントローラ名#アクション名"
 ＃記述例
 get "users/index" => "users#index"

```
こんな感じで記述します。

END
ファイル処理に使えるPowershellコマンド集

画像ファイル名の処理に使えるPowershellコマンドをまとめてみました。

# ファイル名の先頭に任意の文字を追加
(末尾に追加する場合は$_.name + "追加したい文字" となる)

```
dir -Exclude "処理を除外するディレクトリの名前" | Rename-Item -NewName {"追加したい文字" + $_.name}
```

# ファイル名を一部置換

```
 dir | Rename-Item -NewName {$_.name -replace '置換前','置換後'}
```

# 隠しファイル を一括削除
隠しファイルを削除する場合 -Force オプションが必要

```
Remove-Item C:\Path\to\隠しファイル -Force
```

# 画像複製
複製元ファイル名と複製後ファイル名を表(csvファイル)にまとめていることを前提とする。

```
$csv = Import-Csv ファイルパス -Encoding UTF8
# $csv | Format-Table
[string] $original_name = ''
[string] $original_path = ''
[string] $duplicate_name = ''
[string] $duplicate_path = ''
[int] $i = 0 　
while ($i -le 行数) {
    $original_name = $csv[$i].複製元ファイル名列のヘッダ名
    $duplicate_name = $csv[$i].複製後ファイル名列のヘッダ名  

    $original_path = "画像ファイルディレクトリパス\$original_name"
    $duplicate_path = "画像ファイルディレクトリパス\$duplicate_name"

    Copy-Item $original_path -Destination $duplicate_path

    $i += 1
}

```

## 文字列検索(ファイル拡張子ごとに処理を分けたいときなど)
- -like で、ワイルドカードを使った文字列比較。
- -match で、正規表現を使った文字列比較ができる。
- それぞれ、前に not が追加された否定形がある（-notlike, -notmatch）。

(下記例)

```
if ($string -like '*.pdf') {
        $original_path = "..\original_directory_name\$string"
}

```
[Ruby] Rubocopとは

#Rubocop
Rubyのコードがコーディング規約に沿っているかを確認できる
「静的コード解析ツール（コーディングチェックツール）」の１つです。

実行することで下記のような項目を自動でチェック・修正してくれます。

・インデント
・文字数の長さ
・メソッド内の行数
・条件式の見やすさ
・ソースコードの複雑度
・ハッシュなどの末尾にあるカンマの有無

#Rubocop導入
Gemfileのgroup :development do　〜　end 内に下記のように記述し、
bundleコマンドを実行すれば導入完了です。

```言語:Gemfile
group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'rubocop', require: false

end
```



# Rubocopを実行

```言語:ターミナル
# Rubocopを実行
% bundle exec rubocop
```

# チェック内容を自動で修正させる

```言語:ターミナル
# Rubocopを実行し、check内容を自動修正
% bundle exec rubocop -a
```




 修正すべき  |修正の余地あり
-----------|-----------------
F Fatal    |   C Convention             
E Error    |    R Refactor
W Warning  |
スライスの中にマップ


メモとして残します

```golang

package main

import (
	"fmt"
)

func main() {
    // ① スライス　var slice []string
    // ② マップ　　var map1 map[string]string

    // スライスの中にmapを作るには、①と②を組み合わせるだけ
	var slice []map[string]string
	slice = append(slice, map[string]string{"apple": "red", "banana": "yellow"})
	slice = append(slice, map[string]string{"kiwi": " green"})

	fmt.Println(slice)              // [map[apple:red banana:yellow] map[kiwi: green]]
	fmt.Println(slice[0])           // map[apple:red banana:yellow]
	fmt.Println(slice[1])           // map[kiwi: green]
	fmt.Println(slice[0]["apple"])  // red
	fmt.Println(slice[0]["banana"]) // yellow
}
```
品質保証に欠かせない「テストの観点」を人間に置き換えると？~①静的解析~

いきなりですが
####自分が作ったプログラムは可愛いですか?

プログラミング工程における軽い動作確認から導入時まで、
意識的に、かつ無意識的に「テスト」を行っていることでしょう。

そのテストをする上で切り口として用いられる「テストの観点」ですが、
そのテスト観点を人間に置き換えると作ったプログラムへの「尊さ」が段違いになります。

###「面倒なテスト工程」は「我が子が成長する過程を確認すること」であることを解説していきます。

今回はその第一回目として開発初期から使われる静的解析を掘り下げていきます。

##静的解析~身体測定~
まず、プログラミングをしながらツール等を用いて文法チェックなど確認します。
この静的解析は身体測定に置き換えることができます。  

<dl>
  <dt>静的解析</dt>
  <dd>コードを記述しながら、各言語の仕様に合わせて異常がないかを判断します。</dd>
  <dt>身体測定</dt>
  <dd>子供が成長しながら、身長や体重などの増え方から異常な発達をしていないかを判断します</dd>
</dl>

***つまり、***
***プログラミングをしながら静的解析を行うことは、***
***身体測定をしながら我が子が異常な成長をしていないか確認すること、***
***と考えることができるわけですね。***


愛着が段違いです。
Typescriptが流行っているのも、我が子を大切に育てたい思いがあるからかもしれませんね。

今回は簡単に。
続編を投稿するか、この記事を更新するなどしていきます。
自作のTransformの作成方法

参考ページ：[Pytorch – torchvision で使える Transform まとめ](https://pystyle.info/pytorch-list-of-transforms/#outline__7)

画像データの前処理に利用する<code>transforms</code>では、Lambda関数を渡すことでユーザ定義のTransformが作れる。

```
from torchvision import transforms
import  cv2
import matplotlib.pyplot as plt

img = cv2.imread("sample.jpeg")

plt.imshow(img)
```

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684234/ac201a8c-3969-d8a1-eba1-6cdd15e86ef6.png)


```
def gray(img):
    """
    RGBに変換してグレースケール化
    """
    
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    
    return img

transform = transforms.Lambda(gray)

img_transformed = transform(img)
plt.imshow(img_transformed)
```

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684234/2d246279-6916-a3f3-df63-7334fd9f8b71.png)

この処理をComposeでつなげれば、pytorchのtransformのpipelineに組み込むことができる。
[MySQL] データベースを作成する方法

#MySQLにログインする
ログイン方法は以下で詳しく説明しています。
https://qiita.com/momo1010/items/d72d2d567c0768ce2d0d

#データベースを作成する
`CREATE DATABASE　作成するデータベースの名前;` でデータベースを作成していきます。
例えば以下のようになります。

```
CREATE DATABASE　tweet_app;
```

`Query OK, 1 row affected` と表示されれば成功です。
次に以下を実行して先ほど作成したデータベースの名前が表示されているか確認しましょう。

```
SHOW databases;
```

#テーブルを作成する
##データベースの選択
`USE　使用するデータベースの名前;` を実行します。
例えば以下のようになります。

```
USE tweet_app;
```

`Database changed` と表示されれば成功です。

##テーブルの作成
`CREATE TABLE テーブルの名前 (カラム名やデータタイプ、カラムにつけるオプションなど);` を実行します。

```
CREATE TABLE users (id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id));
```

`Query OK, 0 row affected` と表示されれば成功です。

##テーブルの確認
以下を実行して作成したテーブルの確認をしましょう。

```
SHOW tables;
```

先ほど作ったテーブル名が確認できます。
次にテーブル構造を確認してみましょう。

```
DESCRIBE users;
```
セレクターについて改めて勉強し直した①

#はじめに
CSSを使って、装飾をしているといっつもクラス名に対してスタイルを適用させていて、
別にできていないわけではないけど、これって全ての要素に対してクラス名を付けなきゃいけない形になってしまっていました。なんか効率が悪いというか、クラス名をつけるまでも無いような要素もあるし…とモヤモヤしていたので、クラス名を付けずに、スタイルを思うままに適用させる方法は無いかと、調べました。

本日から何日かに分けて紹介します。

##基本
要素にスタイルを適用させる場合は、`要素名`のみを記述します。

```css
h1 {}
p {}
div{}
```

クラス名にスタイルを適用させる場合は、`.クラス名`の記述をします。
「<font color=red>.</font>」←が大事！

```css
.section {}
.content {}
```
同じクラス名をもつ全てにスタイルを適用させます。

ID名にスタイルを適用させる場合は、`#ID名`の記述をします。
「<font color=red>#</font>」←が大事！

```css
#section {}
#content {}
```

ちなみに、同じID名は付けられません。
ターミナルのコンソール内においてテストコードのエラーメッセージが表示されない時の対処法

# きっかけ
```rails:items_controllers.rb
it "郵便番号が空では登録できないこと" do
        @user_item.postal_code = nil
        binding.pry
        @user_item.valid?
        expect(@user_item.errors.full_messages).to include("Postal code can't be blank")
      end
```
コントローラー内において、上記のような記述をして、ターミナルにてエラーメッセージを取得しようと思ったら、下のような結果が出た。

```shell:コンソール
[1] pry(#<RSpec::ExampleGroups::UserItem::Nested::Nested_2>)> @user_item.errors.full_messages
=> []
```
なぜ？？
エラーメッセージが出ないということはバリデーションに問題があるのかと思ったが、原因はそこではなかった。

# 結論
binding.pryの記述する場所が間違っていた。
or 
binding.pryをかけてからエラーメッセージにたどり着くまでの順番を間違えていた。

binding.pryをかけるとその箇所でPCの動きが止まるが、そこからコンソールで動かす場合は、順番が大切なのだった。むやみやたらにエラーメッセージをくれぇぇぇ！と言っても、パソコン様は動いてはくれない。
まずは、上記の場所にbinding.pryをかけた場合は、

```shell:コンソール
@item.valid?
```
という記述をコンソール上でしなくてはいけなかった。
そして、返り値がfalseだった場合に、初めて

```shell:コンソール
@item.errors.full_messages
```
を記述することでエラーメッセージが返ってくるようになる。

# まとめ
binding.pryをかけた場合は、むやみやたらにパラムスの値やエラーメッセージを求めるのではなく、通常のコントーラーでの動きと同じように順番を確認しながら進めるとコンソールは望みを叶えてくれる。
AWSの請求額に納得できないときに見直すべき4つの項目

AWSの請求ダッシュボードを見て「えっ…私の請求額、高すぎ…？」となったものの、何のせいで請求されているかイマイチピンとこずに、納得いかないときってありませんか？

そんなときに見直すべき項目（実体験）をまとめました。


# EC2を複数個同時起動していないか
EC2の無料利用枠は750時間/月です。
1つのEC2を仮に1ヶ月間ぶっ通しで起動し続けたとしても、24時間✕30日＝720時間でギリ無料で使えます。
が、2個以上のEC2で同じことをすると720時間✕2＝1440時間でアウトです。

1ヶ月起動し続けることはないにしても、EC2を複数個起動することはよくあると思います。
ハンズオン等でWEBサーバの冗長構成を作ったり、DBホスト用にプライベートサブネットにEC2を立てたり、Cloud9を使ったり、、、などなど。

複数個起動した状態で停止忘れなどした日には、あっという間に無料枠を食いつぶしてしまいますので、ご注意ください。

# NATゲートウェイを削除し忘れてないか
>VPC 内に NAT ゲートウェイを作成することを選択した場合は、NAT ゲートウェイがプロビジョニングされ利用可能であった "NAT ゲートウェイ時間" に対して料金が請求されます。
https://aws.amazon.com/jp/vpc/pricing/

NATゲートウェイは存在するだけで課金されます。Lambdaのような使用した分だけ課金とかじゃないです。
ハンズオン等でNATゲートウェイを作った場合は、終わった瞬間速攻削除しましょう。

# EC2削除時にEBSも併せて削除しているか
EC2を削除したとき、EBSも忘れずに削除していますか？
EBSの保存容量にも無料枠があり、1GBを超えると課金が始まります。

（EBS消し忘れでウン万円請求されたみたいな記事をQiitaで前見たんだけどURL忘れた。。。）

# 別リージョンに消し忘れリソースはないか
不要なリソースは全部消したからヨシ！と思ったら、別リージョンに消し忘れリソースが残っていたなんてことはありませんか？
東京リージョンしか使ってないとかなら問題ないですが、複数リージョンを使い分けている方はご注意ください。

# 参考
https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc

https://aws.amazon.com/jp/vpc/pricing/
laravel8 + vue.js2.6の.nativeの使い方

###この本を書いたきっかけは？何についての記事？
「これから始める、Vue.js実践入門」（山田祥寛/著、SBクリエイティブ株式会社/発行）のリスト4-15~16あたりをlaravel8のプロジェクト内でやりたかったので、コードを少し改変してみた。
###参考にしたリンク
https://qiita.com/b1san/items/6bc0be17cd6ed687520c

```javascript:MyComponent3.vue
<template>
  <div>
    <mycomponent4 v-on:focus.native="onfocus"></mycomponent4>
  </div>
</template>

<script>
import mycomponent4 from './MyComponent4.vue';
export default {
components: {mycomponent4},
 data: function () {
    return {
        current: 0,
    }
 },
  methods: {
    onfocus: function (e) {
      console.log(e);
    }
  },
};
</script>
```
```javascript:MyComponent4.vue
<template>
<input type="text" />
</template>
<script>
export default {
 data: function () {
    return {
        // current: 0,
    }
 },

    // props: ['step'],
    methods: {
    }
};
</script>
```
```javascript:app.js
require('./bootstrap');
import Vue from 'vue'
import App3 from './components/MyComponent3.vue'
const app3 = new Vue({
    el: '#app3',
    components: {
         App3
    },
});
```
TensorFlowを動かすためのJupyterのDocker環境

####環境
MacBookPro
OS:Catalina



####内容

DockerHubからimageをPull

```
$ docker pull tensorflow/tensorflow:latest-jupyter
```

imageからコンテナを起動
ホスト側で8888ポートを使用していたので、私は、8889:8888で行った。

```
$ docker run -it -p 8889:8888 --name tf_test tensorflow/tensorflow:latest-jupyter
```

上記実行後、表示されたURLにアクセスしてJupyterのページが表示されていればOK。(8888番ポートを使用していなければ、置き換える)




参考サイト
https://www.tensorflow.org/install/docker?hl=ja
【基本情報】データベース

###DBMSと関係データベース

DBMS、、、データベース管理システム
RDBMS、、、リレーショナルデータベース
テーブルはレコード、列で構成。

データの矛盾や重複を防ぐために正規化をする。

関係演算
選択、、、行を取り出す演算
射影、、、列を取り出す演算
結合、、、表と表をくっつける演算

データベースの仕様は、三層スキーマ構造をとっている。
外部スキーマ、概念スキーマ、内部スキーマという三層。

###主キーと外部キー

主キー、、、行を特定する鍵のこと。ID番号みたいなものが入った列のこと。

外部キー、、、表と表をつなぐ鍵のこと。表と表を関係づけるため、他の表の主キーを参照する列のことを外部キーとよぶ。

###正規化
正規化の目的は、データに矛盾や重複を生じさせないこと。関係データベースでは、第３正規系の表を管理する。

非正規形（繰り返し部分を持っている。）
第１正規形（繰り返し部分を取り除いた。）
第２正規形（部分関数従属している列を切り出した形。）
第３正規形（主キー以外の列に関数従属している列を切り出した形。）

関数従属、、、主キーが決まれば、列のあたいが一意に定まる関係のこと。
部分関数従属、、、複合キーの一部の項目だけで、列の値が一意に定まる関係のこと。

###SQLでデータベースを操作する
SQL（structured query language）というのは、DBMSへと指示を伝えるために用いる言語のこと。

SELECT 列名 FROM 表名 WHERE 条件
ex)select 商品名,単価 from 商品表 where 単価 >= 300

select * のように列名のところへアスタリスクを指定すると、全ての列が抽出対象となる。

order by 列名 ASC(またはDESC)
ASCは昇順（省略可能）、DESCは降順


#####集合関数リスト
|   関数    |   機能                            |
|:--------:|:----------------------------------|   
|max(列名)  |その列の最大値を求める。              |
|min(列名)  |その列の最小値をもとめる。             |
|avg(列名)  |その列の平均値を求める。              |
|sum(列名)  |その列の合計を求める。                |
|count(*)  |行数を求める。                       |
|count(列名)|その列の「値が入っている」行数を求める。 |

ex)select count(*) from 商品表
⇨商品の行数がわかる。

グループ化には、group by 列名を使う。
グループに条件をつけて絞り込むには、group by 列名 having 絞り込み条件　を使う。

ex) 
select 分類,AVG(単価)
from 商品分類表
group by 分類
having AVG(単価)>100


###トランザクション管理と排他制御

データベースを複数の人が同時に変更できてしまうと、内容に不整合が生じる恐れがある。

トランザクション、、、一連の処理を一まとめにしたもの
排他制御、、、共有ロックと専有ロックがある。
デッドロック、、、お互いがお互いのロック解除を永遠にまちつづける状態。
ACID特性、、、トランザクション処理に対して必須の４つの特性。原子性、一貫性、隔離性、耐久性の４つ。
ストアドプロシージャ、、、SQL文を一つのプログラムにまとめ、DBMS側にあらかじめ保存しておくこと。（クライアントとサーバ間の通信料を削減できる。）

###データベースの障害管理
障害回復には、バックアップファイルやジャーナルファイルを使う。

コミット、、、一連のトランザクションが完了した時、更新内容を反映させる。
ロールバック、、、トランザクション処理中に何らかの障害が発生した場合、更新前の状態を更新前ジャーナルから取得してトランザクション開始直前の状態まで戻すこと。
分散データベース、、、物理的に別れている複数のデータベースを、見かけ上一つのデータベースとして扱えるようにしたシステムのこと。2相コミット方式で記録していく。
ロールフォワード、、、ハードウェア的障害などでデータベースが故障した場合、まずはバックアップファイルから元のデータを復元し、その後更新後ジャーナルを使ってデータベースを故障直前の状態に復旧させる。
Vue 3.x [Vue warn]: inject() can only be used inside setup() or functional components.の解消法

# 発生する問題

`async setup`関数（正確にはPromiseを返す`setup`関数)内で`inject`を使用すると下記のエラーに遭遇することがあります。

```ts
import { defineComponent, inject } from 'vue'
import axios from 'axios'
import { key } from '@/store/user'

export default defineComponent({
  async setup () {
    const { data } = await axios.get('http://example.com')
    const userStore = inject(key)

    if (!userStore) {
      throw new Error(`${key} is not provided`)
    }

    return {
      userStore
    }
  }
})
```

```
[Vue warn]: inject() can only be used inside setup() or functional components.
```

# 解決策

`inject`を呼び出す箇所を、`await`より前にするとエラーが発生しなくなります。

```ts
import { defineComponent, inject } from 'vue'
import axios from 'axios'
import { key } from '@/store/user'

export default defineComponent({
  async setup () {
    const userStore = inject(key)

    if (!userStore) {
      throw new Error(`${key} is not provided`)
    }

    const { data } = await axios.get('http://example.com')

    return {
      userStore
    }
  }
})
```

# Vue Router・Vuexを呼び出す際にも注意

`useRoute()`、`useRouter()`または`useStore()`は内部で`inject`を使用しているので、同じ問題に遭遇します。

```ts
import { defineComponent } from 'vue'
import axios from 'axios'
import { useRouter } from 'vue-router'

export default defineComponent({
  async setup () {
    const { data } = await axios.get('http://example.com')
    const router = useRouter
  }
})
```

こちらも同様に呼び出し順を変更すればOKです。

```ts
import { defineComponent } from 'vue'
import axios from 'axios'
import { useRouter } from 'vue-router'

export default defineComponent({
  async setup () {
    const router = useRouter
    const { data } = await axios.get('http://example.com')
  }
})
```
【しまった！】ポートフォリオの作成の失敗(自身の経験から)

#背景
・私はWEB系エンジニア（WEB開発企業）への就職に向けて転職活動中の身
・フロントエンドエンジニアを志望
・自身がポートフォリオを作成にあたって失敗してしまった事柄を共有
　どなたかのご参考になればと思います！

#結果
結論としてこのポートフォリオ開発の失敗によって、出戻りが発生し**１か月も遅れをとってしまっています**…

#自分の失敗
まず自分が犯した失敗は2項目です
**１.ポートフォリオを開発するにあたり、模倣としたサイトが曖昧だったこと**
**２.外部設計がおろそかになっていたこと**

#自分が作ろうとしたポートフォリオ
・自分が「邦楽ロック」が大好きであるので、邦楽ロックがさらに多くの方に広まってほしいという思いがあります！
・そこで「邦楽ロックに興味持ち始めた方」「フェス・ライブに興味がある方」をターゲットに**邦楽ロック初心者が欲しい情報をまとめたアプリを開発**しています。

#反省点
１.
・開発を進める前に、現在すでに存在するサイトやアプリのＵＩ／ＵＸを参考に進めようと思ったため複数のサイトを漁りました。
　⇒そこで「Ａ社のサイトのこのボタンのデザイン参考にしよう！」「ヘッダー・フッターはＢ社のサイトを参考にしよう！」と方々のサイトのいいとこどりをした結果、**ＵＩ／ＵＸ的にまとまりのないポートフォリオが出来上がってしまいました**…

・まとまりのないポートフォリオになってしまった理由はもう１点あり、それは開発を進めているうちに**私見が大きく影響してしまった**ことです。
「ここのボタン角丸くした方が雰囲気よくない？」「この背景のデザインはこっちのがかっこいい！」と**漁ったサイトで拾った情報をバンバン投入した結果**、小学生が作る図工の成果物よろしく、**見栄えの悪いポートフォリオが出来上がりました**。
※僕がデザイナーであればこれでもいいのですが、ド素人の意見を反映させたら当然の結果ですね…

２.
外部設計とは、簡単に言うと`「ページのレイアウト／機能の概要が書いてある設計図」を作ること`です。

尚、当初作成した設計図はこちら。
![ポートフォリオコンセプト決め.xlsx - Excel 2021_01_12 22_25_39 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/84d8bea3-b812-aa05-799d-c8ddb115b9e7.png)

この外部設計図の反省点は本当に外観図のみしか作っておらず、これでは**必要な機能が明確になっていない**…
この結果、
「フリーワード検索で検索」⇒「検索結果をクリック」`⇒「詳細表示」`
という流れをポートフォリオに作っているのですが、グレーハッチング部分の機能が必要だと後々判明し、**jsファイルの記法を変更する、という出戻りが発生しました**…

#今後に活かす事
１.
・一つのサイトは統一感あるデザインの元成り立っているので、なるべく`一つのサイトからＵＩ／ＵＸを参考にすべき`かと！
・参考サイト決めたら私見はほぼ不要です！変えるとしても少し色を変えたりとか小変更です！
　素人（自分）の感覚を当てにしてはいけないです！

２.
・各ページに`必要な機能は何か、明確にするべき`です。
　そのうえでコードも書いていくので、後々「あの機能が必要じゃん！」となると僕のように出戻りが発生してしまい、`計画通りにポートフォリオ作成、ひいては転職活動ができなくなってしまいます`。
尚、修正後の外部設計書がこちら。
１枚目(上半分)
![ポートフォリオコンセプト決め.xlsx - Excel 2021_01_12 22_26_54 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/9b41c400-c059-a472-9d29-c15c339e495a.png)
２枚目(下半分)
![ポートフォリオコンセプト決め.xlsx - Excel 2021_01_12 22_27_02 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/e47e6667-3e28-fd87-8a69-00b2d106b198.png)

きちんとページの下に`必要な機能を記載する`ことにしました。

#最後に
冒頭でも書かせていただきました通り、自分の失敗がどなたかのお役に立てば幸いです。
最後までお読みいただきありがとうございました。m(__)m
Microsoft Virtual Machine Converter のダウンロード

2021-01-12現在、[Microsoft Virtual Machine Converter](http://www.microsoft.com/en-us/download/details.aspx?id=42497)をMicrosoftからダウンロードできません。

Archive.orgのキャッシュからダウンロードできます。
https://web.archive.org/web/20200812033617if_/https://www.microsoft.com/en-us/download/confirmation.aspx?id=42497

※ダウンロード及び使用にあたっては、ご自身の判断で行ってください。

ダウンロードした mvmc_setup.msi は、2019-02-04にMicrosoft.comからダウンロードしていたファイルと同一でした。

```
サイズ: 24969216 バイト (23 MiB)
CRC32: 2CEB5373
CRC64: B536D2EB6B03EF83
SHA256: 520B0D08E0B9D2D95206369E56461D3873FB208F507FBCCC28651D43ABA37F33
SHA1: F67812339083376507F51A0B28853C38A3488CF7
BLAKE2sp: 9791EF448499B218B656147940846B92CFBBAF15214FB1FB0C101338B83FA80A
```
A Tour of Goの学習まとめ

# サイト

* [A Tour of Go](https://tour.golang.org/welcome/1)
* [The Go Playground](https://play.golang.org/)
* [Go's Declaration Syntax](https://blog.golang.org/declaration-syntax)

## Packages

Goのプログラムはパッケージで構成する。
```package main```はmainパッケージから実行される
パッケージ名はimportパスの最後の要素名とする

## import

他のプログラムやライブラリをimportする

## Exported names

Goでは、最初の文字が大文字で始まる名前は、外部のパッケージから参照できるエクスポート（公開）された名前となる。小文字で始まる名前は、外部のパッケージから参照できない。

```exportnames.go

package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.pi) // 参照できない
	fmt.Println(math.Pi) // 参照できる
}
```

## Functions

### 構文

関数は、0個以上の引数を取ることができる。
型は引数名の後ろに、戻り値の型は引数の後ろに書く。

```
func 関数名(引数１ 引数１の型, ･･･) 戻り値の型 {
	処理
}
```

```function.go

func add(x int, y int) int {
	return x + y
}

```

### 引数

２つ以上の引数が同じ型である場合には、最後の型を残して省略できる。

```function.go

func add(x, y int) int {
	return x + y
}

```

### 戻り値

関数は複数の戻り値を返すことができる。

```multiresult1.go

package main

import "fmt"

func swap(x, y string) (string, string) { // 戻り値の型を()内で定義
	return y, x
}

func main() {
	a, b := swap("hello", "world")
	fmt.Println(a, b)
}
```

### Named return values

戻り値となる変数に名前をつけることができる。
戻り値に名前をつけると、関数の最初で定義した変数名として扱われる。
名前をつけた戻り値の変数を使うと、 return ステートメントに何も書かずに戻すことができる。

```multiresult2.go

package main

import "fmt"

func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}

func main() {
	fmt.Println(split(17))
}
```

## Variables

### 構文

varステートメントで変数を宣言する。最後の変数の後ろに型を宣言する。
変数には初期値を定義できる。

```var1.go
package main

import "fmt"

var c, python, java bool
var k, j int = 1, 2

func main() {
	var i int
	fmt.Println(i, c, python, java)
	fmt.Println(k,j)
}
```

### 省略方式

関数の中では、var宣言の代わりに短い ```:=``` の代入文を使い、暗黙的な型宣言ができる。
関数の外では、キーワードではじまる宣言( var, func, など)が必要で、 ```:=``` での暗黙的な宣言は利用できない。
in
```var2.go
package main

import "fmt"

// 関数の外ではvarが省略できない
//n := 10

func main() {
	var i, j int = 1, 2
	k := 3
	c, python, java := true, false, "no!"

	fmt.Println(i, j, k, c, python, java)
}
```
## 型定義

### 組み込みの型

* bool 真偽値(true/false) 初期値false
* string 文字型 初期値""
* int 数値型 初期値0
* float32 浮動数値型 初期値0

### 型変換

Goでの型変換は明示的な変換が必要。

```typeconversion.go
package main

import (
	"fmt"
	"math"
)

func main() {
	var x, y int = 3, 4
	var f float64 = math.Sqrt(float64(x*x + y*y))
	var z uint = uint(f)
	fmt.Println(x, y, z)
}
```

### 型推測

明示的な型を指定せずに変数を宣言する場合( ```:=``` や ```var =``` のいずれか)、変数の型は右側の変数から型推論される。
右側の変数が型を持っている場合、左側の新しい変数は同じ型になる。
右側に型を指定しない数値である場合、左側の新しい変数は右側の定数の精度に基いて int, float64, complex128 の型となる。

```inference.go
package main

import "fmt"

func main() {
	i := 42
	fmt.Printf("i is of type %T\n", i)
	f := 3.14
	fmt.Printf("f is of type %T\n", f)
	c := 0.867 + 0.5i
	fmt.Printf("c is of type %T\n", c)
}
```

## 定数

定数は、constキーワードを使って変数と同じように宣言する。
定数は、文字(character)、文字列(string)、boolean、数値(numeric)のみで使える。
定数は ```:=``` を使って宣言できない。

```const.go
package main

import "fmt"

const Pi = 3.14

func main() {
	const World = "世界"
	fmt.Println("Hello", World)
	fmt.Println("Happy", Pi, "Day")

	const Truth = true
	fmt.Println("Go rules?", Truth)
}
```
出勤管理の出来るLINE　BOTを作る

# 出勤管理の出来るLINE　BOTを作る
Google　Apps　Scriptを用いて出勤管理を行うためのLINE　Botを作っていく。
## LINE Botの作り方
### LINE Developersのページでプロバイダーとチャネルを作る 
1.  LINE Developersにログインし、新しくプロバイダーを作成する。(プロバイダー名は公開されるので、個人名などは避け、適切な名前にする。また、ユーザーIDはプロバイダーに紐づけられる。)
2. チャネルの設定はMessaging APIを選択。その後は基本設定を行う。

### GASでWebhook URLを発行し、チャネルに張り付ける
1.  https://docs.google.com/spreadsheets/d/1dDHbpPX-7tdNEQW-VaA4IvydrJBPksP806nNXsHumWY/edit#gid=0 を開き、このスプレッドシートをコピーする。その後、ツールをクリックし、スクリプトエディタを選択すると、GASを開くことが出来る。
2. Messaging　API設定のところでチャネルアクセストークンを発行しコピー。その後、先ほど開いたGASのアクセストークンのところにペーストする。
3. スプレッドシートのIDとURLをGASに入力する。URLはスプレッドシートのURLをそのまま入力。IDの方はスプレッドシートのURLのd/の次から/editの前までのコードを入力。
4. LINE　Official Account Managerを開き、応答設定を開く。そこの詳細設定で応答メッセージをオフ、Webhookをオンにする。
5.  GASの公開をクリックし、ウェブアプリケーションとして導入を選択。デプロイ出来たら、URLが発行されるので、これをWebhookのURLに張り付ける。

## リッチメニューで文字を打たずにボタン操作
1. LINE　Official Account Managerを開き、ホームからリッチメニューを開いて、リッチメニューを作成。
2. 表示設定、コンテンツ設定を行う。

##最後に
洗練さんでインターン(ラインのチャットボット（LINE Bot）を作って学ぼう！（ライブコーディング）)です。
[ラインのチャットボット（LINE Bot）を作って学ぼう！（ライブコーディング）](https://www.youtube.com/watch?v=i8a_Sl0xW4s&feature=youtu.be)

[今回作ったボットのURL](https://lin.ee/zEZgvbi)

[GitHubのレポジトリ](https://github.com/Pkagin/kinntaiGas)

最後に
現在ここでインターンしています。
まだまだ駆け出しですが頑張ります！やる気は人一倍です！
[洗練](https://senren.work/)
skin for this widget is missingとエラーが表示されskinが選択できない場合の対処法

#目次
1. はじめに
2. エラー回避方法
2. エラー解決方法
    3. エラーが発生しているWidgetを選択
    4. Skinsタブで対象のSkinを適用
3. まとめ


#はじめに
Konyで開発をしていて、WidgetのSkinタブを開くと、
以下のようにエラーが表示されている場面に遭遇したことはありませんか..:cold_sweat:？

<font color="red">「Skin for this widget is missing. Please use the Project Explorer's Skin tab to assign an existing skin to this widget.」<red>
![スクリーンショット 2021-01-12 22.07.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/a81f5244-f95a-c429-f7cb-c6023a900e8a.png)

これは、コミット時などに対象のWidgetにSkinが適用されなかったため発生するエラーとなります。
今回はこちらのエラーを回避するための方法と、エラーを解消する方法について説明します！

#エラー回避方法

上記のエラーは、Commit時に作成したSkinファイルが漏れてしまい、
適用するSkinファイルがないため発生するエラーとなります。

Skinを作成し、Widgetに適用した場合は、
必ず以下の2つのファイルを忘れずにセットでコミットするようにしましょう！  

**<font color="red">:warning:以下、必ずセットでコミット:warning:</font>**
- `forms/デバイス/form名.sm/widget名.json`：Skinを適用するWidgetのファイル
- `themes/defaultTheme/skin名.json`：作成したSkinのファイル

例：`btnRegister`というWidgetに`sknbtnSample`のSkinを適用する場合
![スクリーンショット 2021-01-18 15.31.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/e0f1785b-32d5-9a2d-421c-4ffbf23af5bb.png)

回避策は以上となります:point_up_tone1:
誤ってコミット漏れした場合や、既にエラーが発生してしまっている場合は、
以下の方法でエラーを解消してください。

#エラー解決方法

まずは、サンプルとなるアプリを作成し、
Skinが適用されていない事象を再現してみました。

対象WidgetのSkinタブを開いても、エラー文章のみが表示され、
Skinが選択できない状態となっていることがわかるかと思います。
![スクリーンショット 2021-01-18 15.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/b5c8337b-72d1-235c-ffc8-00ca9b63680a.png)



この状態だと、WidgetのSkinタブからはSkinの選択ができないため、
以下に紹介する方法でエラーを解消します。

##①エラーが発生しているWidgetを選択
まず、エラーが発生しているWidgetを選択します。
今回は、btnRegisterでエラーとなっているため、こちらを選択しています。
![スクリーンショット 2021-01-18 15.58.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/9b9df434-8ed9-fade-bd43-3830497a2db5.png)

##②Skinsタブで対象のSkinを適用
次に左メニューからSkinsタブに移動して、対象となるSkin名を探します。
今回は、`btnPinkR100`というSkinを適用したかったので、
`btnPinkR100`の上で右クリックして**Assign To** => **Skin**を選択してください。
※Focus Skinに適用したい場合は、Focus Skinを選択します。
![スクリーンショット 2021-01-18 16.01.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/2c21cff0-bea9-e085-4b57-4a2cc47d220e.png)

すると、以下のようにSkinが適用され、
WidgetのSkinメニューからもエラーが消えたかと思います！
![スクリーンショット 2021-01-18 16.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/babcb61c-0744-57d5-3770-dd66a55544be.png)

![スクリーンショット 2021-01-18 16.06.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/24fcbaf2-2b00-8ba7-e555-185757c16157.png)

解消方法は以上となります！
2ステップでエラー解消できますので、慌てず上記方法で試してみてくださいね。

#まとめ
今回は、対象のWidgetからSkinが消えてしまった場合の対処方法について記載しました！
私は、この方法を知るまでは、エラー文章もよく読まず
発生したWidgetは削除して、新しいWidgetを作り直して再度Skinを指定する・・
という手間のかかることをしていましたので、同じように困っている方がいたら、試してみてください！
YouTubeMusicにアートワークを追加する方法

#YouTubeMusicにアートワークを追加する方法

- GoogleプレイミュージックからYouTubeMusicに移行したところ、CDから取り込んだ曲にアートワークをつけることができなかったので、メモ。
- iTunesにいったん曲を入れ、そこでアートワークなどを追加したのち、YoutubeMusicにドラッグアンドドロップで無事アートワークをつけることができました。
- おわり