OmniAICreator/Qiita-1.07M huggingface dataset:
C#で湯婆婆を実装してみる

# はじめに

原作者様: [Javaで湯婆婆を実装してみる - Qiita](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)

- [Cで湯婆婆を実装してみる - Qiita](https://qiita.com/NAVE/items/05d0622e735d23b5c37e)
- [Perlで湯婆婆を実装してみる - Qiita](https://qiita.com/fujitanozomu/items/d403f50ef285e606343b)
- [PHPで湯婆婆を実装してみる - Qiita](https://qiita.com/hinatao3o/items/52b8d457c650c3e00ea4)
- [Rubyで湯婆婆を実装してみる - Qiita](https://qiita.com/takaram/items/31643adbe69940f77c7b)

拙作「[Python 3で湯婆婆を実装してみる - Qiita](https://qiita.com/everylittle/items/aae58c241194c0e5f515)」に続いて、調子に乗って2言語目でやってみました。
暇人かよ。


# コード

C#のコンソールアプリ (.NET Core 3.1) でお願いします。

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

namespace Yubaba
{
    class Yubaba
    {
        static void Main(string[] args)
        {
            Console.WriteLine("契約書だよ。そこに名前を書きな。");
            var name = Console.ReadLine();
            Console.WriteLine($"フン。{name}というのかい。贅沢な名だねぇ。");

            var random = new Random();
            var newNameIndex = random.Next(name.Length);
            var newName = name[newNameIndex];
            Console.WriteLine($"今からお前の名前は{newName}だ。いいかい、{newName}だよ。分かったら返事をするんだ、{newName}!!");
        }
    }
}
```

ちなみに ``$"..."`` の書き方は↓これです。私もさっき知りました。
[【C#】string.Format() をやめて $"{}"（文字列補間式）を使う - Qiita](https://qiita.com/Nossa/items/c2226232b31d7665267f)

## 実行例

```
契約書だよ。そこに名前を書きな。
田中二郎
フン。田中二郎というのかい。贅沢な名だねぇ。
今からお前の名前は田だ。いいかい、田だよ。分かったら返事をするんだ、田!!
```

## クラッシュ湯婆婆

名前が空だと落ちてしまう湯婆婆。
原作リスペクト。あえて直さない。


```
契約書だよ。そこに名前を書きな。

フン。というのかい。贅沢な名だねぇ。
Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at System.String.get_Chars(Int32 index)
   at Yubaba.Yubaba.Main(String[] args) in C:\...\Yubaba.cs:line 15
```

## 「𠮷」田さんが契約したら…

コマンドプロンプト（Visual Studioのデバッグコンソール）が「𠮷」田さんを受け付けてくれない。コピペで入力した時点で化けてる。<del>𠮷田さんをまともな名前で働かせてあげてください。</del>

```
契約書だよ。そこに名前を書きな。
��田
フン。??田というのかい。贅沢な名だねぇ。
今からお前の名前は?だ。いいかい、?だよ。分かったら返事をするんだ、?!!
```

関連: [吉田さんは通すけど𠮷田さんは通さないミドルウェア - Qiita](https://qiita.com/mpyw/items/5bb2d84f583378e1cf68)

**(2020/11/09) 𠮷田さんが働けるようになったようです。**
→[C# で湯婆婆を実装してみる（𠮷田さんにも対応） - Qiita](https://qiita.com/okazuki/items/03049da368222b562da9)
はじめに

はじめまして。
その辺にいる会社員です。

いろいろなことが欠如しているのですが、
業務でいろいろやらないといけいないため、
メモ代わりに残すことにしました。

既に知っている方からすれば、薄っぺらい内容かと思います。
コーディングレベルも低いので突っ込みどころは満載かと思います。

何とかするシリーズではそこは無視していきます。
質問を書く場合があります。
見つけたら教えていただけると嬉しいです。
よろしくお願いします。

使用バージョン：Python 3.8.5
使用エディタ　：VS Code

追記：コーディング規約もいったん無視します。
Vで湯婆婆を実装してみる


[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2) に便乗しました. 一覧はhttps://qiita.com/torifukukaiou/items/c8361231cdc56e493245 になります.

```v:yubaba.v
import os
import rand

fn main(){
	println("契約書だよ。そこに名前を書きな。")
	name := os.get_line().ustring()
	println("フン。"+name.str()+"というのかい。贅沢な名だねぇ。")
	idx := int(rand.u32_in_range(0,u32(name.len)))
	new_name := name.substr(idx,idx+1)
	println("今からお前の名前は"+new_name+"だ。いいかい、"+new_name+"だよ。分かったら返事をするんだ、"+new_name+"!!")
}
```

なお,名前に何も渡さないと`max must be greater than min`と出力されます.
データカタログを使う（ビジネス用語 応用編）


##ビジネス用語に記載すべき情報
[データカタログを使う（ビジネス用語 基本編）](https://qiita.com/takayuki-yamamoto/items/924056d9b7249e0b17bb "データカタログを使う（ビジネス用語 基本編)")では、IBM Cloud Pak for Data(CP4D)のWatson Knowledge Catalog(WKC)を使った時のビジネス用語の作成方法をご紹介しました。

ビジネス用語には、**説明**の他に、**関連用語**や**関連成果物**を設定することができます。
ここでは、**関連用語**と**関連成果物**についてご説明します。

##関連用語とは
関連用語とは、ビジネス用語の同義語やその他のビジネス用語の関係を表すものです。関係には、タイプと要素があります。
###タイプの種類
| タイプ                     | 説明        | 例            |
|:------------------------- |:------------|:-------------|
| 下位タイプ   | **Is a type of**の関係です。<BR>一般的に範囲が広い別の用語の概念的なインスタンスを指定します。オブジェクト指向言語をご存知の方であれば、継承したクラスの親と表すと分かりやすいかもしれません。| 表示されているビジネス用語が住宅ローンの場合、より広い用語はローンです。 つまり、**住宅ローン** is a type of **ローン**になります。|
| 上位タイプ   | **Has a type of**の関係です。<BR>より狭い用語やサブタイプを持つことができる概念的なインスタンスを指定します。オブジェクト指向言語をご存知の方であれば、継承したクラスの子と表すと分かりやすいかもしれません。 | 表示されているビジネス用語がローンの場合、対応する狭義のサブタイプは住宅ローンです。つまり、 **ローン** has a type of **住宅ローン**になります。 |

これを図示すると以下になります。
![Loan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/92c8f553-d2f0-7109-d0cc-e6a6b686ddec.png)
####下位タイプ(Is a type of)の例
CP4Dで下位タイプを設定した場合の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/fa598ff6-7118-1640-9517-2a017605ba6e.png)
####上位タイプ(Has a type of)の例
CP4Dで上位タイプを設定した場合の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/fbcc89f9-39bb-9afd-0294-eb136ba9034f.png)

###要素の種類
| 要素                     | 説明        | 例            |
|:------------------------- |:------------|:-------------|
| 下位要素   | **Is a part of**の関係です。<BR>表示されているビジネス用語が、他のビジネス用語の構成要素、一部、属性である関係です。| 現在のビジネス用語が住宅ローンの場合、ハイブリッドレート、手数料、代行手数料という用語が、住宅ローンの属性になります。つまり、**手数料** is a part of **住宅ローン**になります。|
| 上位要素   | **Has a part of**の関係です。<BR>表示されているビジネス用語の構成要素、一部、属性である用語を指定します。| ハイブリッドレート、手数料、代行手数料という用語は、現在表示されているビジネス用語である住宅ローンの属性になります。つまり、**住宅ローン** has a part of **手数料**になります。 |

これを図示すると以下になります。
![Loan1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/d344e604-905b-8b23-87fe-e98fbd53cf41.png)

####下位要素(Is a part of)の例
CP4Dで下位要素を設定した場合の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/f62504c2-54bd-872e-e5e9-7dd497d05eef.png)

####上位要素(Has a part of)の例
CP4Dで上位要素を設定した場合の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/57c65861-afaf-3985-8c15-5c89ed7489d4.png)

###関連用語をダイアグラムで確認してみる
関連用語としてタイプと要素があることをご紹介しましたが、CP4Dではこれらの関係をダイアグラムで確認することができます。参考までに、そちらもご紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/9597c3d8-95c6-cb79-61af-b5a31b438a32.png)

##関連成果物とは
ビジネス用語を割り当てられる関連成果物には、**分類**と**データクラス**があります。**分類**と**データクラス**については別の記事でご紹介する予定ですが、ここでは、ビジネス用語を割り当てられる数についてご紹介しておきます。

+ **分類：**１つのビジネス用語に、複数の分類を関連付けることができます。
+ **データクラス：**1つのビジネス用語に、複数のデータクラスを関連付けることができます。
Kubernetesにおけるカーネルチューニング


## Kubernetes におけるカーネルパラメータ

Kubernetesにアプリをデプロイして、すべてがうまくいったら、あとはスケーリングするだけです。
スケールするにはどうすればいいのでしょうか？

簡単に思いつくのは、Podを追加することですね。
ところが、ポッドはすぐにカーネルの限界に達します。
例えば、`net.core.somaxconn` や `kernel.msgmni` というカーネルパラメーターです。
前者は、受け入れのためにキューに入れることができる接続の最大数を表します。
後者は、システム全体におけるメッセージキューの最大数です。
こういったあたいは、システムのスケールとともに、より大きな値を設定することで効率的になると思います。
少なくとも、接続数のためにリソースにゆとりがあるのに、新しいPodを作成する必要はないとおもいます。

```
root@x:/# sysctl -a | grep "net.core.somaxconn"
net.core.somaxconn = 128
```

net.core.somaxconnはこのようにデフォルトで非常に小さい値に設定されています。

通常の Linux VM で sysctl パラメータを更新するには、以下のコマンドを実行します。

```
root@x:/# sysctl -w net.core.somaxconn=10000    
```

しかし、ポッドで試してみるとこんな感じになります。

```
root@x:/# sysctl -w net.core.somaxconn=10000  
sysctl: setting key "net.core.somaxconn": Read-only file system
```

これで、標準的なVMとは状況が異なるということはわかったと思います。

### Kubernetes側でのの対処法

sysctlに関しては、Node側の責任を追っているものであり、Podから変更することはできないのです。
つまり、sysctlの変更によって、Node上の他のPodに影響を与えてしまうので、危険なsysctlはkubeletによって、カーネルへ貫通しないような設計にKubernetes側でしているということです。

しかし、ハイパフォーマンスやリアルタイムアプリケーションのチューニングのような非常に特殊な状況では、特定の安全でないsysctlsを許可することができます。安全ではないsysctlsはノードごとにkubeletのフラグで有効になります。

```
kubelet --allowed-unsafe-sysctls \
  'kernel.msg*,net.core.somaxconn' ...
```

このコマンドによって、Unsafeなsysctlを許可することができます。
あとは、initContainerにパラメータを設定させることで、パラメータを変更できます。

```yaml
initContainers:
        - name: init-sysctl
          image: busybox
          command:
          - /bin/sh
          - -c
          - |
            sysctl -w net.core.somaxconn=10000
            sysctl -w net.ipv4.ip_local_port_range='1024 65535'
          securityContext:
            privileged: true
```



## 参考

https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/
http://bogdan-albei.blogspot.com/2017/09/kernel-tuning-in-kubernetes.html
【Vue Router】Router-link を使ってページを移動する


## Vue Routerとは
**Vue.jsを利用したSPA構築で、ルーティング制御をするための公式プラグインです。**

※SPAとは、単一のWebページでアプリケーションを構成する設計構造
※ルーティングとは、データを目的地まで送信するために、コンピュータネットワーク上のデータ配送経路を決定する制御

## Vue Routerの導入方法
以下のコマンドでインストールします

```
$npm install vue-router
```

## router.js の作成

``` js:router.js
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router);
export default new Router({
  mode: "history",
  routes: [
    { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
  ]
})
var app = new Vue({
  router: router
}).$mount('#app')
```


#ルートを利用する
今回はrouter-linkを用います。
`<router-link>`タグは`<a>`タグとしてレンダリングされます。


```vuejs:App.vue


<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app">
  <h1>Vue.js App</h1>
  <p>
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
</div>
```

##参考
[はじめに | Vue Router](https://router.vuejs.org/ja/guide/#html)
データカタログを使う（ビジネス用語 基本編） 


##ビジネス用語とは
例えば、「顧客」の定義は何でしょうか？ 顧客とは、何かを購入した人、あるいは購入を検討している人でしょうか？
元社員は、引き続き、「従業員」として分類すべきでしょうか？
「協力会社」と「販売会社」は同義語でしょうか？

このような質問に対する答えを、企業の業務部門やIT部門の間で、一貫性と合意を確保するために、ビジネス用語は使われます。
そのため、ビジネス用語は、ビジネス概念の定義を標準化することを意識して、企業全体でデータが統一された理解しやすい方法で記述するようにします。

ビジネス用語には、データの内容、データの機密性、またはデータの主題や目的など、データの他の側面を記述することができます。
例えば、以下の用途に利用することができます。

+ 異なるカラム名を持つカラムが同じタイプのデータを持っていることを示す。
+ 専門用語や不明瞭なカラム名を、意味があり、アクセス可能な定義を持つ用語に翻訳する。
+ 類似のデータに影響を与えるポリシーやルールと紐付ける。
+ 似たようなデータを持つデータ資産と紐付ける。
+ 複数の異なるカラム名ではなく、1つのビジネス用語を使用することで、データ・ポリシーやルールの記述を簡素化する。
+ 他のビジネス用語との関係を定義する。

##どこから始めるか
データの定義に関して多くのビジネス課題があり、すぐに効果が出そうなクイック・ヒットの観点から領域を選択することが望ましいです。
例えば、データの品質を改善することで、顧客中心プログラムをサポートするという観点で、世帯や氏名を取り扱うものがやりやすいかもしれません。
もしくは、監査の失敗、データの侵害、リスク管理といった点から開始されるお客様もいらっしゃいます。

そして、ビジネス課題を特定したら、業務部門からの支援を得て、そのユースケースで重要なデータを特定することから始めます。その後は、徐々に領域を広げていきます。

##ビジネス用語作成方法
ここでは、IBM Cloud Pak for Data(CP4D)のWatson Knowledge Catalog(WKC)を例に、ビジネス用語の作成方法をご紹介します。
CP4Dにログインした直後の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/07089994-5af0-aea6-3eef-b43af5b8f16e.png)
左上にあるメニューボタンを押して、ガバナンス -> ビジネス用語を選択します。
![スクリーンショット 2020-11-07 12.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/0b305f01-3cb5-ada2-eb67-3094311a564d.png)
右上にある新規ビジネス用語 -> 新規ビジネス用語作成を押します。なお、今回はご紹介しませんが、ビジネス用語のファイルインポートも対応しています。

ビジネス用語名とそのビジネス用語が属するカテゴリーを選択します。また、そのビジネス用語の定義を記入し、ドラフトとして保存を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/89485aae-9322-4950-389b-1368896ae014.png)
ビジネス用語がドラフトとして保存されました。CP4DのWKCは、ビジネス用語は**公開済**と**ドラフト**の状態で管理されます。**ドラフト**の状態場合、ユーザーには見えない状態となっています。
ビジネス用語は、1次カテゴリーとしてメインのカテゴリーの他に、複数のカテゴリーに２次カテゴリーとして保存することができます。
これ以外にも、**関連用語**や**関連成果物**を設定することができますが、それは、[データカタログを使う（ビジネス用語 応用編）](https://qiita.com/takayuki-yamamoto/items/1ee9743bc0329491c945 "データカタログを使う（ビジネス用語 応用編)")でご説明したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/9094ebc8-0194-fedc-6ab7-11696c8de752.png)
必要な情報を設定したら、右上にある公開ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/3352395b-b1d4-c253-b169-62f322049875.png)
コメントを残して、公開するボタンを押すと、ビジネス用語がドラフト状態から公開済みとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571926/f6a838ff-0d1a-04db-315b-a06d83f7a8d9.png)
デフォルトの設定では、公開ボタンを押すと、そのまま公開済みになりますが、CP4DのWKCのワークフロー機能を利用すれば、適切な承認プロセスを経て、ビジネス用語を公開するようなフローを作成することもできます。

以上で、ビジネス用語を作成いたしました。
Rails６でRatyを使用して星評価機能を実装する


rails6でratyを使用して星での評価機能を実装。

まず、Jqueryを入れる
https://qiita.com/masahisa/items/eaacb0c3b82f4a11fc13

これを参考にjqueryを導入してください。
rails6になり、
$ yarn add jquery　の記述が忘れがちなので注意が必要です。

githubから星imageを保存
https://github.com/wbotelhos/raty/tree/master/lib/images
これを　app/assets/imagesに保存。

同じくgithubからjavascriptコードをコピー
rails6では app/assets/javascripts　というフォルダがないので、
app/assets　に　javascriptsというフォルダを作成。
配下にaplication.jsファイルも作成、そこにgithubからコピーしたコードを全て貼り付け。

app/assets/config/manifest.jsに

//= link_directory ../javascripts .js

を追加。

app/layouts/application.html.erbに

<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

を追加。

ここまでが環境設定。rails６以外では大きくやり方が異なるので注意下さい。
（６でもこのやり方が正解かは不明ですが、一応これで読み込むことはできました。）

以下機能の実装。

rateカラムを追加
※float型を推奨。星半分でも反映できる為。
私の場合はevaluationsテーブルに作成。投稿した記事の評価を星で実施。

rails g migration AddRateToEvaluations rate:float
　　　　　　　　　　↓
rails db:migrate

星評価機能を付けたいviewのformに

      <div class="form-group row" id="star">
        <%= f.label :rate,'総合評価', class:'col-md-3 col-form- 
        label' %>
        <%= f.hidden_field :rate, id: :review_star %>
      </div>

      <!-- 評価javascript -->
      <script>
      $('#star').raty({
        size     : 36,
        starOff:  '<%= asset_path('star-off.png') %>',
        starOn : '<%= asset_path('star-on.png') %>',
        starHalf: '<%= asset_path('star-half.png') %>',
        scoreName: 'evaluation[rate]',
        half: true,
      });
      </script>  

を記述。ポイントはhidden_fieldでidにreview_starを定義すること。
Js部分で保存した星の画像を読み込み。

コントローラでrateパラメータをpermitするのも忘れずに。
これで星で入力できる状態になるはずです。



一応、入力したデータを表示したコードも記載しておきます。
私の場合は、evaluationsテーブルにcommentカラムがあったり、postモデル、userモデルとアソシエーションが組まれている形なので、参考程度でお願い致します。


       <tbody>
        <% @evaluations.each do |evaluation| %>
        <tr>
         <td><%= evaluation.comment %></td>
         <td>
         <a href="/users/<%= evaluation.user.id %>">
        <%= evaluation.user.nickname %>
       </a></td>

          <!--星評価-->
        <td><div id="star-rate-<%= evaluation.id %>"></div>
          <script>
          $('#star-rate-<%= evaluation.id %>').raty({
            size: 36,
            starOff:  '<%= asset_path('star-off.png') %>',
            starOn : '<%= asset_path('star-on.png') %>',
            starHalf: '<%= asset_path('star-half.png') %>',
            half: true,
            readOnly: true,
            score: <%= evaluation.rate%>,
          });
          </script> </td>

          <% end %>
        <!--/星評価-->
      
        
      </tr>
  </tbody>
</table>


以上です。

https://gyazo.com/4e0cd5b4b5dc11d134bc65e6a7b7db74

こんなイメージです。rails6の記事がなく、６以外の記事を参考に無理やり作った形ですので、正解は違うと思います。
M5 Stackのボタン誤検出を防ぐ

#この記事でやった事
*M5 Stackのボタン押下誤検出が生じていたので、その対策
*M5 UI Flowで現象確認から防止策まで

#怪現象の発生
前回 [M5StackからLINE Notify発信]  (https://qiita.com/mokatsumo/items/ff173012c9cfeaa9c784)、を書きましたがこの時、しばらく放置しているとボタンを押していないのにLINEに通知が届く怪現象が発生していました。

色々試してみると、ボタンAだけこの現象が発生するようでした。
ノイズ等を拾いやすいのかAだけが瞬時押された状態になってそれを検出してしまうようです。

#現象の確認
ON状態になる時間が十分短ければ、実際のボタン押下と見分けられるはずです。下記コードでONの時間を簡易に確認してみました 。
![A81903E3-A9BF-46FA-9A15-80AAE037368F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/16370173-6afa-5e5e-7e21-294f61f773cd.jpeg)
各ボタンを押した回数と、最新の「押した時間の長さ(ms)」を表示します。

ボタンを押すとこうなります。左からボタン名、回数、時間(ms)です。
![46211D83-693C-43C8-BF2B-1DE89BFDC713.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/15fc0715-052b-aac9-4856-0fd36841db42.jpeg)
短く押してもだいたい50msくらいにはなるようです。

回数クリアして1時間放置してみると、
![06023AC2-C8DE-430F-A927-976C7557904A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/bda14a39-6637-243d-0903-d111fc9436f7.jpeg)
Aボタンに2回の検出がありました。時間は0ms以下、ごく短いようです。
10ms以下は誤検出として無視できそうですね。

#対策案
下記のように10ms以下を無視するようにして、再度放置してみました。
![B32427F7-6B12-46C6-9B1A-107D82A87F7B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/bf9be78c-01a4-2711-4b50-dce697191d6e.jpeg)

1時間経っても誤検出はなく、問題なさそうです。

#その後
最終的にはシンプルに10ms待ってからボタン再判定を入れる事でノイズ回避することにしました。1日放置しても誤検出ありません。

#さらにその後(2021.9.12)
M5 UIのファームウェア側で対策されたのか、Ver1.8.3アップデート以降は特に対策無しでも誤検出自体発生していません。よかったです。
Pardot のリード生成 (Pardot Lightning アプリケーション)　⇒　Pardot のフォームおよびフォームハンドラーの使用 (Pardot Lightning アプリケーション)

１．Pardot でプログレッシブプロファイリングの基盤として使用できるデータの種類はどれですか?
２．会社が Pardot 内で、フォームではなく、フォームハンドラを使用するのはどのような理由からですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/77492446-355e-ea2d-547e-ca1877c5ec1a.png)
axiosでIntegromatWebhookにアクセスするメモ

教えていただいたソース。そのままメモ。


```html:test.html
<button onclick="sendWebhook('ここに送りたいメッセージをいれます')">Notify</button>
```

```js:test.js
// この関数だけコピーして使ってください
// 引数に送りたいメッセージを入れます
async function sendWebhook(message) {
  // Integromatに送る
  try {
    // 以下のURLはご自身で取得したIntegromatのWebhookURLに置き換えてください
    // ?message= の部分も、パラメータを異なる名前にしたのであれば、適宜置き換えてください
    // Integromatのシナリオでは「Scheduling」をON、Immediatelyにしておいてください
    const res = await axios.get(`https://hook.integromat.com/xxxxxxxxxxxxxxxxxxxxx?message=${message}`);
    console.log(res.data);
  } catch (err) {
    console.error(err);
  }
}
```
【自主学習の記録 part1】GitLabの基本的な使い方その1

#概要
現場で使用しているGitLab等のサービスに関して、私自身の知識向上の為に自主学習した、内容や気付いた事等を掲載していきます。
今回は、GitLabの簡単な概要説明とプロジェクトの作成を掲載します。
初投稿なので、見苦しさ等あるかと思いますがご容赦ください。

#GitLabとは
GitLabとは、Gitという管理システムを用いたオープンソースのWebUIリポジトリマネージャーです。
Webからの管理が可能な為、コマンドラインの操作が苦手な方でも比較的扱い安いと思います。

GitLabには開発プロジェクトを管理する為の様々な機能が備わっており、プロジェクト(リポジトリ)のリモートブランチの管理やマージといったリポジトリの基本機能から、グループの管理、コミットやマージ等の履歴、開発プロジェクトの課題管理等、開発プロジェクト自体の管理機能も豊富に備わっているようです。
このあたりの各種機能については、今後少しずつ掘り下げていけたらと思います。

##プロジェクトの作成
まずは、GitLabにてプロジェクトを作成します。
ちなみに私の場合は、ローカル環境にVMware Workstation PlayerにインストールしたCentOSへGitLabのCE版をインストールし使用していますが、特に理由がなければこちらの[GitLabサインインページ](https://gitlab.com/users/sign_in "GitLabサインインページ")からアカウントの新規発行または他の提携サービスの既存アカウントを使用してサインインでも良いかと思います。

GitLabにサインインしましたら、トップページから「新規プロジェクト」をクリックします。
![GitLab_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/b7f77145-c217-3266-4a63-2454cdcbe0da.png)
プロジェクトの作成ページにて、「My awesome project」内に任意のプロジェクト名を入力します。
可視レベルの「プライベート」は、作成するプロジェクトに対してアクセスを許可するGitLabユーザーを手動で追加する必要があります。
そのため、プロジェクトに登録されていないユーザーからは見えませんので、3種類の可視レベルの中ではセキュリティレベルが最も高いといえます。
「内部」と「パブリック」については以下の画像の説明通りです。
設定が完了しましたら、「プロジェクトを作成」をクリックします。
![GitLab_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/4273ffec-893b-647b-a36f-ef39df0ddf79.png)
プロジェクト作成後、以下の様な画面に移ります。
以上でプロジェクト作成は完了しましたが、SSHキーを追加しないとSSH経由でプッシュ・プル出来ませんというメッセージが表示されています。
一応HTTP経由でプッシュ・プルは可能なのですが、折角なのでSSH経由でのプッシュ・プルが出来る様に設定してみます。
![GitLab_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/23f28141-702e-ce2f-a044-16dc38439709.png)

###SSH認証鍵の設定
プロジェクト画面にある「SSH鍵を追加」をクリックすると、以下の画面に移ります。
画面内に、SSH公開鍵を入力する欄がありますので、現在使用している端末のSSH公開鍵を入力します。
私の場合はWindowsなので、WindowsのSSH鍵生成方法を紹介します。
![GitLab_04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/13b50f0e-bda3-18f3-262d-37fb4353f7e9.png)
Windows端末にて、PowerShellを起動し、以下のコマンドを実行します。
なお、ファイル名やパスフレーズの入力等を要求されますが、そのままエンターで構いません。
```ssh-keygen```
コマンド実行後、さらに以下コマンドで「.ssh」ディレクトリに移動します。
```cd .ssh```
「.ssh」ディレクトリ内に「id_rsa」ファイルと「id_rsa.pub」ファイルが作成されていると思いますが、GitLabに登録するSSH公開鍵は「id_rsa.pub」ファイルとなります。
**「id_rsa」ファイルは公開してはいけない秘密鍵です。**

作成したSSH鍵は、`C:\Users\<ログインユーザー名>\.ssh`フォルダにありますので、エクスプローラーで移動します。
(プライベート用端末なので、一部の項目をボカしています・・・)
![GitLab_05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/061e27a3-7610-03b4-0819-e6eb25912959.png)

「id_rsa.pub」ファイルを選択して右クリックし、「プログラムから開く」を選択、任意のテキストエディタを選択して開きます。
または予めテキストエディタを起動して、「id_rsa.pub」ファイルを直接ドラッグ・ドロップでも良いです。

「id_rsa.pub」ファイルを開きましたら、中身を全てコピーします。
コピーしましたら、GitLabの画面に戻り、「典型的には～」と書いてある場所に貼り付け、「キーを追加」ボタンを押下します。
タイトルはSSH公開鍵を貼り付けると自動で入力されますので、入力不要です。
![GitLab_04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/13b50f0e-bda3-18f3-262d-37fb4353f7e9.png)
SSHの設定が完了すると以下の様な画面になります。
これで完了です。
![GitLab_06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/18a4da71-6aec-6afe-694a-5b67e05b8787.png)
今回は以上とさせて頂きます。
次回は作成したプロジェクトに何らかのファイルをアップロード(プッシュ)したいと思います。
kubectl apply時に無理やり変数を利用する

helmに書き直さないと、、、と思ったけど大丈夫そうだった

## マニュフェストファイル

```nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: $$NAME
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
```

## 実行

```bash
cat nginx-pod.yaml | sed s/\$\$NAME/nginx-test/ | kubectl create -f -
```

## 起動確認

```
yuta:~ $ kubectl get pod nginx-test
NAME         READY   STATUS    RESTARTS   AGE
nginx-test   1/1     Running   0          78s
yuta:~ $ 
```
ATmega328PにArduinoスケッチを書き込む

##書き込み回路

ArduinoとATmega328Pとの配線です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445338/8a529aba-4210-b8fc-6945-bfd15ca220da.png" alt="ATmega328P書き込み回路" width=50%>

##Arduino IDEの設定

１．ファイル → 環境設定 を開き、
　　追加のボードマネージャのURLに以下を追記

```text:追加のボードマネージャのURL
https://raw.githubusercontent.com/carlosefr/atmega/master/package_carlosefr_atmega_index.json
```

２．ツール → ボード → ボードマネージャ を開き、
　　atmega328と検索し、Barebones ATmega Chips (no bootloader) のインストールをクリック

３．閉じるをクリック

これでボードのインストール完了です。

## Arduino UnoにArduinoISPを書き込む

１．ファイル → スケッチ例 → ArduinoISP → ArduinoISPを選択

２．ツール → ボード → Arduino AVR Boads → Arduino Uno を選択

３．スケッチ → マイコンボードに書き込む をクリック

これでArduino UnoにArduinoISPの書き込みができました。

##サンプルプログラム

###Lチカのプログラム

```c++:blink.ino
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}
```

###回路

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445338/1149313f-85cb-3ae4-9d7e-521704de8503.png" alt="ATmega328P Lチカ回路" width=50%>

## 書き込み

１．ツール → ボード → ATmega Microcontrollers → ATmega328p を選択

　　クロック周波数を内部8MHzにする場合は、
　　ツール → ボード → Clockを8 MHz (internal) を選択

２．ツール → 書込装置 → Arduino as ISP を選択

３．ツール → ブートローダを書き込む をクリック

４．スケッチ → マイコンボードに書き込む をクリックして、書き込みができます。
コンソールログをhtmlに埋め込むメモ

埋め込みたい位置に、下記を差し込み

```html:test.html
<div id="console_log"></div>
```

script内にこれ。

```js:test.js
console.log = function (log) {
document.getElementById('console_log').innerHTML = log;
}
```

※連続して出力したい場合はこれ

```js:test.js
console.log = function (log) {
document.getElementById('console_log').innerHTML += log + "<br>";
}
```
静岡のGoToEat公式サイトをスクレイピング

# はじめに

[静岡のGoToEat公式サイトをスクレイピング、伊豆のキャンペーン対象店をリスト化する](https://qiita.com/andy2017/items/21e52492eaca9f27404c)

の記事の中に

```python
import urllib.request
html = urllib.request.urlopen(url).read()
```

> 検索条件の指定が効かず同じページばかり表示されてしまう事象が発生。
> ブラウザで同じURLを開く場合も新規と２回目で表示内容が異なる。どうやらSessionを判断している様子。

ということなので調べてみた

# URLが変わる

「伊豆市」検索直後のページ
https://premium-gift.jp/fujinokunigotoeat/use_store?events=search&id=&store=&addr=%E4%BC%8A%E8%B1%86%E5%B8%82&industry=

次へ（2ページ目）
https://premium-gift.jp/fujinokunigotoeat/use_store?events=page&id=2&store=&addr=%E4%BC%8A%E8%B1%86%E5%B8%82&industry=

戻る（1ページ目）
https://premium-gift.jp/fujinokunigotoeat/use_store?events=page&id=1&store=&addr=%E4%BC%8A%E8%B1%86%E5%B8%82&industry=

検索直後のページと戻る（1ページ目）との違いが「events=search」と「events=page」、「id=」と「id=1」でURLが変わっているみたい

戻る（1ページ目）と次へ（2ページ目）との違いが「id=1」と「id=2」なのでidがページ数とわかりました

# アクセス

試しに戻る（1ページ目）のURLからスタートすると検索結果が反映されていないので表示内容が違うため

1. 「伊豆市」検索直後のページのURLにアクセス
2. 戻る（1ページ目）のURLにアクセス

の順番でアクセスするといけるようです

次のページのURLはheadのlinkのなかにURLが見つかりましたのでそちらを利用、
試しに検索直後のページから次のページを取得していくと「id=2」次は「id=22」次は「id=222」と
2が増えたページが返ってきます（ｗ

# スクレイピング

```python
import requests
from bs4 import BeautifulSoup

import time

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
}

with requests.Session() as s:

    # 全部取得する場合はサーチは不要
    # url = "https://premium-gift.jp/fujinokunigotoeat/use_store"

    # 検索の場合はサーチページを一旦表示してからアクセス
    s.get("https://premium-gift.jp/fujinokunigotoeat/use_store?events=search&id=&store=&addr=%E4%BC%8A%E8%B1%86%E5%B8%82&industry=")
    url = "https://premium-gift.jp/fujinokunigotoeat/use_store?events=page&id=1&store=&addr=%E4%BC%8A%E8%B1%86%E5%B8%82&industry="

    result = []

    while True:

        r = s.get(url, headers=headers)
        r.raise_for_status()

        soup = BeautifulSoup(r.content, "html.parser")

        for store in soup.select("div.store-card__item"):

            data = {}
            data["店舗名"] = store.h3.get_text(strip=True)

            for tr in store.select("table.store-card__table > tbody > tr"):
                data[tr.th.get_text(strip=True).rstrip("：")] = tr.td.get_text(
                    strip=True
                )

            result.append(data)

        tag = soup.select_one("head > link[rel=next]")

        print(tag)

        if tag:

            url = tag.get("href")

        else:
            break

        time.sleep(3)
```

```python
import pandas as pd

df = pd.DataFrame(result)

# 登録数確認
df.shape

df.to_csv("shizuoka.csv", encoding="utf_8_sig")

# 重複確認
df[df.duplicated()]

df
```
[Django] aws cloud9環境でpython manage.py実行したらsqliteのバージョンエラー

今までmac上でdocker環境を立ち上げてDjangoの学習をしていましたが、cloud9で行う記事を見てawsの勉強になるかもしれないと考えcloud9を試してみました。ただコードを書く前のmanage.pyの実行でエラーしてしまい解決するまで時間がかかったのでメモを残します。

環境 : aws cloud9のamazon linux2

```text:/etc/system-release
$ cat /etc/system-release
Amazon Linux release 2 (Karoo)
```
```
$ python manage.py startapp blog
Traceback (most recent call last):
  File "manage.py", line 21, in <module>
・・・略・・・
   raise ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version)
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17)

$ python -V
Python 3.7.9

$ sqlite3 --version
3.33.0 2020-08-14 13:23:32 
```
バージョンは問題なさそう。

```
$ which sqlite3
/home/linuxbrew/.linuxbrew/bin/sqlite3

$ /usr/bin/sqlite3 --version
3.7.17 2013-05-20 00:56:22 
```
コマンドラインからはlinuxbrew配下のsqlite3が見えているがpythonからは/usr/bin/sqlite3が見えている？
調べるとsqlite3が古いから最新版をインストールする記事が多かったが、その中で最新版インストール先のlibをLD_LIBRARY_PATHに設定するというの記事があったので真似してみた。

```
export LD_LIBRARY_PATH=/home/linuxbrew/.linuxbrew/lib:${LD_LIBRARY_PATH}
```
無事manage.pyの実行ができました。linuxbrewは知りませんでしたがhomebrewのlinux版
。LD_LIBRARY_PATHも設定しておくと良いと見つけた記事にありましたが、cloud9ではlinuxbrewはインストールされているがLD_LIBRARY_PATHは設定されていないようでした（.bashrcへの記述はなかった)。

\### LD_LIBLARY_PATHを設定しないといけないのはなんとなくわかるが何で必要かよくわかっていない。

参考
https://qiita.com/rururu_kenken/items/8202b30b50e3bfa75821
https://qiita.com/thermes/items/926b478ff6e3758ecfea
PyCharmでCmderを使う方法(Windows)

ご覧下さりありがとうございます。
掲題の件について、私が取り組んだ際に日本語で得られる情報の乏しさを感じたため、以下記事として記します。

## 手順

1. 環境変数の追加
    - コントロールパネル→システム→システムの詳細設定→環境変数　と進み、ユーザーの環境変数として「CMDER_ROOT」、値(パス)にはCmder.exeの格納ディレクトリを記入(大抵は「C:\hogehoge\cmder」のはず)
2. PyCharmの設定を変更
    - PyCharmのSettings→Terminalに進み、Shell Path欄に「"cmd.exe" /k ""%CMDER_ROOT%\vendor\init.bat""」と入力する(ダブルクオーテーション二重は誤植ではありません)
3. PyCharm再起動→Alt + F12でCmderが起動する(≒Linux系のコマンド[lsなど]が通る)ことを確認

## 参考
- https://stackoverflow.com/questions/8713960/cmd-exe-k-switch
- https://github.com/cmderdev/cmder/issues/282


(以上)
AmazonConnectハンズオン復習

#まずは事例から
琉球銀行
![スクリーンショット 2020-11-08 20.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/b5dded38-cf49-22f6-2df3-5a15ff757600.png)

#AWSエコシステム
![スクリーンショット 2020-11-08 21.09.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/5ac4047f-7cbc-21ca-a518-44607f24cb3a.png)


##AWS Cloudwatch
###Cloudwatch
![スクリーンショット 2020-11-08 20.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/41f853b2-a60a-a00f-10f7-d24e75063e68.png)
####個人的に注目
* LongestQueueWaitTime— 問い合わせがキューで待機した最長時間 (秒数) です。これは、CloudWatch ダッシュボードで選択された更新間隔 (1 分または 5 分など) 中にキューでの待機した時間の長さです。
* QueueSize— キュー内にある問い合わせの数です。この値は、ダッシュボードが アクセスされた時点でのキュー内のコンタクト値の数を反映し、報告間隔の期間に 対するものではありません。

クイックサイトで視覚化する際にキューにどれだけ待機があるかわかりそうなので一旦上をメモ
普通にCloudWatchのグラフで良いかも

###CloudWatch Logs
![スクリーンショット 2020-11-08 20.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/51ecbaf4-a2e9-cab5-23b6-8c089a04fbd3.png)

####ログモニタリングのイメージ
![スクリーンショット 2020-11-08 21.00.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/4b7d24b0-bc32-2243-6636-316f94cfa76a.png)

#アマゾンコネクトの守備範囲
![スクリーンショット 2020-11-08 21.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/eb2e546c-9a9d-4364-ac91-355d4431386b.png)

#設計の仕方
![スクリーンショット 2020-11-08 21.22.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/f4f015c3-842e-5833-7cc4-5cc56b821542.png)

* インスタンス
    * アマゾンコネクトを構築するときに全体必要
* 電話番号
    * 着信者課金か発信者課金が選べる
    * 次の問合せフローに絶対紐付けが必要
* 問合せフロー
    * これは共通
    * たくさん種類がある

![スクリーンショット 2020-11-08 21.27.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/663b11db-e8f8-a98f-db1f-9e50c181ec11.png)

* フローまとめ
    * 顧客キューフロー
        * キューとエージェントの間のフロー
    * 顧客保留フロー
        * 保留になったときに入るフロー
            * 保留に入った時の動作を設定しなければならない？
    * エージェント保留フロー
        * エージェント側の保留フロー
    * エージェントウィスパーフロー
        * 意味不明
    * アウトバウンドウィスパーフロー
        * これ人間が話しているからフロー必要？
    * エージェント転送フロー
        * 転送時のやつ
    * キューへの転送フロー
        * お客さんが間違えてエージェントまで繋がったときにエージェントから別の自動音声案内へ飛ばす用

* キュー
    * ここで分岐のイメージ
* ルーティングプロファイル
    * エージェントに振る役割
* エージェント
    * コールセンターで働く人間

#クイック接続
CCPから転送するときに使う

* 外部
    * 外部番号に転送
* エージェント
    * 問合せフローの一部としてエージェントに転送
* キュー
    * 問合せフローの一部としてキューに転送

#エージェント階層
* エージェントをチームや組織に合 わせてを分割すること可能(階層 は最大 5 つ)
階層は、レポートおよび過去のメ トリクスに反映され、細分化され たレポートが可能になります。

#スキルレベルに応じたルーティングをする場合
【Ruby】メソッドの引数の個数についての疑問と検証

## 背景

```ruby
method1 a b, c
```
となっている場合、cはどのメソッドの引数になっているでしょうか？

Ruby ってメソッドの引数にカンマやカッコをつけなくても良いのです。
ただ、このシステムの場合、不具合が起こると思うのです。
そこで、今回はそれを実際に試してみて検証しました。
下記の疑問について、なかなか記事がなくて不思議に思っていました。

## 問題がありそうな場面　

例えば、

* パターン１

```ruby
method1 a, b
```
は

```ruby
method1(a, b)
```
という意味ですよね(methodって名前でメソッドを定義しようとしたらエラーになったので、method1としています。。)。

* パターン2

```ruby
method1 a b
```
は

```ruby
method1(a(b))
```
という意味ですよね。
ここまでは良いです（この時点で既にちょっと違和感がありますが。。初心者にはきついです。。）

## ここで疑問

```ruby
method1 a b, c
```
って、２つ可能性がないでしょうか？

* 可能性1

```ruby
method1(a(b),c) 
```
と

* 可能性2

```ruby
method1(a(b,c)) 
```

の両方の可能性です。

* 前者はcがmethod1の第二引数　で、
* 後者はcがaの第二引数です。

ここで、確認するべきなのは、

* method1 のとる引数の数　と
* a のとる引数の数 

です。単純にこれだけは確認する必要があります。（この時点で読む側からしてはきついです。）
ただ、可変長引数の場合はどうするのでしょうか？
おそらく、どちらかが優先されるのですが。。

では、上記のどちらのパターンになるのか検証してみます。

## 検証

```ruby
def a *temp
  p "aの引数の個数は"
  p temp.size
end

def method1 *temp
  p "method1の引数の個数は"
  p temp.size
end
```
結果は、、、

```ruby
method1 a 1, 2
# "aの引数の個数は"
# 2
# "method1の引数の個数は"
# 1
```
つまり、上記は

```ruby
method1(a(1, 2))
```
と受け取られました。
上記の可能性２が採用されているようです。
深層学習 Day 1 - Section 2 活性化関数 のまとめ

この記事は個人的なお勉強用のメモです。

# このお勉強の位置

深層学習 Day 1

Section 0 ニューラルネットワークの全体像
Section 1 入力層～中間層
**Section 2 活性化関数**　←　これ
Section 3 出力層
Section 4 勾配降下法
Section 5 誤差逆伝播法

# 講義

## 活性化関数

### 活性化関数の式

```math
f^{(l)}(u^{(l)})=\Big[f^{(l)}(u_1^{(l)}) .. f^{(l)}(u_j^{(l)})\Bigr]
```

$f$：活性化関数
$u$：総入力
$l$：何層目か

活性化関数 $f$ は総入力 $u$ を引数にとる。
活性化関数は非線形な関数。
※ 活性化関数が線形な関数だと2つの層の数式をまとめることができてしまい、
　もはや中間層の意味がなくなる、とのこと。

### 活性化関数の種類

- **中間層**用
 - ReLU関数（れる、と読む）
 - シグモイド（ロジスティック）関数
 - ステップ関数

- **出力層**用
 - ソフトマックス関数
 - 恒等写像
 - シグモイド（ロジスティック）関数

### ステップ関数

サンプルコード

```python
def step_function(x):
  if x > 0:
    return 1
  else:
    return 0
```

数式

```math
f(x) = \left\{
\begin{array}{ll}
1 & (x \geq 0) \\
0 & (x \lt 0)
\end{array}
\right.
```

以前は使われていたが、現在は使われていない。

余談だが、上記のサンプルコードと数式は一致していないと思う。
$x$ が $0$ のときサンプルコードでは $0$ を返すが、
数式では $1$ を返す。

手元にある『ゼロから作る Deep Learning』の 3.1.2 項では、
$x$ が $0$ のときステップ関数は $0$ を返す関数として
数式が書かれている。3.2.2 項に書かれているソースコードも同様。
つまり、数式とソースコードが一致している。

### シグモイド関数

サンプルコード

```python
def sigmoid(x):
  return 1 / (1 + np.exp(-x))
```

数式

```math
f(u) = \frac{1}{1+e^{-u}}
```

0から1の間の値を返す。
右肩上がり。
微分可能
よく使われる。

課題：勾配消失問題を起こす。

### ReLU関数

サンプルコード

```python
def relu(x):
  return np.maximum(0, x)
```

数式

```math
f(x) = \left\{
\begin{array}{ll}
x & (x \gt 0) \\
0 & (x \leq 0)
\end{array}
\right.
```

今最もよく使われている。
勾配消失問題が起きない。
良い意味でスパース化する（0より小さい値を0にするので）。

### 活性化関数の効果

- 重み $W$ での計算は線形、活性化関数 $f$ は非線形なので、バラエティーに富むモデルを作れる。
- 一部の出力は弱く、一部は強く伝播される。
- 学習が進んで、特徴をつかんでいく。

# 実装演習

実装演習での活性化関数は、functions.py ファイルにまとめられている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/65c70fa3-1632-c790-ec3f-bff80347b78b.png)

どの関数もシンプルな実装になっており、
PythonがAIの実装に最適とよく言われることに
納得できる。

# 確認テスト

### 線形と非線形の違い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/d9e89dda-0d27-b8c6-76c4-c840d1658fea.png)

線形は比例である。
非線形は比例ではない。

線形な関数
- 加法性：$f(x+y)=f(x)+f(y)$
- 斉次性：$f(kx)=kf(x)$

非線形な関数は上の2つを満たさない。

### 該当するソースコード

$z = f(u)$ に該当するソースコード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/bb4ce47a-f1a0-ae24-4f39-9512e224ecd1.png)

上記の 2つのfunction.relu(...) の部分。

# 修了テスト～練習問題～

### 問題81（ReLU関数）

数式

```math
h(x) = \left\{
\begin{array}{ll}
x & (x \gt 0) \\
0 & (x \leq 0)
\end{array}
\right.
```
深層学習 Day 1 - Section 1 入力層～中間層 のまとめ

この記事は個人的なお勉強用のメモです。

# このお勉強の位置

深層学習 Day 1

**Section 0 ニューラルネットワークの全体像**　←　これと
**Section 1 入力層～中間層**　←　これ
Section 2 活性化関数
Section 3 出力層
Section 4 勾配降下法
Section 5 誤差逆伝播法

# 講義

## ニューラルネットワークの全体像

識別モデル（情報を与えると、例えば分類をするモデル）

- 入力層  
体長、体重、etcといった数値
- 中間層  
学習する部分（重み $W$ やバイアス $b$）
- 出力層  
犬、猫、ネズミかどうかの確率で出力

入力は数値。出力も数値。
出力値を正解値と比較する（誤差関数で誤差を求める）。
正しいかどうかをフィードバックして、$W$ と $b$ を更新する。

## できること

- 回帰
- 分類

SVMもそうだが、ニューラルネットワーク（NN）は万能。

4層以上の中間層を持つNNを深層NNモデルという。

## 実用例

- 自動売買  
入力：数値、出力：数値
- チャットボット、翻訳  
入力：文章、出力：文章（文章を数値で解釈する）
- 音声解釈  
入力：音声、出力：文字列（音声や文字列を数値で解釈する）
- 囲碁、将棋  
入力：盤面の情報、出力：次の手（盤面の情報や次の手を数値で解釈する）

つまり、NNではすべて数値として処理する。

## 入力層と中間層

登場人物
- 入力：$x_i$
- 重み：$w_i$（傾き）
- バイアス：$b$（入力の全体をずらす役割、切片）
- 総入力：$u$
- 出力：$z$
- 活性化関数：$f$

```math
\begin{align}
u&=w_1x_1+w_2x_2+w_3x_3+w_4x_4+b\\
&=Wx+b
\end{align}
```

```math
z=f(u)
```

動画の講義では、(0, 0) を通る直線を2つ書いて、
2つの直線の間の傾きが $w$ という話をしているが
普通に考えると、$w$ は他の直線からの相対的な傾きではなく、
x軸からの絶対的な傾きだと思う。

# 実装演習

1_1_forward_propagation_after.ipynb

```python
# 入力値
x = np.array([2, 3])
print_vec("入力", x)


# 総入力
u = np.dot(x, W) + b
print_vec("総入力", u)
```

総入力を求めるための、入力データと重みとの掛け算は、np.dot 関数を用いる。
※新しいバージョンのPythonでは、np.dot関数だけでなく、@ 演算子でも同様の掛け算ができるとのこと。
　@ 演算子は、Python 3.5, NumPy 1.10.0以降で利用可能。

# 確認テストについての考察

### やろうとしていること

中間層で重み $W$ やバイアス $b$ を学習すること。
出力層で正しい値（確率）を出力すること。

↑ そこまで外した解答ではなかった。

模範解答
明示的なプログラムの代わりに多数の中間層を持つ
ニューラルネットワークを用いて、入力値から目的とする
出力値に変換する数学モデルを構築すること。

重みやバイアスを自力で調整することで目的の値を得る。

「自力で調整」というのは、深層学習ならではなのだろうか。
（機械学習でも $w$ を微分で求めたり勾配降下法で求めたりはした）

### ネットワークの図

問
入力層：2ノード1層
中間層：3ノード2層
出力層：1ノード1層

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/27492f98-4e58-a824-dd2e-1ee9909e1068.png)

正直なところ、上の図を描いたが、不正解。
模範解答は、中間層が2層になっていて、それぞれの層に3ノード存在する図になっている。
中間層は合計6ノード。

自分は「中間層：3ノード2層」を、中間層のノードの総数が3ノードと解釈してしまった。
これは誤った考えなのだろうか。
とはいえ、中間層の2層目が1ノードしかなく、それがそのまま出力層に渡っているので
この中間層の2層目は現実的には意味が無いような気がしている。

### 図に動物分類の実例を記入

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/70e15dcd-eaa5-2648-3d99-952c210fa099.png)

「鳴き声の大きさ」を記入してみたが、音声付きの動画を入力と考えるならば
おそらく解答を大きく外してはいないだろう。

### 総入力を求めているソース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/362c17f1-312e-cd38-61c9-699031387b7c.png)

W：2行1列
x：1行2列
b：スカラー？（手元のソースだと b = np.array(0.5)だが、講義動画では b = 0.5 になっている）

np.dot関数でベクトルの内積を求める。

### 中間層の出力を定義しているソース

「順伝播（3層・複数ユニット）」から抜き出す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/9f5efe69-2eae-db68-6cbd-286f69685824.png)

↑　自分の解答
（「中間層の出力を定義」というのが正確に把握しづらい。）

正解は、

```python
z2 = functions.relu(u2) 
```

だけでなく、その1行上の

```python
u2 = np.dot(z1, W2) + b2
```

も、だそう。
（「出力を定義」なので、出力部分だけが正解、というわけではないのか。）


# 演習問題

「修了テスト～練習問題～」に入力層～中間層の問題は存在しなかった。
代わりに、参考図書の記載。

『ゼロから作るDeep Learning』（オライリー・ジャパン）
3章 ニューラルネットワーク
3.1 パーセプトロンからニューラルネットワークへ
3.3 多次元配列の計算
3.4 3層ニューラルネットワークの実装

この辺りの記述が、今回のお勉強と非常に似ている。
TSQLの解析5 SELECT INTO文からの更新対象テーブル名の取得

# TSQLScriptDomParser
- 実行例

```batchfile
sqlparser -o xml -i -s "select * into db2.sch2.tab2 from db1.sch1.tab1" > out.xml
query -s:out.xml "-qs://node[@class='SelectStatement']/children[@type='Into']/node[@class='SchemaObjectName']" !indent=true
```

- 出力例

```xml
<?xml version="1.0" encoding="UTF-8"?>
<node token="db2.sch2.tab2" class="SchemaObjectName" value="">
   <children type="DatabaseIdentifier">
      <node token="db2"
            class="Identifier"
            value="db2"
            QuoteType="NotQuoted"/>
   </children>
   <children type="SchemaIdentifier">
      <node token="sch2"
            class="Identifier"
            value="sch2"
            QuoteType="NotQuoted"/>
   </children>
   <children type="BaseIdentifier">
      <node token="tab2"
            class="Identifier"
            value="tab2"
            QuoteType="NotQuoted"/>
   </children>
   <children type="Identifiers">
      <node token="db2"
            class="Identifier"
            value="db2"
            QuoteType="NotQuoted"/>
      <node token="sch2"
            class="Identifier"
            value="sch2"
            QuoteType="NotQuoted"/>
      <node token="tab2"
            class="Identifier"
            value="tab2"
            QuoteType="NotQuoted"/>
   </children>
</node>
```

- 解釈

|項目|値|
|:--|:--|
|データベース名|/node/children[@type='DatabaseIdentifier']/node のvalue属性|
|スキーマ名|/node/children[@type='SchemaIdentifier']/node のvalue属性|
|テーブル名|/node/children[@type='BaseIdentifier']/node のvalue属性|

# ANTSQLParser 
- 実行例

```batchfile
sqlparser -o xml -i -s "select * into db2.sch2.tab2 from db1.sch1.tab1" > out.xml
query -s:out.xml -qs://node[@rule='select_statement']/node[@rule='query_expression']/node[@rule='query_specification']/node[@token='INTO']/following-sibling::node[@rule='schema_object_name'] !indent=true
```

- 出力例

```xml
<?xml version="1.0" encoding="UTF-8"?>
<node token="" rule="schema_object_name" value="db2.sch2.tab2">
   <node token="" rule="database_name" value="db2">
      <node token="" rule="id" value="db2">
         <node token="" rule="simple_id" value="db2">
            <node token="ID" rule="" value="db2"/>
         </node>
      </node>
   </node>
   <node token="'.'" rule="" value="."/>
   <node token="" rule="schema_name" value="sch2">
      <node token="" rule="id" value="sch2">
         <node token="" rule="simple_id" value="sch2">
            <node token="ID" rule="" value="sch2"/>
         </node>
      </node>
   </node>
   <node token="'.'" rule="" value="."/>
   <node token="" rule="table_name" value="tab2">
      <node token="" rule="id" value="tab2">
         <node token="" rule="simple_id" value="tab2">
            <node token="ID" rule="" value="tab2"/>
         </node>
      </node>
   </node>
</node>
```

- 解釈 
 
|項目|値|
|:--|:--|
|データベース名|/node/node[@rule='database_name']//node[@token='ID']のvalue属性|
|スキーマ名|/node/node[@rule='schema_name']//node[@token='ID']のvalue属性|
|テーブル名|/node/node[@rule='table_name']//node[@token='ID']のvalue属性|
Ruby on Rails　基礎

Rubyと同じく個人用

間違っていたら教えて頂きたい。


##開発環境
AWS Cloud9

##Ruby on Railsスタート

基本的にはLaravelと同じでMVCの考え方で大丈夫らしい。

###環境構築

```terminal
$ gem install rails -v 5.2.4
$ rails new app_name
```

###コントローラ作成

コントローラ名はなるべく複数形
てかだいたい複数形

場所は
~/home/ec2-user/environment/アプリ名/app/controllers

```terminal
$ rails g controller コントローラ名
```

###コントローラアクション付きコマンド

```terminal
$ rails g controller コントローラ名 アクション名
$ rails g controller todolists home
```

###コントローラ削除

```terminal
$ rails d controller コントローラ名
```
###ルーティング設定

ルーティングに対しての考え方はLaravelと同じ

結構何でも支配している、司令室みたいなところ

```ruby
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  get 'home' => 'tops#home'
#URLでhomeのところに来たら、 topsコントローラのhomeアクションをかますよ！って意味
end
```

###ビュー設定

~/app/view/名前のところに先ほど指定したファイル(home.html.erb)を作ればいいだけ


htmlやら何やらのUIは頑張るしかない


###サーバー起動方法

下記のどっちか

```terminal
$ rails server
 $ rails s
```

エラーメッセージについてはいつかまとめる。


###モデル作成

データベース関連と一瞬で繋がっちゃうすごいやつ。

詳しくは調べてみてくださいね(フレームワークの醍醐味だから)

```terminal
$ rails g model モデル名
```

単数形、最初大文字

4つファイルが出てきたらOK

###マイグレーションファイル作成

もうLaravelではおなじみのアレ

テンプレート的なのを貼っておきます

```ruby
class CreateLists < ActiveRecord::Migration[5.2]
  def change
    create_table :lists do |t|
      t.string :name
      t.string :contents
      t.timestamps
    end
  end
end

```

###マイグレートする

マイグレーションファイルにあるものをデータベースに反映するための呪文


```terminal
$ rails db:migrate
```

###マイグレート後のカラム追加

```terminal
$rails g migration Addカラム名Toテーブル名 カラム名:型名
$rails g migration AddIdToLists Id:int
```

###マイグレート後のカラム削除

```terminal
$rails g migration Removeカラム名Fromテーブル名 カラム名:型名
$rails g migration RemoveIdFromLists Id:int
```

まぁ英語を考えればわかりやすいよな


でもここまでやって俺は思った。
データベースって作成したっけ？？
あれれれれ？

あとあと調べてみると、僕が普段使っていたMySQLではなくRubyonRailsはデフォルトでSQLiteを使用しているらしい…(道理でMysql探しても見当たらなかったわけだ)

ちなみにデータベースは


```terminal
$rake db:create
```
これでできるらしい

とはいえまだまだ謎だらけ、勢いあまりすぎたかな…？

随時更新していきますね。
Autowareを動かしてみた

# 概要
2019年2月に刊行された Autoware の書籍がある。

 - [Autoware 自動運転ソフトウェア入門 (リックテレコム)](http://www.ric.co.jp/book/contents/book_1187.html)
 - [Autoware :自動運転ソフトウェア入門 (日本語) 単行本（ソフトカバー） - 2019/2/3](https://www.amazon.co.jp/Autoware-%E8%87%AA%E5%8B%95%E9%81%8B%E8%BB%A2%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E5%AE%89%E7%A9%8D-%E5%8D%93%E4%B9%9F/dp/4865941878) (Amazon)

2020年10月に、これを見ながら、PCにインストールしてAutowareを動かしてみた。

やってみた限り、書籍記載の推奨環境で、インストール手順通りにやってもAutowareの動作までは辿りつけなかった。

書籍では、動作に必要なソフトウェアのバージョン指定が無い為、最新の環境でインストールするとバージョンの組み合わせの問題で動作できない。

また、書籍記載のgithubのリポジトリには必要なファイルが存在していなかった。

## 書籍記載の推奨環境とインストール手順

### 推奨環境
 - Ubuntu 16.04 LTS
 - Intel Core i7 (8コア)
 - メモリ 16GB以上
 - ストレージ 30GB以上のSSD
 - GPU NVIDIA GeForce GTX 980M かそれ以上のもの

### インストール手順

 - 古いDockerのアンインストール
 - Docker CE のインストール(バージョン指定無し)
  - 動作確認(hello-world)
 - NVIDIA Dockerのセットアップ(バージョン v1.0.1)
  - 動作確認
 - Autoware Dockerのセットアップ(1.8.0-kinetic)
  - リポジトリ https://github.com/CPFL/Autoware.git

## 私の環境とインストール手順

### 推奨環境
 - Ubuntu 16.04 LTS
 - Intel Core i7 (8コア)
 - メモリ 16GB以上
 - ストレージ SSD 128GB
 - GPU NVIDIA Quadro P400

### インストール手順
 - 古いDockerのアンインストール
 - Docker CE のインストール(17.12.1)
  - 動作確認(hello-world)
 - 自ユーザをdockerグループに追加して、自ユーザからdockerを起動できるようにする
 - NVIDIA Dockerのセットアップ(バージョン v2.0.3)
  - 動作確認
 - Autoware Dockerのセットアップ(1.12.0-kinetic)
  - リポジトリ https://gitlab.com/autowarefoundation/autoware.ai/docker.git

# 参考

 - [Autoware Docker環境の構築](https://qiita.com/kameyama-eiji/items/0b3f914dbe03a83a1231)
  - 上記が最も参考になった。
 - [nvidia-docker2のインストール（On Ubuntu 16.04 LTS）](https://qiita.com/spiderx_jp/items/32c421fd00c6ade19720)
  - nvidia-docker2のインストールについて参考になった


# 詳細

https://document.wurlyhub.com/html/Autoware.html
[Rails6]RansackとGutentagを使ったタグの検索機能を実装する際につまずいたところ

##この記事について
タグ付け機能を実装したRailsのアプリケーションにタグ名の検索機能を実装しようとしたところ、つまずいた部分があったのでその解決策をまとめました。

##環境
Rails6 (6.0.1)
ruby 2.7.0

##参考
[Rails6でブログのタグのacts-as-taggable-onがエラーになったので別のタグgem(gutentag tags)を使う](https://qiita.com/jin-jar-ale/items/ee0e9e008ae8347eb44c)
[Ransack on Gutentag tags- undefined method `type' for nil:NilClass](https://stackoverflow.com/questions/50921458/ransack-on-gutentag-tags-undefined-method-type-for-nilnilclass)
https://github.com/pat/gutentag
https://qiita.com/ishidamakot/items/d50ed387fbd2e80f702d

##Ransackとは
Railsで作成したアプリケーションに検索機能を実装するためのgemです。 Ransackを利用することで複数の条件を組み合わせた複雑な検索機能を簡単に実装することができます。　

##Gutentagとは
Railsで作成したアプリケーションにタグ付け機能を実装するためのgemです。 Railsでタグ付け機能を実装する場合はacts-as-taggable-onというgemを使うので一般的ですが、[こちらの記事](https://qiita.com/jin-jar-ale/items/ee0e9e008ae8347eb44c)にあるようにRails6では不具合が発生している模様で、今回はこちらのgemを利用しました。


##つまずいたところ
私自身はRails5でacts-as-taggable-onとransackを組み合わせて検索機能を実装した経験があったので、同じようにでGutentagとRansackで検索機能を実装しようとしました。

具体的には、DBに保存されている記事のタイトル、記事の本文、記事のタグ名をOR検索するという処理内容。コードは以下。

__Model__

```ruby:article.rb
def self.make_search_query(search_word)
  query = {}
  query[:combinator] = 'or'
  query[:groupings] = []
  search_word = '' if search_word.nil?
  search_word.split(/[ 　]/).each_with_index do |word, i|
    query[:groupings][i] = { title_or_content_or_tags_name_cont_any: word }
  end
  Article.ransack(query)
end
```
__Controller__

```ruby:articles_controller.rb
def search
  Article.make_search_query(@search_word).result(distinct: true)
end
```

これで検索処理を走らせたら
以下のエラーが発生してしまった。

```
NoMethodError: undefined method `type' for nil:NilClass
```

どうやらタグ名検索のところでエラーが発生している模様。

##解決した方法
[こちらのサイト](https://stackoverflow.com/questions/50921458/ransack-on-gutentag-tags-undefined-method-type-for-nilnilclass)に同じような問題に直面した人が質問しており、解決策も提示されていました。

どうやらGutentagをインストールすることで作成されるgutentag_tagsテーブルはransackの検索対象に含まれていないらしいです。そのため、検索対象に含めるようにconfig/initializersに設定ファイルを置かなければならないとのこと。

設定ファイルの内容は以下


```ruby:config/initializers/gutentag.rb
if ActiveRecord::Base.connection.table_exists? 'gutentag_tags'
  model =  Object.const_get "Gutentag::Tag"
  model.singleton_class.class_eval do
    define_method(:ransackable_attributes) do |auth_object|
      auth_object = nil
      ['name']
    end
  end
end
```


このコードを自分なりに解釈すると

1.gutentag_tagsテーブルが存在するか確認する
2.存在する場合はObject.const_getで"Gutentag::Tag"クラスを取得する
3.singleton_class.class_evalによって特異クラスを定義する
4.ransackable_attributesメソッドを定義し、nameカラムを検索対象に指定。

という感じ。
これで、gutentag_tagsテーブルのnameカラムがRansackの検索対象になるようです。

とりあえず、再度Railsを再起動して検索処理を走らせると、無事にタグ名での検索も実行されました。

※ransackではransackable_attributesメソッドで検索対象とするカラムを指定することができます。

参考：https://qiita.com/ishidamakot/items/d50ed387fbd2e80f702d#検索できる項目の制限


##まとめ
RansackとGutentagを使ってタグの検索機能を実装した際に、タグ名で検索されないというエラーが発生しましたが、gutentag_tagsテーブルのnameカラムをRansackの検索対象に指定することで解決することができました。gutentagに関する情報は少ないので、少しでもお役に立てれば幸いです。ただ、個人的にはObject.const_getやsingleton_class.class_evalなど100%は理解できていないので、もっと勉強が必要。
bundle updateで表示されたエラーの解決

初投稿です。

今回、参考にさせていただいた記事はこちらです。
https://qiita.com/hatorijobs/items/2928e152f22d009b07d0

# 今回発生したエラー

それでは早速本題ですが、伊藤淳一さんの
「everyday rails - rspecによるrailsテスト入門」
という書籍やブログを参考させていただきながら、サンプルのセットアップをしていたところ、以下のようなエラーが出ました。

```none:ターミナル
アプリのディレクトリ % bundle update

Fetching gem metadata from https://rubygems.org/.............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Bundler could not find compatible versions for gem "railties":
  In Gemfile:
    rails (= 6.0.0) was resolved to 6.0.0, which depends on
      railties (= 6.0.0)

    sass-rails (~> 4.0.3) was resolved to 4.0.5, which depends on
      railties (>= 4.0.0, < 5.0)
```

どうやら、
「互換性のあるrailtiesが見つからない」
といった内容のエラーのようです。

では、railtiesを変更すればいいかというと、そう単純な話ではないとのこと。

# 解決策

まずは、

```none:ターミナル
アプリのディレクトリ % gem list
```

と入力してGemの一覧を確認してみました。

すると、「sass-rails」というGemのバージョンが、
アプリのGemfileに記述してあるものと「gem list」に記述されているものとで異なっていることがわかりました。

具体的には

```none:Gemfile
gem 'sass-rails', '~> 4.0.3'
```
と

```none:ターミナル
sass-rails (6.0.0, 5.1.0)
```

となっていました。

このバージョンが同じでないと、冒頭のエラーが出てくるようです。

したがって、Gemfileを次のように変更したあと、bundle updateしました。

```none:Gemfile
gem 'sass-rails', '~> 6.0.0'
```

この後、

```none:ターミナル
アプリのディレクトリ % bundle update
```

ですね。

すると、今度は次のようなエラーが出ました。

```none:ターミナル
アプリのディレクトリ % bundle update
Fetching gem metadata from https://rubygems.org/.............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies....
Bundler could not find compatible versions for gem "railties":
  In Gemfile:
    coffee-rails (~> 4.0.0) was resolved to 4.0.0, which depends on
      railties (>= 4.0.0.beta, < 5.0)

    rails (= 6.0.0) was resolved to 6.0.0, which depends on
      railties (= 6.0.0)
```

といっても、先ほどの「sass-rails」とほぼ同じような内容です。

今度は「coffee-rails」というGemのバージョンが、
アプリのGemfileに記述してあるものと「gem list」に記述されているものとで異なっているとのことです。

具体的には、

```none:Gemfile
gem 'coffee-rails', '~> 4.0.0'
```
と

```none:ターミナル
coffee-rails (5.0.0, 4.2.2)
```

だったわけですね。

そこで、先ほどと同じように

```none:Gemfile
gem 'coffee-rails', '~> 5.0.0'
```

と変更した後、

```none:ターミナル
アプリのディレクトリ % bundle update
```

bundle updateを実行しました。

すると、無事実行することができました！
【JavaScript】日時の表示

#プログラミング勉強日記
2020年11月8日
日時表示の方法をコードでまとめる。

#コード
```script.js

//データオブジェクトの初期化
const now = new Date();

//現在の年を取得
const year = now.getFullYear();

//現在の月を取得(月は0-11で表す)
const month = now.getMonth();

//現在の日付を取得
const date = now.getDate();

//現在の時間を取得
const hour = now.getHours();

//現在の分を取得
const min = now.getMinutes();

//『年/月/日 時間：分』の形で文字列を定数outputに代入
const output = `${year + 1900}/${month + 1 }/${date} ${hour}:${min}`;

//id属性がtimeのコンテンツをoutputに書き換える
document.getElementById('time').textContent = output;

```

#注意点
* 日時を取得するときのメソッドはほとんどget〜()だが、年を取得するときだけ、`getFullyear()`で取得。
* getyear()を調べたところ、`地方時に基づき、与えられた日付の「年」を表す数値から1900を引いたものを返します。`とMDNに記載されており、現在は非推奨のメソッドであるとわかった。

* また、getMonth()メソッドは、0~11までの整数で値を返すため、現在の月を表示したい時は、 +1する必要がある。0は1月、1は2月、11は12月に対応している。

#参考資料
* [Date.prototype.getYear()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getYear)
* [JavaScript の Date は罠が多すぎる](https://qiita.com/labocho/items/5fbaa0491b67221419b4)