OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeのJupyter notebookを試してみた

# VSCodeのJupyter notebookを試してみた。
雑誌にてVSCodeのJupyter notebookの記事があったので試してみました。
とても簡単にJupyter notebook体験ができたので足跡メモしておきます。

## 前提
- Macで試した
- homebrewでpythonはpython3としてインストール済み
- python3を入れた際にpip3も入っている

### python3
```
$ which python3 
/usr/local/bin/python3
```
```
$ python3 --version
Python 3.7.5
```

### pip3
```
$ which pip3
/usr/local/bin/pip3
```
```
$ pip3 --version
pip 19.3.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
```

## Macに利用するモジュールをいれる
ipythonのモジュールでnotebookもいれる

```
$ pip3 install "ipython[notebook]"
```
↑
Macのときは、問題なくすんなり出来たのですが、Windows7+python3.8.0だとpywinptyというモジュールのところで失敗しました。
Windows7+python3.7.4だとうまくいきました。

### VSCode側

VSCode の Extension で Python をいれる

![スクリーンショット 2019-11-21 20.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/db46f394-9126-ebb7-7f0c-8cea68d8fe9b.png)

VSCodeの以下のコマンドを実行して、動作で利用するPythonモジュールを選択する。
```Python: Select Interpreter```

![スクリーンショット 2019-11-21 20.16.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/8b804dc9-855b-3ea9-b633-1c2903497de6.png)

どのPythonを使うのか聞かれるので、brewで入れたpython3を選ぶ
```/usr/local/bin/python3```
を選ぶ

VSCodeの以下のコマンドを実行して、起動。
```Python: Create New Blank Jupyter notebook```

![スクリーンショット 2019-11-21 20.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/7be8f0fe-bb24-66a3-152e-5ab77bc13ce2.png)

## 試してみる
今回利用してみるモジュールをpip3でインストール

```
$ pip3 install pandas
```

作ってみたサンプル

```
import pandas as pd
df = pd.DataFrame([[0, 5, 1],[2, 2, 2]], index=['a', 'b'], columns=['A', 'B', 'C'])
df
```

こんな感じで動いた
![スクリーンショット 2019-11-21 20.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/2c4b6c15-deaf-ca0c-88ae-c0cfd4d197c7.png)

## 試してみる（番外編）
pandasの出力が、何かに似ている…。
なんだっけ…。
うぅ、頭がっ…。
…。
これだ！！

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/40560e23-de8b-f8ae-18b6-dc04e76f19c1.png)

野球のスコアボード！（失礼しました）
EXCELのVBAだけでQRコードを作成する（サンプルのエクセルファイルあり）。


##参考（別投稿）１ファイルのHTML(+JavaScript)で、QRcodeを生成する
https://qiita.com/santarou6/items/db17788158dba38f3a5c

- - -
##参考（別投稿）エクセルの、ワークシート関数のみでQRコードを作成する（ただし最大７バイト）
https://qiita.com/santarou6/items/dda2f88f42c55cd2118f
- - -


##＜本編＞EXCELのVBAだけでQRコードを作成する（サンプルのエクセルファイルあり）。

[サンプルファイルのダウンロード](https://github.com/santarou6/QR_EXCEL/blob/master/QR%EF%BD%BA%EF%BD%B0%EF%BE%84%EF%BE%9E%E4%BD%9C%E6%88%90%EF%BD%B4%EF%BD%B8%EF%BD%BE%EF%BE%99.xlsb)

## ページを集約

[こちらをごらんください](https://qiita.com/santarou6/items/d623417ea8ba33756108)
Reactでinputを扱う(TypeScript版)

* [Reeactでinputを扱う](https://qiita.com/takaki@github/items/8125535791b1bab8c85a)の改訂版

フォームの要素の`<input>`をReactで扱うと基本的にはReactがコントロールしてしまい編集できなくなる。

次のようにvalue属性を使うと何も編集できない。

```tsx
  const ValueOnly: React.FC = () => (
    <div>
      <label>nothing</label>
      <input type="text" value="0123" />
    </div>
  );
```

defaultValue属性を使うと編集できるがReact使ってinputの中身で何かやりたいのならほぼ無意味。

```tsx
  const DefaultValue: React.FC = () => (
    <div>
      <label>defaultValue</label>
      <input type="text" defaultValue="abcd" />
    </div>
  );
```

次が無難な例。
value属性をuseStateから作った値を使って表すことにすると中身も編集できて中身の値も利用できる。
onChangeにvalue属性の値を取得するハンドラを与えている。

```tsx
  const ValueWithOnChange: React.FC = () => {
    const [str, setStr] = useState("0123");
    return (
      <div>
        <label>value and handler: {str}</label>
        <input
          type="text"
          value={str}
          onChange={event => setStr(event.target.value)}
        />
      </div>
    );
  };
```

defaultValue属性を使った上でuseStateを併用してもいいがトリッキーなだけであまり意味は無さそう。
一応フォームの初期値は`abcd`になっている。

```tsx
  const DefaultValueWithOnChange: React.FC = () => {
    const [str, setStr] = useState("0123");
    return (
      <div>
        <label>defaultValue and handler: {str}</label>
        <input
          type="text"
          defaultValue="abcd"
          onChange={event => setStr(event.target.value)}
        />
      </div>
    );
  };
```

これは素直にvalue使えばという感じになる。

```tsx
  const DefaultValueWithOnChange2: React.FC = () => {
    const [str, setStr] = useState("0123");
    return (
      <div>
        <label>defaultValue and handler 2: {str}</label>
        <input
          type="text"
          defaultValue={str}
          onChange={event => setStr(event.target.defaultValue)}
        />
      </div>
    );
  };
```
ディープラーニングG検定　合格体験記

先日（11月9日）デープラーニングG検定（JDLA Deep Learning for GENERAL 2019 #3）を受けたのですが、無事合格することができました。

参考になるか分かりませんが、自分の勉強法と受験当日の体験記を書こうと思います。

##１　申し込み
試験の申し込みは試験日のおよそ1ヶ月前から始まります。自分は10/4に申し込みを行いました。

自分は通信制の大学に所属していたため、学生区分で申し込みました。一般だと受験料が12,000円＋税なのですが、学生だと半額以下の5,000円＋税で申し込むことができるのでお得です。

ちなみに、学生区分で申し込んだ場合、メールで学生証などの写しを送付する必要があります。自分は申し込み直後にメールで送付したのですが、試験日の1週間前ぐらいにメールで送付するよう案内がきたので、再度送付しました。

通信制大学だと学生区分での申し込みはできないかもと思ったりもしたのですが、無事できたのでよかったです。

##２　学習方法
学習には以下のテキストと問題集を利用しました。

- 深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト
- 徹底攻略 ディープラーニングG検定 ジェネラリスト問題集 

まず、テキストは1ヶ月前ぐらいから読み始めました。

自分は文系でほとんどディープラーニングに関する知識はほとんどなかったのですが、とりあえず本文はざっと流し読みして、各章の後にある問題を解くことに注力しました。できなかった問題は何回も繰り返し、覚えるまで（多いもので6回転ぐらい？）解きました。

次に、問題集はテキストを2〜3回転くらい回した後、 試験日の2〜3週間前に購入しました。こちらも間違えた問題は何回も繰り返し、覚えるまで解きました。

問題集を解き始めてからはあまりテキストには戻らず、問題集の解説にある用語のまとめなどを見ながらキーワードを覚えていきました。こちらも多いもので6回転くらい回したと思います。ちなみに、試験本番は問題集で見たことのある問題がいくつか出題されていたので、結構効果があったと思います。

##３　試験当日
試験は会場受験ではなく、各自のパソコンで受けます。自分は個室で集中して受験したかったので、近くのネットカフェで受験しました。

試験は13時開始だったので12時半頃に公式サイトからアクセスしようとしたところ、サーバーが落ちていて繋がりませんでした。が、受験の数日前に送付されたマイページのURL経由だと無事にアクセスすることができました。（この情報はtwitterでも流れていました。）

試験開始後も試験中も書籍の参照やインターネット検索は可能ですが、出題数が多いため、ある程度は暗記をしておかないと時間切れになってしまうと思います。

最初は自信のない問題の番号をメモして、後から戻って解き直そうかと思ったのですが、結局戻る時間は無いまま、最後の1問までたどり着かずに試験が終了してしまいました。

ですので、わからない問題があったらできるだけその場で調べて、分からない場合も何か合ってると思う回答を選択しながら進めていくことをお勧めします。

##４　最後に
直近の傾向を見ると合格率は70%程度のようなので、ある程度事前に勉強しておけば合格できる可能性は高い試験だと思いました。

また、最近別件で統計関係の学習をしているのですが、G検定対策で学習した線形回帰やクラスター分析などは統計でも用いる概念であり、汎用性のある知識を学ぶことができたと思っています。
【Vue.js】コンポーネントの書き方

# コンポーネント
## 基本

componentの引数は、
第一引数にテンプレート名、
第二引数にtemplate(HTML)
を指定する

```javascript:
// その場でHTMLを生成する場合
Vue.component("template名", {template: "挿入されるHTML構造"})
components: "template名", {template: "挿入されるHTML構造"}

// vueファイル(template)を読み込んで使う場合
// 読み込んだファイルがtemplateに相当するので、templateオプションは必要ない
Vue.component("別に指定したいtemplate名", "読み込んだもの")
compoonents: "別に指定したいtemplate名", "読み込んだもの"
```

## グローバルコンポーネントとして設定する

### その場でHTMLを生成する場合

```javascript:
Vue.component("Home", {template: "<h1>home</h1>"})
```

### vueファイル(template)を読み込んで使う場合

```javascript:

import Home from "./Home.vue"
// import名をtemplate名として使う場合
Vue.component(Home)
// template名を上書きして使う場合
Vue.component("home-template", Home)
```

## ローカルコンポーネントとして設定する
### その場でHTMLを生成する場合

```javascript:
new Vue({
    el : "#app",
    components : { Home : {template : "<h1>home</h1>"}
  }
})
```

### vueファイル(template)を読み込んで使う場合

```javascript:

import Home from "./Home.vue"
new Vue({
    el : "#app",
    // import名をtemplate名として使う場合
    components ; {Home}
    // template名を上書きして使う場合
    components ; {"home-template", Home}
  },
})
```
_.isEmptyの返却値まとめ

### _.isEmptyの返却値まとめ

### 検証
- lodashの `isEmpty` 関数に何を入れると何が返却されるかをまとめました。
- 足りてないと思った方は追記してください。

### 検証version
- lodash.js/4.17.15 [https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js]

### 検証結果
 
```js
  _.isEmpty(n)
```

| 引数(n) | 戻り値 |
|---|---|
| なし | true |
| undefined | true |
| null | true |
| '' | true |
| "" | true |
| `` | true |
| 0 | true |
| 1 | true |
| false | true |
| true | true |
| [] | true |
| [1] | false |
| [,] | false |
| {} | true |
| {a:{}} | false |
| () => {} | true |
| new String() | true |
| new Date() | true |
| new Boolean() | true |
React Native開発を1年ぐらいやって得たことの感想

※個人の感想なので、内容薄め
※もっとちゃんと書いたTips記事を上げます

# React Nativeとは？

- Facebookが出している、iOS/Androidで共通のJavascriptによるコードベースを用いてネイティブアプリを作成するためのフレームワーク

## React Nativeのつらいところ

- ビルドが遅い
    - 通常のネイティブアプリ開発に比べて、余分なライブラリなどをビルドする必要があり、どうしてもビルド時間が延びる
    - try&errorが思った以上にリズム良くできないことがある
        - React Native0.61で、[Fast Refresh](https://facebook.github.io/react-native/blog/2019/09/18/version-0.61)が導入されたので、多少改善
- バージョンが上がる速度が速い
    - まだv1に達していない上、バージョンが上がっていく速度が速い（だいたい半年に1度新しいバージョンがリリースされる）
    - ちゃんと付いていく、という覚悟が必要
    - 実際にアップグレードをやってみると、ちゃんとビルド周りの知識がある人があればそこまでハマらない認識
    - もちろん地道な作業は必要
    - [React Native upgrade helper](https://react-native-community.github.io/upgrade-helper/)というのがあるので、それをベースに書き換えていくのが一番の近道（それでも面倒くさいが）
- 最新のiOS/Androidがリリースされても、すぐに追従できない
    - ただこれは普通のネイティブアプリでも発生しうる

## React Nativeの嬉しいところ

- Javascript(Typescript)による開発
    - ネイティブアプリ開発で利用する言語が悪いという話ではなく、**Javascriptのエコシステムの知識がそのまま使える**、というのが一番大きい
    - Jest/Enzymeによる単体テスト、Redux/MobXなどのライブラリ、Prettierなどのコードフォーマッター、eslintを使ったコード規約の強制
    - チームに初学者がいる場合も、Javascript(Typescript)とReactが出来れば画面を作れる
- Reactが使える
    - 好みの問題ですが、やっぱりReactは良いと思います

## React Nativeをやるのに必要なネイティブの知識

- Java/Objective-Cが読める知識が必要
    - ガッツリ書ける必要はほぼないと思う
- iOS/Androidのビルド周りの知識は、そこそこ深いところまで知っておいたほうが良い
    - React Nativeではまるところがあるとすれば、とにかくビルド周り
    - パブリックなライブラリであればGithubでほぼほぼ誰かが問題を解決していることは多いが、それでもなぜその問題が解決してるのか理解できないと、新たな問題を生み出す可能性がある
RSpecで可変長引数のテストがしたいとき

動作確認環境： Ruby: 2.6系, Rspec: 3.8系, OSは問わないはずw

# こんなとき
たとえば、グループで必須チェック（グループ内のいずれにも値が設定されない場合にエラーとする）を行うメソッドを作ったとき

```rb

require 'active_support'
require 'active_support/core_ext'
 
 
class Validator
  def required_group(data, *columns)
    joined_columns = columns.join('と')
    flg_present = false
    columns.each do |column|
      flg_present |= data[column].present?
    end
    return "#{joined_columns}のうちいずれか1つは入力必須です" unless flg_present
  end
end
```

RSpecではこう書くとよろしい

```rb

describe Validator do
  let(:target) { described_class.new }
  describe '#required_group' do
    subject { target.required_group(data, *columns) } # *がミソ
    let(:columns) { ['aaa', 'bbb'] }
    describe 'dataに' do
      context 'columnsで指定された列が存在しない場合' do
        let(:data) { 'hoge' => 'fuga' }
        it 'エラー文字列を返す' do
          is_expected.to eq 'aaaとbbbのうちいずれか1つは入力必須です'
        end
      end
      context 'columnsで指定された列が存在する場合' do
        context '指定された列の値が空でない場合' do
          let(:data) { 'hoge' => 'fuga', 'bbb' => 'got it!' }
          it 'nilを返すこと' do
            is_expected.to be_nil
          end
        end
      end
    end
  end
end
```

*を忘れるとcolumnsに配列（`[['aaa', 'bbb']]`）が渡された扱いとなるので、想定外の動きをします。
合掌
【Rails】パーシャルを利用する

Railsではviewファイルで使う部品（パーシャル）を作り、他のviewファイルから呼び出して利用することができます。
##パーシャルの基本ルール
・ファイル名はアンダースコアから始まる
・`render '{ファイル名}'`で呼びだす
・パーシャルが同じディレクトリにある時は`render '{ファイル名}'`、違うディレクトリの時は`render '{ディレクトリ名/ファイル名}'`で呼びだす。（拡張子不要）

##使ってみる
簡単なTODOアプリのエラーメッセージをパーシャル化して利用します。
・[Ruby on Railsで簡単なアプリを作成](https://qiita.com/d0ne1s/items/5e63dde992f20f25b8bb)
・[TODOアプリにバリデーションを追加する](https://qiita.com/d0ne1s/items/822f66d16d65ae28162b)
###パーシャルを作成
```erb:/app/views/shared/_error_messages.html.erb
<% if @task.errors.any? %>
  <div>
    <ul style="color: red">
      <% @task.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
```
###パーシャルを呼び出す
```erb:/app/views/new.html.erb
<h1>新規タスク</h1>
<%= render 'shared/error_messages' %>
<%= form_for(@task) do |f| %>
  <div><%= f.label :title %></div>
  <div><%= f.text_field :title %></div>
  <div><%= f.submit %></div>
<% end %>
<%= link_to '戻る', tasks_path %>
```
```erb:/app/views/edit.html.erb
<h1>タスク編集</h1>
<%= render 'shared/error_messages' %>
<%= form_for(@task) do |f| %>
  <div><%= f.label :title %></div>
  <div><%= f.text_field :title %></div>
  <div><%= f.submit %></div>
<% end %>
<%= link_to '戻る', tasks_path %>
```
VBAと共に去りぬ：第2話 突破すべき3つのバリア

#3大バリア
VBAで業務を自動化する時によくぶち当たる壁
・大企業バリア
・仲間バリア
・自己中UX UIバリア

Kさんへ　VBAのススメ　SES業界で働いてる人は特におすすめ
https://www.youtube.com/watch?v=_3Yh85wlvQs
EC2上で動くアプリケーションのログを、CloudWatchに送信してみる

AmazonLinux2上で動かしているアプリケーションのログをCloudWatchから見れるようにするための手順を自分用にメモ。

ざっくり言うと、EC2にCloudWatch用の権限を持っているIAMロールをアタッチした上で、エージェントをインストールすればOK。

# IAMロールの作成
## IAMロールの作成画面
ロールの作成ボタンを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369844/c73b9d74-06c2-bc21-abf1-abceccdb4a3c.png)

## このロールを使用するサービス
EC2を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369844/8b9d1e17-f73d-cd18-2cf3-5329d05d7b45.png)

## アタッチするポリシー
「CloudWatchLogsFullAccess」を選択。
ポリシー名はリンクになっていてクリックするとポリシー画面に遷移するので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369844/5f53976c-6700-2c72-e7df-04d9b67e8185.png)

## ロールの名前とか説明とか
あとはロール名とかロールの説明を適当に設定して、ロールの作成は完了。

# ロールの割り当て
対象のEC2インスタンスにロールを割り当て。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369844/42253244-aa91-7e90-1444-fc8f01204b26.png)

ロールの設定は以上。

# エージェントのインストール
エージェントのインストール。
「awslog」ではなく「awslogs」なので注意。

```
$ sudo yum install awslogs
```

confのリージョンをバージニア北部リージョン（us-east-1）から東京リージョン（ap-northeast-1）に変更。

```
$ sudo vim /etc/awslogs/awscli.conf
[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-1
```

サービス起動。

```
$ sudo service awslogsd start
```

エージェントはデフォルトで「/var/log/messages」というログを送信するように設定されている。
そのため、サービスを起動するとそのログがAWSのコンソールから確認できるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369844/f79998d8-0b61-61b2-f164-94d10015f8a4.png)
※上三つのロググループは別のテストをしていた時の物なので関係なし。

# 取得するログの追加
取得対象を設定しているコンフィグファイルを修正する。
今回は[myapp]を追加した。

data_formatの設定方法は以下のサイト参照。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html

```
$ sudo vim /etc/awslogs/awslogs.conf
～略～
[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages
[myapp]
datetime_format = %Y-%m-%d %H:%M:%S
file = ファイルのパス
buffer_duration = 5000
log_stream_name = {hostname}
initial_position = start_of_file
log_group_name = /var/log/myapps
```


追加したログが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369844/6c4a9b6f-0cdc-33d4-5585-b547e784131b.png)

おわり。
もっと細かい情報はamazonの公式サイト参照（丸投げ）
AWS SAA合格記(2019/11/21投稿)

# はじめに
1つ前に今年の7月にAWS認定クラウドプラティクショナーを受験した記事を書きましたが、
その後にソリューションアーキテクトアソシエイト(以下SAA)も受験してきたので、こちらも今更ながら勉強した内容とか書いていきます。

<b> クラウドプラティクショナーはこちら</b>
[AWS 認定クラウドプラクティショナーを受験(合格)してきた話](https://qiita.com/handy-dd18/items/c2b62ad58206e47f1345)

# 目次
* <b>前提</b>
* <b>SAAを受験した理由とその結果</b>
* <b>実際に勉強した内容</b>
* <b>受験した感想</b>

# 前提
SAAを受験時の状況は以下の通り

・SAA受験の数週間前にクラウドプラティクショナーを受験、取得
・AWSは趣味と転職後にEC2やRDSを少し触っていた程度
・一般的なIT、クラウドの知識は持っている
・運用設計の思想は何となく理解している

基礎知識はありましたが、がっつりとAWSについての知識はなく、転職してからまともに触り始めたタイプです。
とはいえ、前職でパブリック・プライベート問わずクラウド関連の仕事をしていたこともあり、サービスの概要さえわかればなんとなくどう設計したらよいかぐらいはわかるレベルでした。

# SAAを受験した理由
SAAって何か知らない人はこの記事を見てはいないと思いますが、知らない方は公式のページをみてください。(適当)

[AWS 認定ソリューションアーキテクト – アソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)

前記事で説明したクラウドプラティクショナーの一つ上位の資格で、内容としては主にWell-Architectedの5本の柱に関連する基本となるサービスについての知識を問われることが多いです。
ただ、その時のトレンドのサービスなども出てくるので、基本的なサービスのみやっておけばよいというわけではなさそう。

資格の中の位置づけでいうと一番の基礎にあたる資格で、取れてやっと入門編クリアというレベル。
元々転職して3か月以内には取得するという目標を掲げていたので、なるべく早く取得したいと思い急いで受験しました。

※途中クラウドプラクティショナーを会社都合で急ぎ取らないといけなかったので、想定よりは遅くなってしまいましたが。。


# 勉強内容
実際に勉強した内容は以下の3つです。

* 公式のAWSサービス別資料を読む(EC2,TDS,EBS,S3等々)
* 模擬試験を解く
* 対策本の問題を解く

まず1つ目のサービス別資料は、AWS公式で出している各AWSサービスの資料集です。

[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

AWSサービスについて詳細に記載されているので、サービスを正確に学ぶには一番良いと思います。
私自身、実際にこの資料を読み込んでおいたことで解けた問題もいくつかあったので、何から勉強したらよいかわからないという方はまず読んだほうが良いと思います。

ただ、１つ１つの物量が多いので要点だけ勉強したい！という方は以下の対策本での勉強をお勧めします。

[AWS認定アソシエイト3資格対策 ソリューションアーキテクト、デベロッパー、SysOpsアドミニストレーター](https://item.rakuten.co.jp/hmvjapan/9877595/?scid=af_pc_etc&sc2id=af_113_0_10001868)


この本の最初のほうに、各試験でよく出題されるサービスが記載されているので、
<b>
本で勉強
↓
受験する資格に関連するサービス資料を熟読
↓
余裕があればそれ以外のサービスも読む
</b>
という流れで勉強したら必要な基礎知識は学べると思います。

受験に必要な知識を学んだあとは、試験問題の形式を学ぶために模擬試験の受験や対策本の末尾にある問題を解いて、本試験の対策をしていきます。
しかし、模擬試験や対策本の問題は本試験の問題よりも簡単なものが多いので、もしお金に余裕のある方は本試験を一度受験してみてもよいと思います。

落ちる前提で受験料1万6千円は払えない！！という人にお勧めしたいのが、先にクラウドプラティクショナーを受験して合格しておくやり方です。

というのも、AWSの試験に合格すると次に別のAWSを受験するときの受験料が半額になる、バウチャーチケットをもらうことができます。
それを使えばSAAの資格なら約8000円程度で受験できるので、お金に余裕がない方などは試してみるもの良いと思います。

あと単純に問題を沢山解いておきたいという方は以下のWeb問題集もオススメです。
会員登録が必要ではありますが、そこまで高くなく問題数も多いので、問題を解く練習にはなります。
ただ、あくまで問題を解く練習なので、サービスの理解度を確かめる程度に抑えたほうが良さそうです。

[AWS Web問題集で学習しよう](https://aws.koiwaclub.com/exam/)

# 受験した感想

タイトルにも書いているので結果はわかると思いますが、無事に合格しました！
ただ、合格はしたんですが、実はその前に一度受験して落ちてます笑

その落ちた時の原因は、単純に勉強不足だったのとAWSの試験傾向がつかみ切れていなかったことです。
クラウドプラクティショナーの時の勉強で分かったつもりになっていましたが、EC2やRDS等の基本的なサービス以外のサービスが選択肢に出てくると正解が即答できませんでした。
実際の試験内容も模擬試験より具体的な問題が出てきていて、長文問題(といってもそこまで長くはないですが)では解くのに結構時間を食われました。

自分と同じようにAWSをあまり触っていなくて勉強メインで受験しようと思っている方は、AWSを実際に操作してサービスの理解度を深めておくとより合格する可能性は高くなるのではないかと。(当たり前)



Qiitaの書き方に全然慣れない...
Supervisorの基本コマンド

## Supervisorとは

常時起動させたいスクリプトなど、デーモンプロセスとして動かしたいときに使うプロセス管理/デーモン化※1 のツール。
公式ドキュメント： http://supervisord.org/

※1 そもそもデーモンとは
デーモン (英語: Daemon) は、UNIX, Linux, MacOSXなどUnix系のマルチタスクオペレーティングシステム (OS) において動作するプロセス（プログラム）で、主にバックグラウンドで動作するプロセス。ユーザが直接対話的に制御するプログラムもデーモンとして作ることができる。典型的なデーモンは名前の最後尾に "d" が付く。
https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)


## コマンドについて

- Supervisorの操作は supervisorctl コマンドで行う
  - supervisord コマンドは Supervisor そのものを立ち上げるコマンドなので操作コマンドではない
- supervisorctlによって supervisor そのものや、supervisor が立ち上げている各種プロセスを操作することができる
- ```$ supervisorctl help``` によってコマンド一覧を確認することができる

```
$ supervisorctl help

default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail
avail  fg        pid   remove  shutdown  status  update
clear  maintail  quit  reread  signal    stop    version
```

検証用環境のバージョンを確認してみる

```
$ supervisorctl version
4.0.4
```

## 主要な supervisorctl コマンド

### supervisorctl add

- プロセス/グループの構成内の更新をアクティブにする
- Supervisorのデーモンの管理対象を追加

### supervisorctl update

- 設定ファイルを読み込み直し、必要に応じてaddによる設定の適用や、removeによるプロセスを削除する

指定方法は以下の通り

```
update			Reload config and add/remove as necessary, and will restart affected programs
update all		Reload config and add/remove as necessary, and will restart affected programs
update <gname> [...]	Update specific groups
```

### supervisorctl start

- 指定したプロセスを開始する
- この時点で reread で読み込まれている設定変更のみ適用される

指定方法は以下の通り

```
start <name>		Start a process
start <gname>:*		Start all processes in a group
start <name> <name>	Start multiple processes or groups
start all		Start all processes
```

例：```$ supervisorctl start all```

### supervisorctl stop

- 各プロセスを停止する
- 停止したプロセスの再起動は前述したstartを使用する

指定方法は以下の通り

```
stop <name>             Stop a process
stop <gname>:*          Stop all processes in a group
stop <name> <name>      Stop multiple processes or groups
stop all                Stop all processes
```
例：```$ supervisorctl stop all```

### supervisorctl reread

- add/remove なしに Supervisor の設定ファイル(デーモンの構成ファイル)を再読み込みする
 - 再読み込みのみで、この段階では変更した設定は各プロセスやグループに適用されない
 - 適用する場合は restart や add を実行する必要がある

### supervisorctl restart

- プロセスやプロセスグループなどを指定して再起動する
- この時点で reread や update などで読み込まれている設定変更のみ適用される

指定方法は以下の通り

```
restart <name>		Restart a process
restart <gname>:*	Restart all processes in a group
restart <name> <name>	Restart multiple processes or groups
restart all		Restart all processes
```

### supervisorctl reload

- Supervisorのデーモンを一度停止して立ち上げ直す
- 立ち上げ時に設定ファイルが読み込まれるため、変更があればそれが適用されたプロセスが起動される

### supervisorctl pid

- Supervisorが管理しているプロセスのPIDを表示する

指定方法は以下の通り

```
pid                     Get the PID of supervisord.
pid <name>              Get the PID of a single child process by name.
pid all                 Get the PID of every child process, one per line.
```

### supervisorctl tail

- プロセスの標準出力/標準エラー出力する

```
$ supervisorctl tail -f [プロセス名]
```

参考
https://papix.hatenablog.com/entry/2015/08/05/131113
https://qiita.com/yushin/items/15f4f90c5663710dbd56
Dockerコンテナが使用するIPアドレスの範囲を変更する

# TL;DR

* `docker0`ネットワークインターフェースが使用する、IPアドレスの範囲を変更したい
    * 既存ネットワーク範囲と衝突する場合など
* `dockerd`の起動オプションで、`bip`を使って変更する

# 環境

```shell
$ uname -a
Linux xxxxx 4.15.0-70-generic #79-Ubuntu SMP Tue Nov 12 10:36:11 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ docker -v
Docker version 19.03.5, build 633a0ea838
```


# 初期状態

`172.17.0.1/16`が`docker0`に割り当てられているので、これを変更します。

```shell
$ ip a show dev docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:68:60:98:78 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:68ff:fe60:9878/64 scope link 
       valid_lft forever preferred_lft forever
```

# `daemon.json`を作成して、設定変更する

以下のドキュメントを参考に。

[Use bridge networks / Configure the default bridge network](https://docs.docker.com/network/bridge/#configure-the-default-bridge-network)

[dockerd / daemon](https://docs.docker.com/engine/reference/commandline/dockerd/#daemon)

`/etc/docker/daemon.json`というファイルを作成し、`dockerd`を設定を行います。

```javascript
{
    "bip": "172.22.0.1/16"
}
```

ブリッジネットワークの場合、`bip`オプションで指定すればよいので、今回は`172.22.0.1/16`を指定。

`dockerd`を再起動。

```shell
$ sudo systemctl stop docker.service
$ sudo systemctl start docker.service
```

`docker0`ネットワークインターフェースを確認。

```shell
$ ip a show dev docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:68:60:98:78 brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.1/16 brd 172.22.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:68ff:fe60:9878/64 scope link 
       valid_lft forever preferred_lft forever
```

変更が反映されました、と。
PICTをMacにインストールする

# pictとは
こいつの事である

microsoft/pict
https://github.com/microsoft/pict

All-Pairs法(ペアワイズ法)というモノで、テストケースを自動で作成してくれるツール

## インストール方法

`git clone`と`brew`の2パターンがあるようだ

自分はgit cloneしか試してない
（後でbrewにあることを知った...）

### git clone

cloneしてmakeするようだ

```
$ git clone https://github.com/Microsoft/pict.git
$ cd pict/
$ make
$ sudo install -m 0755 pict /usr/local/bin/pict
```

動作確認は`pict`のUsageが表示されればインストールOK

```
$ pict
Pairwise Independent Combinatorial Testing

Usage: pict model [options]

Options:
 /o:N    - Order of combinations (default: 2)
 /d:C    - Separator for values  (default: ,)
 /a:C    - Separator for aliases (default: |)
 /n:C    - Negative value prefix (default: ~)
 /e:file - File with seeding rows
 /r[:N]  - Randomize generation, N - seed
 /c      - Case-sensitive model evaluation
 /s      - Show model statistics
```

### Homebrew

まずは探してみる

```
$ brew search pict
==> Formulae
pict
```

あった。

たぶん以下でインストールできる（試してないけど）

```
brew install pict
```
【AirDish】vol.1 tabbarcontrollerの使い方

今回のアプリでは、tabbarを使うので、その実装について記述する。

https://qiita.com/fromage-blanc/items/552e47353ae21259e046
参考にさせてもらったのはこの記事。

プロジェクトを作る最初の段階で落とし穴があるので注意が必要である。
無事にtabが2つあるviewを作成することができた。

今回の画面は4つのタブに分けるので、タブを増やす。
最終は以下の通りになった。

またアイコンの設置などのカスタマイズが必要になると思うが、ひとまずこれで次に進むことにする。
<img width="455" alt="スクリーンショット 2019-11-21 19.06.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231000/61453b5b-a81f-85c2-fd8f-5681a524f948.png">
Railsで外部キー追加時に「型の不整合」で失敗する場合の対応

# 環境

- Rails 5.2.2.1

# エラー内容

`add_foreign_key`などで外部キー制約をつけようとすると、`rails db:migrate`が失敗して以下のエラーが出る。

```ruby
Mysql2::Error: Referencing column 'user_id' and referenced column 'id' in foreign key constraint 'fk_rails_85591c599e' are incompatible.
```

# 原因

「外部キー（`user_id`）」と「参照先テーブルのカラム（`users`テーブルの`id`）」の型が異なっている。
よくある例としては、`Rails5.1`から`id`カラムが`bigint`になったが、過去に作成したテーブルの`id`カラムが`int`のままの場合。

# 対応方法

`id`カラムを`bigint`にする。

```ruby:db/migrate/20190000000000_xxx.rb
class SomeMigrationFile < ActiveRecord::Migration[5.2]
  def change
    reversible do |dir|
      dir.up do
        change_column :users, :id, :bigint, auto_increment: true
      end

      dir.down do
        change_column :users, :id, :int, auto_increment: true
      end
    end
  end
end
```
M5StickVで使用可能なモデルを生成する「V-Training」を試してみた

## M5StickVとは
M5Stack社が提供しているAIカメラです。（製品情報の詳細は[こちら](https://www.switch-science.com/catalog/5700/)から）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510723/9032310b-c6db-3e14-1dd0-31b05db125ff.jpeg" width="80%">
コンパクトなサイズながら、単体で画像処理や顔認識・物体検出といった画像認識をすることができます。またプログラムの読み込みに関しても、microSDカードから読み込ませることができます。

M5StickVを用いた画像認識を実現する上で、学習済みモデル(kmodel形式)が必要となります。
しかし、このモデルを作成するためには、Kerasによる学習後、h5形式(Keras)→tflite形式(TensorFlowLite)→kmodel形式に変換する必要があり、環境構築や学習にかかるコストを考えるとなかなか大変そうだと思いました。

そこで、今回はV-Trainingを利用してモデルの生成と識別を試したので紹介したいと思います。
## V-Trainingとは
M5Stack社が提供しているサービスで、学習データをアップロードすることでモデルを生成することができます。
http://v-training.m5stack.com/

V-Trainingの流れは以下の画像の通りです。([引用元](https://docs.m5stack.com/#/en/related_documents/v-training))
![v_training.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510723/aa4045a1-7c97-9617-603a-520f3ba2c47d.png)

ポイントとして以下の3点があります。
1. M5StickVのカメラを用いて対象となる物体を[こちらのプログラム](https://docs.m5stack.com/#/en/related_documents/v-training?id=boot-code)で撮影し、microSDカードに保存（1classあたり最低35枚必要）
2. microSDカードに保存された画像をV-Trainingにアップロード
3. アップロード後、指定したメールアドレスに対して、生成したモデルおよびboot.py(物体を識別するプログラム)と起動時の画像をダウンロードできるURLが送られてくるため、それらをダウンロードし、microSDカードに入れて起動するとそのモデルを用いた識別が可能となります。

これだけでモデルの生成および識別が可能になります。

## 物体検出を試してみた
生成したモデルを使用して、物体検出を試してみました。
以下、試した例です。識別結果に応じてサーボモータを動かしています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">M5StickVを用いたベイマックスの識別。識別結果に応じてサーボモータを動かしています。 <a href="https://t.co/3GJb4pi3vF">pic.twitter.com/3GJb4pi3vF</a></p>&mdash; クラクス (@kuracux) <a href="https://twitter.com/kuracux/status/1188405722842746881?ref_src=twsrc%5Etfw">October 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>  

## 気づいたこと
### 対象物体の背景が変わっても影響があまりなかった💡  
M5StickVにて撮影したものを学習データとしてそのまま利用しているため、対象物体の背景の影響を受けそうだなと思っていましたが、その点は影響があまりなく、物体の周囲が変わっても識別出来ました。

### 類似する物体の識別は難しい😢
上記のツイートにある例の場合、白い円形の物体と赤い円形の物体であっても認識してしまいました。
また、人の顔やトランプの柄(特にJ, Q, K)の判別も難しく、誤認識が起こりやすかったです。
これらのことから、識別時には似たようなものが映らない状況でかつ分類対象は大きく異なるものが良さそうです。

### 対象の物体以外が写ると最後に学習した物体だと判断される場合がある😪
例えば、3つの物体（a, b, c）を学習させてモデルを生成したとします。
このモデルとboot.pyを利用すると、a, b, cのどれも写っていないにも関わらず、cと分類されることがあります。
対処方法としては、背景画像のみを写したクラスを1つ用意することで、そのクラスだと分類されるようになります。

## おわりに
V-Trainingを使用すれば比較的短時間でモデルが生成できるため、あまりコストも掛からず好きなものを分類できるようになります。手軽に試せるため、色々なデータで試してみると良いかと思います。
【SQLServer】NULLを含む四則演算

# 足し算

```sql

SELECT
	A + B AS OnePlusNull
FROM 
(
	SELECT 1 AS A, NULL AS B 
) AS sample
```

## 結果

| OnePlusNull |
|:------------|
| NULL |

# 引き算

```sql
SELECT
	A - B AS OneMinusNull
FROM 
(
	SELECT 1 AS A, NULL AS B 
) AS sample
```
## 結果
| OneMinusNull |
|:------------|
| NULL |

# 掛け算

```sql
SELECT
	A * B AS OneTimesNull
FROM 
(
	SELECT 1 AS A, NULL AS B
) AS sample
```
## 結果
| OneTimesNull |
|:------------|
| NULL |
# 割り算

```sql

SELECT
	A / B AS OneDividedByNull
FROM 
(
	SELECT 1 AS A, NULL AS B 
) AS sample
```
## 結果
|OneDividedByNull  |
|:------------|
| NULL |
# SUM

```sql

SELECT
	 SUM(A) AS SumOfA
	,SUM(B) AS SumOfB
	--,SUM(C) AS SumOfC --> ERROR
FROM 
(
	SELECT 1    AS A, 1    AS B, NULL AS C 
UNION ALL
	SELECT 1    AS A, 0    AS B, NULL AS C
UNION ALL
	SELECT NULL AS A, NULL AS B, NULL AS C 

) AS sample
```
## 結果
| SumOfA | SumOfB |
|:------|:-------|
| 2 | 1|

・SumOfCの結果はエラーになる

```

オペランドのデータ型 NULL は sum 演算子では無効です。
```
【備忘録】パスを通す(windows10)

#手順#
1.**システムのプロパティ**を開く
2.**詳細設定タブ**を開く
3.**環境変数**を開く
4.**編集**をクリック
5.**パスを追加**

さあ、頑張って参りましょう。

#1.システムのプロパティを開く#
「システムのプロパティ」を検索

![sisutemunopuropathi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/a6240de5-7be7-a516-8526-9882a911cdf6.png)

「システムの詳細設定の表示」をクリック
すると無事たどり着けます。

![path1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/7fd367b1-4d69-4f7f-fa99-a6ce5c02b24f.png)

コントロールから行く場合は
「システムとセキュリティ」→「システム」→「システムの詳細設定」で行けます

![path2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/54c8c035-a888-2127-51f9-532d1bd9562f.png)

![path3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/fce20b30-d422-36f1-cc85-d44fd7323ced.png)

![path4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/52b21f28-248f-bb01-8859-71724b66ceb9.png)




#2.詳細設定タブを開く#
さっき出てきたあの画面です

![path1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/45ec45ae-5e96-966f-9c28-ff1f7901b396.png)

#3.環境変数を開く#

`環境変数(N)...`って書いてあるところをクリックです。
するとこちらが出てきます。

![path5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/9379aa97-aedd-b2ee-68a9-91192b8ca32b.png)


#4.編集をクリック#
今回はユーザ環境変数を編集します
「変数」のところにある「Path」のところをクリックして「編集」を押してください
するとこれでます

![path6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/e8e32c92-94f3-353d-0c54-97f8a4103e2a.png)

#5.パスを追加#
「新規」を押して通したい絶対パスを入力してください。
通したらとりあえず再起動してください。
これで終わりになります。お疲れさまでした。

#おまけ#
さっき「C:￥Command」のパスを通したのでそこに以下のようなバッチファイルを入れてみました。
ただ「abc」って出すだけのシンプルな感じです。

```test.bat
@echo off
echo abc
pause
```
適当なディレクトリで「test」って入力してみます。

```
C:\Users>test
abc
続行するには何かキーを押してください . . .

C:\Users>
```

パスが通ったおかげでコマンドが実行されました。
とっても気持ちいですね。
これで自分が欲しいコマンド作りたい放題ですね。
とりあえず**pwd**がないのは不便なので作りました。[(コピペ)](https://qiita.com/h141gm/items/a3a7044544599f4db7f9)

```pwd.bat
@cd
```

ああ気持ちい。

#参考#
https://www.atmarkit.co.jp/ait/articles/1506/26/news026.html
LIFFがMessageAPIからLINE ログインに移るとき

本日のLINE Developer Day 2019で似たように感じてる参加者から質問があったので整理

# Messageing API からはLIFFは2月以降追加できない
以下のようなアナウンスが出ています。
LIFFはLINEログインで追加することになり、MessageingAPIからは追加できなくなります。
https://developers.line.biz/ja/news/tags/liff/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58795/a0290f65-c0b8-66fc-6751-88d66b84195b.png)

# LIFFが使えなくなるとかそういうわけじゃない

え？使えなくなるの？！？と疑問に思う方が多くいるかとは思うのですが、そうではなくて今まで通りにLIFFを使いたいときには
1. MessageingAPIのチャンネルを作り、いつも通りにBotを作る
2. LINEログインのチャンネルを作りLIFFを作る
3. LINEログイン側で発行されたURLをMessageingAPIで利用する

という手間が増えただけです。
これは何で起こったかというと一番大きいのはLIFF V2になってLIFF専用のページを作る必要が無くなって、同一のページで普通にLINE LOGINを利用したアプリも併用して作れるようになったからです。それに伴い、現状は2つのチャンネルで同一の機能を作ることができていたのが統合されたという方が正解かなと。

# LIFFの立ち位置が初期と大きく変わり成長してる証

正直めんどくさいなぁ・・という感じなのですが、今回のLINE Developer Day 2019に参加されてノベルティ貰った方は体験したと思うのですが、LINEアプリ内どこでもLIFFが立ち上げれるのです。これはもともとキリンの自販機で行っていたものやLINE Thingsの設定でLIFFが呼び出されていたのと同様のもので、もともと実装されていたミニアプリの片鱗が見えるものです。

これが行われるとBotとLIFFは無関係で呼び出され完全に切り離されたものにならざるを得ません。

ただこれはLINE内でLINE Payを使う時にそのお店のBOTと友だちである必要がないのと似ていて、LINE内で重要な立ち位置になりあがってしまったLIFFは独立していくものとして成長していくのかなと思います。

今後のLIFFはLINEログインとどういう関係になって再編成されてという道があり過渡期ではあるので、今回の措置はそういう理由だと僕は推測していて正しい判断かなと。

# p.s.
LINE Thingsを使おうとしてLINEログインのチャンネルが必要というのもなんだか違和感なんですが、逆にBotがないLINE Thingsを作っていけるというのはそれはそれで面白そうな気はします。
VSCodeのver1.40アップデートで変化したフォントをもとに戻す【Mac Retina】

# 概要
なんとはなしにVSCodeのバージョンを上げたところ、フォントが太くなってしまいました。ついでに日本語のフォントも変わってしまいました。
どうやらデフォルトのフォント設定が変更されたようです。設定を追加して、もとに戻しました。

* **設定前**
<img width="410" alt="設定前.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499113/135e389d-54a0-3786-04eb-b5673218dff3.png">

* **設定後**（旧バージョンと同じフォント）
<img width="410" alt="スクリーンショット 2019-11-21 19.21.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499113/954cbbd1-656a-65b2-135c-b253d77c73ca.png">


# 環境
* Mac Retinaディスプレイ
* VSCodeのバージョン 1.40
* VSCodeの言語設定 English
* フォント デフォルト設定

# 解決法
settings.jsonに以下を追加。

```settings.json
"workbench.fontAliasing": "antialiased",
"editor.fontFamily": "Menlo, Monaco, 'Courier New'"
```

## なにをしているか
1行目で、エイリアシングを設定しています。
アップデートでレンダリング周りが変更されたようです。Settingsを見ると、defaultはnon-Retina向けと書いてあるので、変更する必要があったようです。
https://github.com/microsoft/vscode/issues/84214
こちらのコメントを参考にしました。


2行目で、monospaceを使わないように変更しています。
アップデートでmonospaceの内容が変更されたようです。monospaceを使わないと、従来のフォントが適用されるようです。
自前でフォントを設定する場合は気にしなくても良いと思われます。
https://qiita.com/Amagawa/items/32117bd202d8f53f71fe
こちらを参考にしました。
Inverse analysises with model reduction

```{r}

#p.91

library(dplyr)

data=data.frame(num=1:20,y=c(0.20, 0.10, 0.49, 0.26, 0.92, 0.95, 0.18, 0.19, 0.44, 0.79, 0.61, 0.41, 0.49, 0.34, 0.62, 0.99, 0.38, 0.22,0.71,0.40),x1=c(84,87,86,85,82,87,92,94,88,84.9,78,90,88,87,82,84,86,83,85.2,82),x2=c(61,55.5,57,57,50,50,66.5,65,60.5,49.5,49.5,61,59.5,58.4,53.5,54,60,58.8,54,56),x3=c(24.5,24,23,22.5,22,24,25,26,25,24,23,21,26,25.5,24,23,24,24,24,22))

Y=data$y

X=as.matrix(data[,!(colnames(data) %in% c("num","y"))])

Y_mat=array(0,dim=c(length(Y),nrow(X)))

for(j in 1:nrow(X)){
  
Y_mat[,j]=sample(Y,length(Y))  
  
}

A=array(0.1,dim=c(length(Y),ncol(X)))

eta=0.01

ite=1000

for(s in 1:ite){
  
error=c()

for(i in 1:length(Y)){

error=c(error,sum(sqrt((Y_mat[i,]-X%*%c(A[i,]))^2)))
    
}  
  
for(l in 1:length(Y)){
for(m in 1:ncol(X)){  
  
de=-2*sum(Y_mat[,l]*X[,m])+2*A[l,m]

A[l,m]=A[l,m]-de*eta
   
}
} 
  
   
  
print(sum(error))
  
}

mat=array(0,dim=dim(A))

for(l in 1:length(Y)){
for(m in 1:ncol(X)){  
  
mat[l,m]=sum(Y_mat[,l]*X[,m])
   
}
} 






```

```{r}

#p.93

C=Y_mat%*%t(Y_mat)

n=ncol(C)

pthi_vec=rep(1,n)

cost=function(x,lamb){
  
x=as.numeric(x)

x=c(x)

x=x/sqrt(sum(x^2))

return(as.numeric(t(x)%*%C%*%t(t(x))))
  
}


ite=10000

eta=0.0001

h=0.01

for(l in 1:ite){
  
vec=pthi_vec

for(j in 1:length(pthi_vec)){
  
vec_sub=vec;vec_sub[j]=vec_sub[j]+h  
  
pthi_vec[j]=pthi_vec[j]+eta*(cost(vec_sub)-cost(vec))/h

}

print(cost(pthi_vec))

}

pthi=pthi_vec/sqrt(sum(pthi_vec^2))

pthi

eigen(C)$vector[,1]

t(pthi)%*%C%*%t(t(pthi))

eigen(C)$values[1]

```


```{r}

#p.114

library(dplyr)

G1=function(x,y){
  
return(sum((abs(x-y)^2)*log(abs(x-y+1)^2)))  
  
}

G2=function(x,y){
  
return(sum((x-y)^3) ) 
  
}

G3=function(x,y){
  
return(exp(-sum(abs(x-y))/10))  
  
}





data=data.frame(num=1:20,y=c(0.20, 0.10, 0.49, 0.26, 0.92, 0.95, 0.18, 0.19, 0.44, 0.79, 0.61, 0.41, 0.49, 0.34, 0.62, 0.99, 0.38, 0.22,0.71,0.40),x1=c(84,87,86,85,82,87,92,94,88,84.9,78,90,88,87,82,84,86,83,85.2,82),x2=c(61,55.5,57,57,50,50,66.5,65,60.5,49.5,49.5,61,59.5,58.4,53.5,54,60,58.8,54,56),x3=c(24.5,24,23,22.5,22,24,25,26,25,24,23,21,26,25.5,24,23,24,24,24,22))

X=as.matrix(data[,!(colnames(data) %in% c("no","y"))])

X=t((t(X)-apply(X,2,mean))/apply(X,2,sd))

Y=(data$y-mean(data$y))/sd(data$y)

n=nrow(data)

G_mat1=array(0,dim=c(n,n))
G_mat2=array(0,dim=c(n,n))
G_mat3=array(0,dim=c(n,n))



for(l in 1:3){

for(i in 1:nrow(X)){
for(j in 1:nrow(X)){
  
if(l==1){  
  
G_mat1[i,j]=G1(X[i,],X[j,])  
  
}else{
  
if(l==2){
  
G_mat2[i,j]=G2(X[i,],X[j,])  
  
}else{
  
G_mat3[i,j]=G3(X[i,],X[j,])  
  
}  
  
}  
  
} 
}
  
}  


diag(G_mat1)=diag(G_mat1)+10^(-10)
diag(G_mat2)=diag(G_mat2)+10^(-10)
diag(G_mat3)=diag(G_mat3)+10^(-10)


A1=Y%*%t(solve(t(G_mat1)))
A2=Y%*%t(solve(t(G_mat2)))
A3=Y%*%t(solve(t(G_mat3)))




```
Ruby小ネタ2

現場のプロジェクトでよく使い、でも初心者な自分は知らなかったあれこれ。

## pluck
指定したカラムの値を配列として戻します。

```Ruby:
HogeModel.pluck(:id)
# => [1,2,3]
```

なにが便利かというと、配列になっているので`include?`とか`any?`が使えます。
処理中に出てきた変数と比べられたり、where句の問い合わせにそのまま入れられたり（配列になっているので、Railsはin句として処理してくれる）。

## 子モデルの値に対するwhere句
親モデルに対するwhere句は`where(colum: 'a')`で書けますが、それでは子モデルは？

```Ruby:
AModel.joins(:BModel).where(b_models: {bcolum: 'b'})
# => SELECT a_models.* FROM a_models INNER JOIN b_models ON a_models.id = b_models.a_id WHERE b_models.bcolum = 'b'
```

意外に初心者向けの本にはこれが書いてなかったりする。
ちなみにjoinした方が親テーブルであっても、複数形のsを付けないとエラーになる。
どうやらSQLとして発行する時にテーブル名として表現するためのようです。

## &.

最初に見た時はなんだこれ？　と思ったのですが、分かると非常に便利。

```Ruby:
hoge = 'aB'
hoge&.swapcase
# => "Ab"

huga = nil
nil&.swapcase
# => nil
```

`&.`を付けることで、nilならばエラーを出す`swapcase`がエラーを出さずに実行できます。
使った場面としては、外部結合して取ってきた子モデルの特定のカラムを取得するとき。

```Ruby:
a_table.b_table&.bcolum
```

こんな風にしておけば、b_tableが空の時でもエラーにならずに実行が続きます。
Rubyのtapの動きと使い方

既出ネタですが、自分の頭を整理するためにアウトプット。

## tapとは
ブロックにレシーバ自身を入れてブロックを実行。
戻り値にレシーバ自身を返す。

## どんな動きか
レシーバーについて何かしたいけど，したあとそのレシーバーがほしい。
と言われてもよく分からなかったので、こちらの記事がとても分かりやすかったです。

とても分かりやすかった記事はこちら。
[Ruby | tap がよく分かってなかったので基本を調べてみた](https://qiita.com/YumaInaura/items/6c32f0568aa23f83313a: "Ruby | tap がよく分かってなかったので基本を調べてみた")

```Ruby:
a = 1
a.tap { |i| i*3 }
put a
# => 1
```

このコードだと、aにいれた1をtapの中で3倍しているけど、aはなにも変わってない。

## 具体的になにに使えるか
こちらの記事にあった用途で、実際のプロジェクトで使いました。
[Rubyのtapメソッドが便利なので紹介する](https://www.te-nu.com/entry/2018/03/18/190000)

```Ruby:
HogeModel.new(params).tap(&:save).id
```

saveメソッドはtrue,false返すので、そうじゃなくて保存したHogeModelオブジェクトを戻り値として欲しい時に、この1行で簡潔に書ける。
その他、ブロックの中でデバッグが便利だという話ですが、そこはまだ手を動かしてないので、自分で動作させたら追記します。
枠定義：実際のサイズに合わせる一方、最大サイズを設ける

下記のニーズのMarkupメモです。

1. シングル行の文字列の外に枠を付ける
2. 幅はmaxWidthを超えない
3. 表示しきれない長い文字列はellipsisする

```css
.hoge {
  width: fit-content;  // 短い場合、幅は文字サイズに自動的に合わせる
  max-width: 400px;  // 文字数により幅がずっと広げるわけがない
  padding: 5px 10px;
  overflow: hidden;  // 次の３行で表示しきれない部分は...で表す
  white-space: nowrap;
  text-overflow: ellipsis;
}
```
queueのjobをcancel、deleteしてもworkerで動いている処理は止まらない

## 前提
### ジョブを登録する
```python
from django_rq import get_queue

q = get_queue()
job = q.enqueue(処理)
```

### ジョブを消す
```python
from django_rq import get_queue

q = get_queue()

job_id = ***
job = q.fetch_job(job_id)

job.cancel()
job.delete()
```
→workerで動いている処理は止まってない

## 処理が動いているpidを使ってos.kill(pid)

####  処理のなかでpidを調べて、jobのmetaに持たせる
```python
def 処理:
  job = get_current_job()
  worker = get_worker()
  job.meta['pid'] = worker.pid
  job.save()

  ...
```

#### ジョブを消す時にos.kill(pid)
```python
from django_rq import get_queue
import os
import signal

q = get_queue()

job_id = ***
job = q.fetch_job(job_id)

pid = job.meta['pid']
os.kill(int(pid), signal.SIGTERM)

job.cancel()
job.delete()
```

## まとめ
- 他に良い方法ないのかな

## 追記
良さげな方法を追記

- https://qiita.com/nakamumu/items/f1b9234c194174c32671

## 参考
- https://codeday.me/jp/qa/20190411/505914.html
- https://github.com/rq/rq/issues/684
Go言語で使用できる変数名、使用できない変数名

Go言語では変数名に「nil」を使っても怒られない(コンパイルが通る)と知り、
じゃあ何が使えて、何が使えないのか気になったので確認しました。
(他にもあれば追記するかも知れません)

##使用できる
###英数字で始まる
hoge, fuga, piyo2 など

###\_ で始まる(ただし、 \_ 単体は不可)
\_hoge, \_fuga, \_piyo2 など
###定義済み識別子
| 識別子の種類 | 識別子 |
|:-----------|:------------------|
| 型         |bool, byte, complex64, complex128, error,<br> float32, float64, int, int8, int16, int32, int64,<br> rune, string, uint, uint8, uint16, uint32, uint64, uintptr
| 定数        | true, false, iota 
| ゼロ値       | nil |
| 関数        | append, cap, close, complex, copy, delete, imag,<br> len, make, new, panic, print, println, real, recover |

```go
// こんな書き方でも許される
var string string = "string"
```

###その他
main (意外ですが使えました)


##使用できない
###数字で始まる
1hoge, 2fuga, 3piyo など

###_(アンダースコア変数)
※明示的に宣言すればコンパイルは通るが、変数としては使えない。

```go
    _ := "hogehoge" // コンパイルエラー
var _ =  "hogehoge" // コンパイルは通る
```

###予約語
```go
break        default      func         interface    select
case         defer        go           map          struct
chan         else         goto         package      switch
const        fallthrough  if           range        type
continue     for          import       return       var
```

##おわりに
型や関数名が変数名として使えるのはおもしろいと思いますが
他の人と未来の自分が混乱するだけなので、よほどの理由がない限り使うのは避けるべきだと思います。

(よほどの理由や事例をご存知の方いらっしゃいましたら、ぜひ教えてください。)
Immutable.Recordを使うクラスの継承

Immutable.Recordを使う複数のデータモデルクラスに全く同じデータ構造や処理ロジックを持つ場合、DRY原則により、クラスを継承する必要がある。

### モデルクラスの定義

```javascript
export default class Hoge extends Immutable.Record({
  item1: null,
  item2: 99,
}) {
  fuga() {
  }
  fuga2() {
    // console.log(this.item2);
  }
}
```

### モデルクラスの継承

- デフォルト値には、親子のデフォルト定義を両方とも入れる
- 子クラスに親クラスと違う処理ロジックのみを記載する

```javascript
export default class Hoge2 extends Hoge {
  fuga2() {
    // console.log('hello, immutable.js');
  }
}
```

**ここがポイント：**`Hoge2クラスを定義する時に、デフォルトObjectを記載しないこと`
何故なら、Hogeは既にクラスになっているので、デフォルトObjectを渡せないからである。
そのため、デフォルトObjectは`親クラス`で定義する。

### Immutable.Recordは関数

Immutable.Recordはただの関数で、`Immutable.Record(defaultObj)`の実行結果は`Record.Factory`（クラス）である。


### 参考資料
- [Immutable.Record](https://immutable-js.github.io/immutable-js/docs/#/Record/Record)
AWS CLF合格記(2019/11/21投稿)

# はじめに
今年の7月にAWS認定クラウドプラティクショナーを受験し、合格しましたので、今更ながら具体的にどのような勉強をしたのかを書いていこうと思います。

本記事はあくまで個人の受けた所感なので、参考にするぐらいで読んでいただければと。


# 目次

* AWS認定クラウドプラティクショナーとは
* どんな勉強をしたのか
* 受験した結果とその感想


# AWS認定クラウドプラティクショナーとは

まずクラウドプラティクショナーとはどのような資格かですが、AWS認定試験の中でも一番入門レベルの試験で、これからAWSを勉強する方や営業の方がAWSについて勉強するために受験する資格です。
ここではそこまで詳細に説明はしないので、より詳しく知りたいという方は他の方のブログを見ていただければと思います。
もしくは以下の公式ページをご覧ください。
[AWS 認定試験について](https://aws.amazon.com/jp/certification/?nav=tc&loc=3)

<b>AWS認定の種類</b>
[![aws cirtifications.png](https://d1.awsstatic.com/Train%20&%20Cert/Certification%20Page%20Images/AWS-Certification-Current-Roadmap-May2019.36b629c3b9be6da400a13e6cf1a4f9f4ef680f70.png)

その試験内容としてはゴリゴリAWSサービスについて聞かれるというよりは、どちらかというとAWSの基本となる5本の柱について正確に理解しているか、AWSサービスの特性を知っているかどうかが問われる問題が多いように感じました。

逆に言えば、基本の考え方と最低限のサービスさえ理解していれば合格はそこまで難しくないと思います。
それよりはクラウドプラティクショナーの上位資格のソリューション アーキテクト アソシエイトのほうが、よりAWSのサービスごとの特性や実際の活用例を元に問題が出されたりするので、難易度は高いです。
※AWSのサイトから見れるサンプル問題や模擬問題を受験するとよくわかります。

<b>[AWS 認定クラウドプラクティショナー](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)</b>

上記リンクに記載されている推奨の知識では『最低 6 か月の AWS クラウド使用経験があること』とありますが、自分は受験時はまともに使い始めて2週間ぐらいだったので、ちゃんと勉強すればそこまで心配はいらないのかもしれません。


# どんな勉強をしたのか

この記事を見られた方が一番気になっていると思われる、実際にどのような勉強をしたのかですが、大きく以下の３種類の勉強をしました。

* AWS Well-Architectedのホワイトペーパーを読む
* AWSのテキストを読む
* AWS Black Belt Online Seminar 『AWS 認定クラウドプラクティショナー取得に向けて』を見るor読む

まず1つ目のWell-Architectedですが、これはAWSでサービスを構築する上で元となる『Well-Architected フレームワークの 5本柱』について書かれています。
全部で94ページと中々量が多いですが、参考資料や付録も載せてたりするので、実質読むのは8～52ページあたりの5本柱についての記載のみでした。
ただ、これを全部覚えないといけないというわけではなく、あくまでこのような考え方があるんだなーというのがわかっていればよいと思います。

<b>↓公式のWell-Architectedはこちら↓</b>
[AWS_Well-Architected_Framework_2018_JA_final](https://d1.awsstatic.com/International/ja_JP/Whitepapers/AWS_Well-Architected_Framework_2018_JA_final.pdf)


次に2つ目として、以下のAWSのテキストを一通り読み流しましました。

<b>[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403)</b>

こちらも何回も読んで絶対に覚えないといけないというわけではなく、流し見してどのようなことが書いてあるのか、何のAWSのサービスが書かれているのかを軽く把握するぐらいで勉強しました。

その上で、最後3つ目としてテキストの問題と以下のBlack Beltのスライドに記載されている問題を解いていきました。

<b>[AWS Black Belt Online Seminar 『AWS 認定クラウドプラクティショナー取得に向けて』](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-aws-124130272)</b>


特に一番重要なのはここで、このBlack Beltのサンプル問題ですが、流石公式が作っただけあって必要なところを抑えた問題が出題されます。
また、実際に出題される試験問題と出題傾向が近いものが出ていることもある(※個人の感覚です)ので、問題を解く→間違えたらテキストを見る→もう一度解く、という風にやっていくと必然と覚えることができました。

それを解いてもまだ心配な方は、2つ目に出したテキストの模擬問題とAWSが公式で提供している模擬問題(確か2000円ぐらい？)を解いてもいいと思います。
ただ、そちらはあくまで参考までにしておいたほうが良いです。
特に模擬問題は本試験からすると少しレベルが低いものが出題されるので。


# 受験した結果とその感想

受験した結果ですが無事に合格することができました！

具体的なスコアは、合格に必要な最低スコアが700のところ770というなんともギリギリ感が否めませんが、それでも合格は合格です笑

正直一部のサービスとかは勉強不足であった部分もありましたが、個人の感覚で3分の1か4分の1ぐらいは文章を読んで消去法で絞ることができたので、問題文はしっかり読んだほうが正答率は上がると思います。
複雑な戻るボタンをJavaScriptで実装した

#概要
JavaScriptでブラウザの「もどる」と同じ機能のボタンを作るのは簡単だが、条件によって状態を分岐させるのが割と面倒だった。サイト内の回遊は問題なく行えるけど、他のサイトから遷移してきたときは戻さないというルールとした。

|条件|処理|
|:-----------------|:------------------|
|同じサイトからの遷移|戻るボタン表示|
|SNSなど異なるサイトからの遷移|戻るボタン非表示|
|どこから来たか不明な場合|戻るボタン非表示|
|同じサイトから「別タブ」で見る|戻るボタン表示＆遷移先を指定|

#リファラを調べる
リファラとはどこから来たのかという情報。JavaScriptでは以下のように取得する。

```javascript:referrer.js
const ref = document.referrer;
```
- 綴りはrが2つ続く「referrer」が正しい。HTTP選定時にスペルミスがあり、一部は「referer」になってるらしい。（[wikipedia](https://ja.wikipedia.org/wiki/HTTP%E3%83%AA%E3%83%95%E3%82%A1%E3%83%A9)）
- PHPでも取得できるが、うまく取得できない場合がある。（CDNの関係か？）
- metaでreferrerの送信設定をすることができる。（[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Referrer-Policy)）

取得したURLのドメインと現在のページのドメインが一致したら「戻る」ボタンを表示するようにした。
（正規表現の部分は、シンプルに`現在のページのドメインが含まれている`でもいいかも...）

```javascript:referrer.js
const ref = document.referrer;
const ref_domain = ref.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1];
const now_domain = window.location.host;
if (ref_domain === now_domain) {
...
}
```

#別タブ対応
同じサイト内から「別のタブで開く」場合、リファラ情報を持ちながら履歴がない状態になる。
（Safari v13ではこの場合にリファラ情報が取得できないため、「戻る」ボタンは非表示にした。）

初めは、履歴の有無を取得し履歴がない場合はボタンを非表示にする方法を検討したが、該当ページからどこかへ遷移して戻って来た場合、履歴はあるが戻れないという状況になってしまうので諦めた。
最終的には、一度ブラウザバックを実行し、戻ればよし、戻らなかったら遷移する場所を指定する方法にした。

```javascript:blank.js
let is_before = false;
$(window).on('unload beforeunload',function () {
  is_before = true;
});
$('#js_back_button').on('click', function () {
  setTimeout(function () {
    if(!is_before){
      location.href = '/'; //どこかへ遷移させる。referrerで取得したurlでも良い。
    }
  }, 100);
});
```
```html:blank.html
<a href="javascript:history.back();" id="js_back_button">戻る</a>
```


#MacのFirefoxでトラブル
かなり限定的な話だが、以下の条件で「戻る」ボタンが動かなかったのでメモ。

- aタグにjavascript:void(0);
- JavaScriptでhistory.back();
- Mac 10.14.6 ／Firefox 70.0.1 （windowsの同じバージョンのFirefoxは大丈夫）
- ローカルの開発環境は問題なし、サーバーにアップしたら動かず。

すぐに解決策を見つけたので、深追いはしていない。（深追いしても分かるのか微妙…）
UniRxのOnErrorRetryでdelayをだんだんと長くしていく

UniRxのOnErrorRetryのディレイを任意の値に切り替える実装です。
APIリクエストの実装などでディレイをだんだんと長くしたいときに利用してます。
例ではフィボナッチを使っていますが、任意の実装に置き換えて使えると思います。
また、一定回数を超えると `Observable.Throw<T>(ex)` を返していますが、そこでリトライは終了し、streamは `OnError` を呼んで終了します。

```c#
using System;
using UniRx;
using UnityEngine;

public static class ObservableExtensions {
    
    private static readonly float[] incrementalDelaySeconds = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55};

    public static IObservable<T> OnErrorRetryWithIncrementalDelay<T>(this IObservable<T> observable) {
        return Observable.Defer(() => {
            var count = 0;
            IObservable<T> self = null;
            self = observable.Catch((Exception ex) => {
                Debug.LogException(ex);
                count++;
                return count < incrementalDelaySeconds.Length
                    ? self.DelaySubscription(TimeSpan.FromSeconds(incrementalDelaySeconds[count]))
                        .SubscribeOn(Scheduler.CurrentThread)
                    : Observable.Throw<T>(ex);
            });
            return self;
        });
    }
}
```
iOS13.2以降でCoreNFCが動かない！っていう現象が発生したので検証してみました。

#概要

　NFCタグのIDを読み込んでみるアプリを作っていたのですが、iOSを最新にしたら動かなくなってしまったので色々検証た結果、iPhoneXR以降（iPhoneXR、iPhoneXS、iPhone11、iPhone11 PRO、iPhone11 PRO MAX）しか動かなくなった（らしい）というのがわかりました。
　以下に詳細を記載してみたいと思います。

#追記
　iOS13.2.3にアップデートしたらNFCタグが読めるようになりました！
　ってことでOSバグだったようです。サイレントバグ修正ありがとうございます（酷）

#発生した問題

　iOS13にてCoreNFCというライブラリ（NFCTagReaderSessionとかNFCNDEFReaderSessionとか）が使えるようになり、NFCタグからIDなどを読めるようになりました。

　iOS13.0系とか13.1系にてNFCタグを読み取って色々使ってみており、NFCタグ読めるーワーイスゴーイターノシー♪ってなってました（何）

　ところが、iOSを最新版にアップデートした途端(13.1.3から13.2.2)、「あなたの端末は対応していません！」みたいな文句を言われ、NFCの読み取りができなくなってしまいました！！（滝泣）

#なので検証してみた

手元にiPhone6S、iPhoneX、iPhoneXR、iPhone11があったので（多）それぞれで試してみました。

###iPhone6Sの場合

　iOS13.1.3の時代、NFCTagReaderSessionを使用したアプリを作成、NFCタグを読み取ってワーイスゴーイターノシー♪ってなってました（しつこい）
　iOS13.2.2にアップデートしたら……「あなたの端末は対応していません！」
　読み取り画面すら出て来なくなりました。。。

###iPhoneXの場合

　そもそもこの現象を最初に確認したのがこのiPhoneX。
　iOS13.1.3の時代、NFCTagReaderSessionを使用したアプリを作成、NFCタグを読み取ってワーイs(ry
　iOS13.2.2にアップデートしたら……「あなたの端末は対応していません！」
　読み取り画面すら出て来なくなりました。。。

###iPhoneXRの場合

　「iPhone11以上なら動くんじゃね？」っという噂を聞きつけたので、「まさかの最新機種だけの限定機能になってしまったの？（つぶらな瞳）」という不安をもとに検証しました。
　ドキドキしながらiOS13.2.3にアップデート……完了！
　ぷるぷる震えながら（誇大表現）NFCタグ読み取りボタンを押してみたら…………読めた！　ヨメター！！（BGM：□ッキーの勝利曲）
　IDから（読み取れる範囲の）中身のデータまで取得ができました。

###iPhone11の場合

　実は上記の噂を聞きつけ、XRより先に検証したんですが、この現象が発生してから「最新系列を持ってないといかん」という感覚で手元に入手。
　入手した時にたまたま13.1.3だったので、ちゃんとNFCタグが読めることを確認してからアップデート、無事にIDから（読み取れる範囲の）中身のデータまで取得ができました。

#結論

　どうやらiPhoneXR以降（iPhoneXR、iPhoneXS、iPhone11、iPhone11 PRO、iPhone11 PRO MAX）だったら正常に動作するようです。

これは勝手な推理（妄想？）なんですが
　・CoreNFCでバックグラウンドからNFCタグを読めるようになったのがiPhoneXR以降
　・Apple純正アプリである所の「ショートカット」の中にある「オートメーション」の起動選択肢に「NFC」が選択できるようになったのがiPhoneXR以降
　・Apple公式HPで表示されてる製品ラインナップがiPhoneXR以降（XSがいつの間にかいなくなっていますが）
ということで、~~バグというより仕様という気がしております。
なーんにもお知らせされてない気がするのでせめて事前にどこかで教えて欲しかった。。。（泣）~~
　iOS13.2.3にアップデートしたらNFCタグが読めるようになりました！


#追伸

　検証してみる段階だったり検証してみた段階だったりでネットに情報が見当たらなかったので、初めてなんですが記事を書いてみました。
　すでに一般常識ですからー！　ここに情報載ってますからー！！　みたいな状態だったらゴメンナサイします。
　ただの文章しかないのでQuitaの技術記事っぽくないですが、どこかのどなたかの役に立てたらとっても嬉しいなと思います。

　最後まで読んでいただき、ありがとうございました！！（感謝）
RESTfullの概念

# RESTとは？
- アプリケーションの設計方法の一つ
- HTTPメソッドを使ってWebのリソースを操作する際の設計方法
- Railsにおいてリソースとは、ユーザーや掲示板の情報など、主にデータベースのテーブルのデータの事。


# HTTPメソッドとは
- GET → リソースの取得
    - 例えば掲示板情報を取得するとき。
- POST → リソースの作成
    - 例えばフォーム内容を作成したときにサーバーへリソースの作成をする。
- PATCH/PUT →リソースの更新
    - 例えば掲示板のフォーム既存情報を編集するときに利用する。
- DELETE →　リソースの削除
    - 例えば掲示板データの削除

**リソースを操作するときはこのいずれかを選びプログラムを書いていく。**

# HTTPメソッド一覧

| メソッド | 意味 |
|:--|:--|
| GET | リソースの取得 |
| POST | 　子リソースの作成、リソースへのデータ追加、その他処理 |
| PUT | リソースの更新、リソースの作成 |
| DELETE | リソースの削除 |
| HEAD | リソースのヘッダ (メタデータの取得) |
| OPTIONS | リソースがサポートしているメソッドの取得 |
| TRACE | プロキシ動作の確認 |
| CONNECT | プロキシ動作のトンネル接続への変更 |

[参考](https://qiita.com/r_fukuma/items/a9e8d18467fe3e04068e)