OmniAICreator/Qiita-1.07M huggingface dataset:
Python(matplotlib)でunixtimeの値の入った時系列データのCSVをプロットする


↓このようなCSVファイルのデータをプロットしたいとする。

<pre>
$ cat 1.csv
"_time",count
1604847600,0
1604848200,2
1604848800,0
1604849400,2
1604850000,0
1604850600,3
1604851200,3
1604851800,0
1604852400,3
1604853000,1
</pre>

1604847600は,UNIXTIMEという表記法で、実際は次のような意味になる。

<pre>
2020-11-09 00:00:00,0
2020-11-09 00:10:00,2
2020-11-09 00:20:00,0
</pre>

これを変換するプログラムを考える。。。

<pre>
     1from datetime import datetime
     2
     3import matplotlib.pyplot as plt
     4import matplotlib.dates as md
     5import dateutil
     6
     7import sys
     8args = sys.argv
     9
    10x = []
    11y = []
    12
    13f = open(args[1], 'r')
    14
    15line = f.readline()
    16line = f.readline()
    17
    18while line:
    19    tmp = line.split(",")
    20    dt_object = datetime.fromtimestamp(int(tmp[0]))
    21
    22    x.append(str(dt_object))
    23    y.append(int(str(str(tmp[1]).replace('\n',''))))
    24
    25    line = f.readline()
    26f.close()
    27
    28counter = 0
    29for i in x:
    30    print(x[counter] + "," + str(y[counter]))
    31    counter = counter + 1
</pre>

https://github.com/RuoAndo/qiita/blob/master/python-timeseries-plot/1.py

10,11行目でタイムスタンプと値を格納するリストを作る。

<pre>
    10 x = []
    11 y = []
</pre>

20行目でUNIXTIMEを日付に変換する。

<pre>
    20    dt_object = datetime.fromtimestamp(int(tmp[0]))
</pre>

実行してみる。。。

<pre>
$ python 1.py 1.csv | more
2020-11-09 00:00:00,0
2020-11-09 00:10:00,2
2020-11-09 00:20:00,0
2020-11-09 00:30:00,2
2020-11-09 00:40:00,0
2020-11-09 00:50:00,3
2020-11-09 01:00:00,3
2020-11-09 01:10:00,0
2020-11-09 01:20:00,3
2020-11-09 01:30:00,1
2020-11-09 01:40:00,0
2020-11-09 01:50:00,1
2020-11-09 02:00:00,2
2020-11-09 02:10:00,2
</pre>

（｀ー´）b

あとはこれをプロットするプログラムを作る。

コードを見てみる。。

<pre>
     1from datetime import datetime
     2
     3import matplotlib.pyplot as plt
     4import matplotlib.dates as md
     5import dateutil
     6
     7x = []
     8y = []
     9
    10f = open('1.csv', 'r')
    11
    12line = f.readline()
    13line = f.readline()
    14
    15while line:
    16    tmp = line.split(",")
    17    dt_object = datetime.fromtimestamp(int(tmp[0]))
    18
    19    x.append(str(dt_object))
    20    y.append(int(str(str(tmp[1]).replace('\n',''))))
    21
    22    line = f.readline()
    23f.close()
    24
    25counter = 0
    26for i in x:
    27    print(x[counter] + "," + str(y[counter]))
    28    counter = counter + 1
    29
    30dates = [dateutil.parser.parse(s) for s in x]
    31
    32plt.subplots_adjust(bottom=0.2)
    33plt.xticks( rotation= 80 )
    34ax=plt.gca()
    35xfmt = md.DateFormatter('%Y-%m-%d %H:%M')
    36ax.xaxis.set_major_formatter(xfmt)
    37plt.plot(dates,y)
    38plt.show()
</pre>

https://github.com/RuoAndo/qiita/blob/master/python-timeseries-plot/5.py

30行目から38行目でリストx(タイムスタンプ),y(値）をプロットする。

<pre>
    30dates = [dateutil.parser.parse(s) for s in x]
    31
    32plt.subplots_adjust(bottom=0.2)
    33plt.xticks( rotation= 80 )
    34ax=plt.gca()
    35xfmt = md.DateFormatter('%Y-%m-%d %H:%M')
    36ax.xaxis.set_major_formatter(xfmt)
    37plt.plot(dates,y)
    38plt.show()
</pre>

（｀ー´）b
remote.itの接続方式(P2P接続とProxy接続)について理解する

# 1. 今回の要約
* remote.itの2つの接続方式(P2P接続とProxy接続)を理解する
* ProxyFailover機能を理解する

remote.itでは、P2P接続とProxy接続という2つの接続方式がサポートされています。また、これらの接続方式は使用するInitiater(クライアント)によって、使用できるものとできないものがあります。本稿ではこれらの接続方式の違いを理解すると共に、新しく実装されたProxyFailover機能について触れています。

# 2. 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/f55ff593-41f6-57c5-5be6-e8a39b5b2ac7.png)
remote.it社の資料から抜粋して絵をお借りしています。

# 3. P2P接続とProxy接続
remote.itでは接続先デバイスとの接続に、P2P接続とProxy接続という2つの接続方式があります。

接続方式|接続先例|説明
---|---|---
P2P接続|localhost:33000|クライアント(Initiator)と接続先(Target)が直接通信を行う。接続先同士がudp hole punchingでの接続施行を行うため、NATなどのお互いの通信環境に依っては接続が行えない。
Proxy接続|proxy72.rt3.io:32169 (*1|クライアント(Initiator)と接続先(Target)の間に、remote.itのProxyサーバが介在する。NATなどのお互いの通信環境による影響が軽減される。

それぞれの接続方式の違いとしてはまず、リモート接続後の接続先アドレスが異なります。P2P接続の場合には、ローカルアドレスポートへの接続となります。WebPortalなどからのProxy接続の場合には使用されるProxyサーバが毎回異なりますので、その接続先のアドレスも毎回異なります。(*1

※1)DesktopAppなどからの接続の場合には、P2Pと同じ接続先アドレスが使用できます

次に、P2P接続ではお互いが直接接続してデータ通信を行うのに比べ、Proxy接続では接続先との間にremote.itのProxyサーバが介在してデータの通信を行います。経路や効率などの観点からはP2P接続の方が好ましく思えますが、NATなどのお互いの通信環境に依っては接続が行えないことがあります。

Proxy接続では、接続元と接続先はそれぞれInternet上にあるremote.itのProxyサーバに対する接続となりますので、先ほどP2Pで上げたような通信環境による影響は軽減されます。remote.itのProxyサーバは世界各地域に設置されています。ただし、各ユーザと共用となりますので、利用にあたってはベストエフォートとなります。

どちらかの接続方式を選んで使用することもできますし、後記するProxyFailover機能を使用すれば、接続できる方式を自動的に施行することもできます。また、使用するInitiater (クライアント)によっては使用できる接続方式が決まっている場合がありますので、各接続手段別に使用できる接続方式については接続Matrixを参照してください。

# 4. ProxyFailover
ProxyFailoverとは、P2PとProxyの2つの接続方式を施行し、接続ができる方を選択して自動的に接続してくれる機能です。これにより、接続元と接続先のお互いのネットワーク環境に依らずに、接続が行える可能性が高まります。例えば移動などに伴い接続元の環境が一定ではない場合にでも、自動的に接続できる方式が使われます。

ProxyFailoverは、以下の流れでそれぞれの接続を施行します。

1. P2Pでの接続を施行
1. P2Pで接続できなかった場合に、Proxyでの接続を施行

まず初めにP2Pでの接続を施行し、接続ができればそこで終了となります。P2Pで接続できなかった場合には、次にProxyでの接続を施行します。それぞれの接続を施行する分、Proxyで接続される場合には接続までにかかる時間が少し伸びます。

ProxyFailoverをサポートするInitiaterで接続した場合には、結果としてどちらの方式で接続したかにかかわらず、P2P方式と同じローカルのアドレス(例、localhost:33000)が接続先となります。ProxyFailoverでProxy接続した場合には、ローカルポートからProxyアドレスへの転送が内部的に行われています。

# 5. 接続Matrix
remote.itの各Initiaterの接続方式(P2P/Proxy)をまとめると、以下の通りとなります。

Initiater|P2P接続|Proxy接続|備考
---|---|---|---
DesktopApp|〇|〇|ProxyFailover可能
MobileApp|〇|〇|ProxyFailover可能
CLI|〇|〇|ProxyFailover可能
Web Portal|×|〇|
connetd|〇|×|
REST API|×|〇|

両方の接続方式が可能な場合には、「P2P or Proxy」もしくは「ProxyFailover」での接続を選択(設定)することができます。
第1回オンラインMATLAB講習会　開催レポート

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/5b482974-7e93-28c9-0dde-c220f72a058d.png)
去る11/13(金)に学内生向けのオンラインMATLAB講習会を開催しました。
そのレポートをまとめておこうと思います。
（技術ブログであるQiitaを使うのが適切かというと微妙ですが）
**　**
**　**

#自己紹介
東大学内でMATLABの学生アンバサダーをやっている院生です。
学内生向けにMATLABを使ったり勉強したりする際のサポートを行っています。
具体的には今回のような講習会を開いたり、Google Form使ってMATLAB相談室を開いたりしています。

　**MATLAB相談室**　https://forms.gle/WThbu6QQb89zT3597

あとSNSとか。

　**Twitter**　@UT_MATLAB_Amb 
　**Facebook**　[@UTokyoMATLAB.Amb](https://www.facebook.com/UTokyoMATLAB.Amb/)

今回の講習会の準備では東大の教養教育高度化機構やシステム本部の先生方に加えて、MathWorksの方、また告知の際には教養・総合文化の事務の方々にお世話になりました。ありがとうございます。
**　**
**　**　
#MATLABについて
東大って誰でも**タダ**でMATLAB使えるんですよ。ヤバいですね☆

つまり**学費に組み込まれてるようなもんなので使わないと損**です。損とか言うと一気胡散臭くなるのはどうしてなんでしょう。でも事実そうだと思うんですよね。個人の見解。

MATLABは一言で言えば数理計算ソフトウェアです。プログラミングもできるのでプログラミング言語ともいえるし、開発もできるので開発環境ともいえます。すごそう。

でもタダで使えることと使おうと思うことは別っていうか、当たり前ですけどやろうと思わなければ使えないし、使わないと使えるようにはならないんですよね。

そこで講習会の出番なわけです。**どどーん！**
**　**
**　**　
#講習会概要

対象は「今までMATLABを触ったことがない人」で、目的は「そういった人が最低限MATLABの使い方を体験して、例えばレポート課題とかゼミの発表資料とかをMATLABで作ってみよう、みたいに思うこと」という感じに設定していました。

教養学部のHPにお知らせを出してもらったら応募が殺到して（割と焦った）、早めに締め切りました。本当はせっかくSNSあるんだからそっちでも告知をしたかったんですが、そんな余裕はなく……。

　
当日はZoomで開催し、説明と作業で休憩をはさみながら約3時間行いました。

参加者は30名強で8割は理系。やっぱり理系が多くなりますね。
学年で見ると学部1,2年生が8割近くでしたが、学部3,4年生や院生もちらほら。
教養学部Webサイトの「お知らせ」を見たって方が大半でした。他で告知してないので、それはそうなんですよね。

実際にやったのはMATLABが出しているオンライン学習コース「MATLAB入門」という2時間の自習用コースで、これを説明しながら進めていきました。
**　**
**　**　

#やってみて
思ってた以上に真面目に話を聞いてもらえるっていうか、質問もたくさん出てありがたかったです。

ほら、質問も出ないのに説明だけしてると虚無だし。
![無題の画像 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/cb185f0d-b854-5bb1-41ed-80a42c205a6a.png)
説明を行う中の人の図（**美少女**）

**　**
**　**　

手を動かす場面でも（画面の向こうではありましたが）皆さん順調に進んでいたようですし、振り返りアンケートも好評で嬉しい限りです。

**　**
**　**　
**振り返りアンケートから抜粋した「参加者の声」**
>MATLABの初めの一歩として、オンラインコースを使ってスムーズに学習が進められたので良かったです。

　入門用の講習会だったのでそう言っていただけると嬉しいです。　
>ちょうど時間内に終わらせることができた。
>後で必要になった時、他のコースも自分でできると思うので、コースの存在を知れてよかった。

　そうなんですよね、よくできたコースなんですけど知名度が皆無。
>わからないところがあった際に丁寧に質問に答えていただけてよかったです。

　こちらこそ質問ありがとうございました。
**　**
**　**　
正直なところ、やるまでは「自習用のオンライン学習コースをみんなでやるってどうなんだろ？　しかもオンラインだし」とか思ってたんですが、実際にやる口実というかモチベーションとしては良かったのかなと思っています。

参加してくださった方はこれをきっかけにして、ぜひ他の学習コースをやったり自分でMATLABを色々触ったりして遊んでもらえればうれしいなと思っています。

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/8889dd4b-8df6-368c-6646-2bec66f70251.png)
**色んな学習コースがある。読んだ人がこれをやると私に――特にメリットはない。**

**　**
**　**　
#おわりに
年内にもう一回やる予定なので、今回参加できなかった方はぜひ。
詳細は後日！　MATLABアンバサダーの次回作にご期待ください！


![Em6d6H3VkAARVAi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/99d5f35d-9a1e-a54c-14f2-0cf260cf91a0.jpeg)
ちなみに、参加するとこんな感じのグッズがもらえます。
モノで釣ろうなんてことは考えてませんよ？
Vue.jsとReact.js

<h1>私について</h1>
・文系
・プログラミング経験1年
・サマーハッカソン優勝
・大手IT企業を目指して就活中

<h1>なぜ記事を書くのか？</h1>
今まで楽しくてコードはたくさん書いてきたが、ほとんどが動いたら良いやと仕組みやシステムについてあまり考えてこなかった。一流のエンジニアを目指す上で、**なんとなくではなく、根拠をもって技術選定ができたりエラーを解決をできる**ように記事を書いていく。

<h1>技術選定の仕方</h1>
・自分のやりたい事が実現しやすい
・情報量が多い

プログラミングはあくまでも手段でしかなく、**プロダクトの価値を最大化させる**ことこそが目的である。またプログラミング言語は、基礎文法は少し変わるぐらいで大した差はない。言語に縛られるよりも、自分が言語に合わせて勉強していくほうが、プロダクトの価値も開発効率も上がる。

<h1>Vue.jsとReact.jsどっちが簡単？</h1>
結論から言うと、vue.jsのほうが圧倒的に簡単です。

<h3>Vue.jsのメリット</h3>
①SFC(Single File Component)
HTML/JavaScript/CSSが区別して管理でき、Web制作上がりの僕のような人にはとっつきやすい。

②Vue CLIが便利
TypeSclipt、ESLint などの plugin の使用などをコマンドラインの指示に従って簡単に導入できる。

③HMR(Hot Module Replacement)
ブラウザ画面の再描画(リロード)すること無しにコードの変更をブラウザに適用してくれるので、手間が減って開発が楽になる。

上記3つの点が、僕のような初学者でも簡単に感覚的にコードを書くことができ、かつ多くのことが容易に実現できる。

<h3>では、React.jsのメリットって？</h3>
①主にクラスベースで実装するため、大規模開発に適している。

②typescriptとの組み合わせが良い。

<h1>最後に</h1>
手軽さという面でVue.jsを選定してきましたが、これからtypescriptがもっと流行すること、会社での大規模開発に携わるであろうことから、Reactの開発もしていこうと考える。
最後まで読んでいただき、ありがとうございました。
JavaSilver合格体験記(1Z0-808)

#はじめに
JavaSilverはプログラミング初級者向けの資格です。
IT業界には5年ほどいますが、資格を持っていなかったため
自分の自信に少しでもなればと今回挑戦しました。
今更とか関係ないと思います。自慢をするための資格ではなく、自信をつけるための資格です。
この記事については合格するまでの勉強の過程を載せています。
合格当日の話や、合格後の証明書の話については別の方が記事してくれていますのでそちらをご参考ください。

#対象読者
　JavaSilverの資格取得を目指している方

#勉強に使用した書籍
　黒本
　　[徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応](https://tinyurl.com/y25lel4l "徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応")
　白本
　　[オラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集 ](https://tinyurl.com/y5g53rgg "オラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集")
#失敗談
最初に、evernoteで黒本を1章ずつevernoteに内容を書き写しました。
そこで頭の中だけで解き、答え合わせをするという方法をとっていました。
　結論：あまり意味がなかった。
　　　　理由は、書き写すことで満足をしてしまった。
　　　　あとは、後半の章は問題数が多いので途中で集中力が息切れしました。
　　　　時間を1ヶ月使ってしまいました。

#成功談
javaは業務で過去に使っていたので、7割くらいは内容を理解できていました。
そのため、それから模試だけに絞り勉強を開始しました。
下記のような手順で黒本、白本それぞれで実施しました。

  **手順**
  **①**模試の初回実施
  **②**①で間違えた箇所の解説を確認して、自分用の資料をまとめる
  **③**模試の2回目実施
  **④**③で間違えた箇所の解説を確認して、自分用の資料をまとめる
  **⑤**模試の3回目実施
  **⑥**⑤で間違えた箇所の解説を確認して、自分用の資料をまとめる
  **⑦**⑥のまとめた問題だけ小テストを実施する
  **⑧**間違え数が0問か1,2問になるまで⑤〜⑦を繰り返す

**試験結果**
合格点:65%以上
正答率:87%

#工夫したこと
　試験勉強しながら、勉強方法を試行錯誤しました。
　理由としては、今回は今後資格を取得する上で土台となる考えになると思ったからです。
　**1.YouTubeで試験範囲の詳細確認**
　　公式から試験範囲、注意点を解説した動画がYouTubeで公開されています。
　　2本で2時間ありますが、試験範囲が自分の中で把握できないまま取り組むより安心できると思います。
　**2.CBT方式対策**
　　試験の方式を確認。
　　JavaSilverはCBT方式です。
　　CBT方式が分からない方は下記にサンプルがあるので確認してみてください。
　　[CBT方式サンプル](https://wsr.pearsonvue.com/demo-jp/ "CBT方式サンプル")
　　そのため、CBT方式に寄せられるように、独自でevernoteを使って回答シートを作りました。
　　大したものではないですが、この記事にコメントかDMいただければフォーマットを配布します。
　　※ここに載せるには行が長いため貼りません。
　　実際に手書きだとできていたところがCBT方式に寄せてみると
　　チェック漏れで点数を落とすという体験ができました。
　　そのため、チェック漏れ対策を考えることができました。
　**3.メモリーツリー**
　　勉強法を模索しているうちに、「ドラゴン桜」という漫画の存在を思い出しました。
　　そこで紹介されていた「メモリーツリー」
　　これは記憶定着にいいのではないかと思い採用しました。
　　勉強の使用した場面：苦手な箇所のみ。
　　得意な箇所は通常の勉強で吸収できると判断し、苦手強化のために使いました。
　　　あとで実際の写真を載せる
　　　※字の綺麗さについては突っ込まないでください。
　**4.合格のイメージをつける**
　　合格者の投稿、Qiita,Twitterこの二つでキーワード検索[javasilver]などで調べると
　　勉強中の人や、合格者の投稿が検索結果として出てきます。
　　合格者の投稿をみて、自分は「合格するイメージ」をつけました。
　　それによってモチベーションの継続もできました。
　**5.総復習(出題ラリー)**
　　試験日の前日は妻に問題をランダムで出してもらい、本当に理解ができているかを最終チェックしました。
　　友達などにもしお願いできるなら、してみてもいいと思います。
　　そのままではないのですがこれも「ドラゴン桜」を参考にしました。
　**6.図を書いてみる**
　　この問題、解説見ても理解できないなと感じた問題に関しては
　　図を書いて自分の頭で整理させることを優先しました。
　　インターフェースは苦手だったので、図で整理して理解することで落とし込めました。
　**7.実機を動かしてみる**
　　コンパイルエラー系の問題は机上ですべて理解しようとするより
　　実際に問題のプログラムを動かしてみた方が感覚で分かる場合があります。
　　
#おわりに
この記事を読まれてみて、ここがもうちょっと詳細知りたいなどあれば
随時可能な限りで別記事にして紹介していきます(この記事はこれで終わらせたいので)。
また、JavaSilverを取得された方でこんな効率的な勉強法あるよ！など紹介いただければ嬉しいです。
laravelでsitemap.xmlからHTTPテストを作る

## 経緯

「とりあえずHTTPテストやりたいけど、構造はよく変わるしテストの維持がとても大変」
「関係ないけどsitemap.xmlの更新も面倒だなぁ」
「そうだ！sitemap.xmlからテストを作れば1度の修正で済むぞ！」

## 環境
laravel 6.19
PHPUnit 8.2.5

## 備考

前提として、テストを行うルート(sitemap.xmlに載せているルート)にnameが設定されている必要があります。

このテストは「sitemap.xml(このサイトに存在すると世界に示しているページ)にアクセス可能か」ということだけを検証するものです。
テストの管理が難しい環境で、最低限のHTTPテストとしてとりあえず入れてみるのには良いのでは無いかと思います。

## 出来たもの

```php:sitemap/index.blade.php

<?php echo '<?xml version="1.0" encoding="UTF-8" ?>' . "\n"; ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>{{ route('home') }}</loc>
        <changefreq>daily</changefreq>
    </url>

    <url>
        <loc>{{ route('info') }}</loc>
        <changefreq>daily</changefreq>
    </url>

    {{--こういうshowページあったとする--}}
    @foreach($articles as $article)
        <url>
            <loc>{{ route('article.show', ['id' => $article->id]) }}</loc>
            <changefreq>daily</changefreq>
        </url>
    @endforeach

</urlset>
```


```php:SiteMapTest.php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class SiteMapTest extends TestCase
{

    /**
     * 同一ルートを何個試すか
     */
    private $count = 3;

    /**
     * @test
     * @group sitemap
     * @dataProvider additionPrivateItems
     * @param string $url
     */
    public function test(string $url)
    {
        $response = $this->get($url);
        $response->assertStatus(200);
    }

    public function additionPrivateItems()
    {
        $xmlData = simplexml_load_string(view('sitemap.index')->render());
        $data = json_decode(json_encode($xmlData), TRUE)['url'];
        shuffle($data);

        foreach ($data as $url) {
            $url = $url['loc'];
            $routeName = $this->getRouteName(parse_url($url, PHP_URL_PATH) ?? '');

            if (empty($routes[$routeName]))
                $routes[$routeName] = 1;
            elseif ($routes[$routeName] >= $this->count)
                continue;
            else
                $routes[$routeName]++;

            yield [$url];
        }
    }

    private function getRouteName(string $uri)
    {
        return app('router')->getRoutes()->match(app('request')->create($uri))->getName();
    }
}

```

## コードの中身

PHPunitのdataProviderを使ってテストケースを作っています。

laravelなら大体sitemap.xmlはblade使って生成していると思うので、

- viewを`->render()`で文字列として取得
- xml文字列を`simplexml_load_string`で取得
- あれやこれやして配列で取得
- 毎回ランダムなルートをテスト出来るようにシャッフルする
- foreachで回し、それぞれURIからルート名を取得
- 同じルートだったら個数制限する

という流れです。

PHPunitのgroupを設定しているので

```bash=
./vendor/bin/phpunit --group=sitemap
```

これで実行出来ます。

## 終わり

これは本当に最低限の機能テストなので、フォームの送信テストなどPOST系のテストは別に用意出来ると良いです。
全部ルーティングから自動生成出来たらな。
Excel アドイン VSTO(VB.NET, C#) アクテイブなブック、シートの取得方法　選択中の範囲、セル取得方法

 VB.NET

```vb
Imports Microsoft.Office.Tools.Ribbon
Imports Microsoft.Office.Interop.Excel

Public Class Ribbon1

Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click

   Dim workbook As Workbook = Globals.ThisAddIn.Application.ActiveWorkbook

   Dim worksheet As Worksheet =  Globals.ThisAddIn.Application.ActiveSheet

   Dim range As Range = Globals.ThisAddIn.Application.Selection

   Dim cell As Range = Globals.ThisAddIn.Application.ActiveCell

End sub
```

C#

```cs
using Microsoft.Office.Tools.Ribbon;
using Microsoft.Office.Interop.Excel;


namespace test
{
    public partial class Ribbon1
    {
        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            Workbook ActiveBook = Globals.ThisAddIn.Application.ActiveWorkbook;

            Worksheet ActiveSheet = Globals.ThisAddIn.Application.ActiveSheet;

            Range ActiveCell = Globals.ThisAddIn.Application.ActiveCell;

            Range SelectedRange = Globals.ThisAddIn.Application.Selection;
```
AWS S3に保存しているオブジェクトを1度に1000件削除する。

# やりたいこと
　削除するオブジェクトのキー名が記載されたファイルを読み込んで、ポチッと実行するだけで、削除できるようにしたい。

# 方針
・削除するオブジェクトのキーがかかれたファイルを用意する。
・S3のAPI（delete_objects）を利用して、ループしながらキーを指定削除する。

参考リンク
・[S3の削除について](https://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingObjects.html)
・[pythonのdelete_objects APIについて](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.delete_objects)


# やったこと
・削除するオブジェクトのキーリストを作成する。

```text:削除するオブジェクトのキーリスト
hoge/fuga/hoge.jpg
hoge/fuga/hoge.png
hoge/hoge/hoge.gif
hoge/hoge/fuga.png
・・・
fuga/fuga/fuga.png

```

・削除プログラムを実行する
　delete_objectsは1度に1000件しか指定できないので、読み込んだキーリストを1000件単位のリストに再分割する。分割した単位でDELETE APIを叩き、ループ実行する。
　

```python:削除プログラム.py

import boto3
import re
import json

MY_REGION = 'リージョン名';
MY_BUCKET = 'バケット名';

client = boto3.client('s3', region_name=MY_REGION)
request_list = []
img_path_list = ''

def split_list(l):
    for idx in range(0, len(l), 1000):
        yield l[idx:idx + 1000]

# 削除データを読み込む
with open('削除するオブジェクトのキーリスト.text') as f:
    img_path_list = f.readlines()

# データ末尾の改行を削除してリストに追加する
for path in img_path_list:
    path = path.replace('\n','')
    request_list.append({'Key': path})

# リストを1000件ごとに分ける
# devide_list = [[0,...,999],[1000,...,1999],...,[n,...,n+999]]
devide_list = list(split_list(request_list))

# DELETE APIを実行する
for key_list in devide_list:
    response = client.delete_objects(
        Bucket = MY_BUCKET,
        Delete = {
            'Objects': key_list
        }
    )

    # 削除結果を記録する
    with open('log/削除結果.txt', mode='a') as f:
        for res in response['Deleted']:
            f.write(json.dumps(res))
            f.write('\n')

```
・削除が成功していれば、結果は下記のようになる。

```text:削除結果.text
{"Key": "hoge/fuga/hoge.jpg", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge1"}
{"Key": "hoge/fuga/hoge.png", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge2"}
{"Key": "hoge/hoge/hoge.gif", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge3"}
{"Key": "hoge/hoge/fuga.png", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge4"}
{"Key": "fuga/fuga/fuga.png", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge5"}
```


## その他
削除するリストと削除しないリストを用意して、両方のリストに存在するキーがあるか確認する
・[Pythonで複数のリストに共通する・しない要素とその個数を取得](https://note.nkmk.me/python-list-common/)

```python:2つのリストに存在する要素を表示する.py
input_urls = ''
not_delete_urls = ''

# リストデータを読み込む
with open('入力リスト.txt') as f:
    input_urls = f.readlines();

with open('削除しないリスト.txt') as f:
    not_delete_urls = f.readlines();

duplicate_urls = set(input_urls) & set(not_delete_urls)

# set型からlist型に変更する
list_duplicate_urls = list(duplicate_urls)
list_duplicate_urls.sort()

# 共通要素の件数と要素を表示する
print(len(list_duplicate_urls))
for elem in list_duplicate_urls:
    print(elem, end='')
```

###注意事項
* [S3は少なくとも1秒間に3500リクエストできる](https://docs.aws.amazon.com/AmazonS3/latest/dev/optimizing-performance.html)ので、削除APIを連続で叩く際に特にsleepは設けていませんが、実際に本プログラムを使って大量削除される方は、sleepを入れるかどうか自己責任で判断してください。
レスポンシブ対応の画像テンプレートを作ろう

# はじめに
`img レスポンシブ`というようなワードでimgタグによって出力される画像をレスポンシブ対応させようとしたことはないでしょうか？
いろいろな記事を参考にしてるとどれが正解のコードなのか分からなくなってしまいます。
デザインに正解はないから見た目が整っていればいいんだよという人もいれば、これはHTMLのルールに則っていないからダメだという人もいます。
初学者は何を参考にすればいいのか分からず頭を抱えてしまうので、テンプレートを基にコードを書いて貰えばいいのでは？と思ったので、今回はimgタグのレスポンシブのレンプレートを作ります:innocent:

# 前置き
以下の知識は知っているものとして話を進めていきます。

- ブロックレベル要素
- インライン要素
- imgタグはインライン要素
- width
- max-width

# 画像をレスポンシブ対応していく
早速レスポンシブ対応にしていきたいところなのですが、imgタグはブロックレベル要素の子要素にして扱うということを知っておいてください。
HTMLの配置ルールではブロックレベル要素の中にインライン要素を配置するという考え方があるのでそれに則り、imgタグはブロックレベル要素の中に配置していきます。

## imgタグの親要素は何タグにするべき？
HTMLは文脈を意識してマークアップする必要があるので、その画像がどのような扱われ方をしているかに注目します。
と言われましても。。。という方は少なくないはず。
まずはimgタグの親になるタグを知っておく必要があります。
以下の三種類がimgの親になることが多いです。

- p
- figure
- div
どのよう時にpタグ、figureタグ、divタグを使いわかればいいのか次で紹介します。

### pタグ
- imgタグにalt属性がある時
- 画像がないとその文脈が分からない時

### figureタグ
- 文脈が画像を参照している時

### divタグ
- pタグ、figureタグどちらにも当てはまらない時
- 見た目だけを整えたい時

## テンプレートを作る
```style.css
img {
  max-width: 100%;
}
```
もしくはこちらでも大丈夫です。

```style.css
img{
  width: 100%;
}
```
imgのheightは初期値がautoなので、わざわざ`height: auto;`を書かなくても大丈夫です。

# テンプレートを使用した例
今回は見た目だけ整えたかったのでimgタグの親にはdivタグを用いています。
異なるwidthでもちゃんと比率を保持してくれるようになっています。
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="nabeshi" data-slug-hash="bGeXQzL" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="responsive-lecture">
  <span>See the Pen <a href="https://codepen.io/nabeshi/pen/bGeXQzL">
  responsive-lecture</a> by Daichi Nabeshima (<a href="https://codepen.io/nabeshi">@nabeshi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 参考サイト
[画像をp要素にするかfigure要素にするか](https://vanillaice000.blog.fc2.com/blog-entry-747.html)
Bitriseでだけfirebaseエミュレータ+jestを使ったテストがコケるときの対処法

# 経緯
* Bitriseで`firebase`のfirestore rulesのテストを実行したところ、ローカル環境では動作するのにBitriseだと動かなくてどハマりした。（下記症状）
* [このIssue](https://github.com/facebook/jest/issues/10012)で議論されているが、みんな苦しんでいるようだった

# 症状
```bash
+ node --version
v10.23.0
+ yarn install
...(省略)
+ yarn test
yarn run v1.22.4
$ firebase emulators:exec --only firestore 'jest --env=node'
i  emulators: Starting emulators: firestore
⚠  It appears you are running in a CI environment. You can avoid downloading the Firestore Emulator repeatedly by caching the /Users/vagrant/.cache/firebase/emulators directory.
i  firestore: downloading cloud-firestore-emulator-v1.11.5.jar...
i  firestore: Firestore Emulator logging to firestore-debug.log
i  Running script: jest --env=node
TypeError: _gracefulFs(...).realpathSync.native is not a function
...(省略)
    at Module._compile (internal/modules/cjs/loader.js:1136:30)
    at Module._compile (pkg/prelude/bootstrap.js:1281:32)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1156:10)
    at Module.load (internal/modules/cjs/loader.js:984:32)
    at Function.Module._load (internal/modules/cjs/loader.js:877:14)
    at Module.require (internal/modules/cjs/loader.js:1024:19)
    at Module.require (pkg/prelude/bootstrap.js:1225:31)
⚠  Script exited unsuccessfully (code 1)
i  emulators: Shutting down emulators.
i  firestore: Stopping Firestore Emulator
Error: Script "jest --env=node" exited with code 1
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

# 原因（推測）
* `yarn test`で実際に実行されているコマンドは`firebase emulators:exec --only firestore 'jest --env=node'`
* このとき`firebase`コマンドは`/usr/local/bin/firebase`を見ているため、どうやらこの`firebase`が叩こうとする`jest`がローカルディレクトリ(`./node_modules/.bin/jest`)とは別物なので**ローカルと挙動が変わってしまう=CIで動かない**。
  * →Bitriseのnodeプリインストール環境だとfirebase emulator+jestがコケるってこと...
  
# 対処法
* 手元環境で`yarn add -D @types/jest`しておく(package.jsonのdevDependenciesに追加される)
* `yarn add global firebase-tools`をWorkflowのScriptに追加する
  * →`firebase`と`jest`の2つのコマンドを、自前でインストールしたものを使うようにする。

```bash
node --version
yarn global add firebase-tools # 追加
export PATH=`pwd`/node-modules/.bin:$PATH # yarnで入れたコマンドにパスを通す
yarn install
yarn test
```
AWS認定試験の合格特典を紹介してみた


# 前書き

意外とQiita上ではAWS認定試験の特典に関する記事が見受けられなかったので記してみます。

なお、自分が受かったのはSAA（ソリューションアーキテクトアソシエイト）となります。
よければ[こちら](https://qiita.com/YU-TA-9/items/fd1cdff57c0fb039a268)の合格体験の記事もご参考に！

# 特典内容

## ①認定デジタルバッジの取得

ざっくり合格の証ですね。（バッジと聞くとなんかテンション上がりますよね・・・！）
現在は、Acclaim (アクレーム)というサービス上で付与されるようです。

※Acclaim：様々な資格に関するデジタルバッジを管理するサービス（？）、LinkedInなどの別SNSと連携できるので、このサービスでより簡単に資格の証明を共有できるようになったみたいです。

## ②AWS認定の本試験料金の半額クーポン

めちゃくちゃでかいですね。
アソシエイトレベルで税込16,500円、プロフェッショナルで税込33,000円とかするので。。

## ③AWS認定の模擬試験料金の無料クーポン

こちらも大きい特典ですね。
模擬試験も種類によって2000〜4000円くらいかかるので、助かります。

## ④LinkedInのAWS認定グローバルコミュニティへ参加できる

LinkedInの、認定者しか入れないコミュニティへ参加することができます。
正直あんまり有用性を感じていませんが、、、特別感あってなんか良いです！

## ⑤AWS認定ストアを使える

AWSの公式グッズが買えます。

※2020/11/24時点でのラインナップ、調べると全然内容出てくるので載せてみます。

パーカーカッコいい・・・！！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609990/acb0cb26-fb56-adc0-95f1-6f18c83906be.png" width="50%" />

でも現在はアメリカ内の住所にしか届けられないよう。。（コロナの影響かな。）

## ⑥AWS Certification SME Programへの参加資格が得られる。

一緒に試験の問題を作れたりするらしいです。

詳細は[こちら](https://level69.net/archives/25972)の記事が参考になります！


# まとめ

とりあえず、認定試験に合格すれば、

* ①認定デジタルバッジの取得
* ②AWS認定の本試験料金の半額クーポン
* ③AWS認定の模擬試験料金の無料クーポン

がもらえるんだ〜と認識いただければよいのかなと思います。

パーカー欲しかったなあ。
Raspberry Pi OS(Buster/2020 Aug)でnftablesを使ってIPv4 NAPT

## やりたいこと

Raspberry Pi ZeroをIPv4のNATBOXというかイーサネットコンバータというか、そういう感じのアレにしてQoLを上げたい。ただし、やるのはmasqueradeだけでよくて、DHCPとかDNSとかそういうのは別の人がやっているとする。せっかくだから(?)iptablesではなくてnftablesで動かしてみたい。


## はまりポイント

- ipv4のip forwardingが初期設定では無効になってるので、nftのmasquarade設定書いてもしれっと無視される
- 無視されるだけでエラーがログにでないので念力でなんとかする必要があった
    - nftablesにログとる方法があるっぽいのでそれをやれば見つけられたのかもしれないが、何某かのmodprobeがいるっぽくてぐんにょりしててgoogle先生に頼った

## 手順
Raspberry Pi Zeroにeth0とwlan0があり、wlan0側がinternetで、eth0からの接続を全部NAPTしてwlan0側に流すと仮定する。

まずnftablesをインストールし、masquerade設定を記述する。

```shell-session
% sudo apt-get install nftables
% sudo vi /etc/nftables.conf
```

```configuration:/etc/nftables.conf
(ファイル終端に以下を追記)

table ip nat {
        chain PREROUTING {
                type nat hook prerouting priority 0;
        }
        chain POSTROUTING {
                type nat hook postrouting priority 0;
                oifname "wlan0" masquerade
        }
}
```

次にipv4のforwardを有効にする設定を記述する。

```shell-session
% sudo vi /etc/sysctl.conf
```
```configuration:/etc/sysctl.conf
...
(以下の行をアンコメント)
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
...
```

最後に、sysctl.confを読み込ませ、nftables.serviceを起動する。

```shell-session
% sudo sysctl -p
% sudo systemctl start nftables.service
```

素のRaspberry Pi OS 2020 Augで動作確認しましたが、apt-get full-upgradeした後でも動きました(2020/11/24)。

## うちの環境
- Raspberry Pi Zero
    - Raspberry Pi OS Lite(Buster/2020 Aug)
        - Linux raspberrypi 5.4.51+ #1333 Mon Aug 10 16:38:02 BST 2020 armv6l GNU/Linux
    - [USBハブ+Ethernetアダプタ](https://www.amazon.co.jp/gp/product/B01ASCNQKU/)と[Wifiドングル](https://www.planex.co.jp/product/wireless/gw-usnano2/)が刺さっている
    - Wifiドングルの接続先にブロードバンドルータがあって、ブロードバンドルーターのNAPT越しにインターネットに接続されている
- Ethernetアダプタの口につながってるLANのそれぞれの機器からインターネットに接続したい

## 参考にしたサイト

[Raspbianをbuster化したら、iptablesでちょっとだけハマる - Soukaku's HENA-CHOKO Blog](https://www.downtown.jp/~soukaku/archives/2019/0728_185332.html)

[Raspberry pi を NAT ルーター兼 DHCP + DNS サーバーにしたい - 子育てしながらエンジニアしたい](https://edosha.hatenablog.jp/entry/2017/07/06/134439)

[nftables - ArchWiki](https://wiki.archlinux.jp/index.php/Nftables)

[nftablesクイックHowto - りおてく](https://rio.st/2014/08/nftableshowto.html)


## おまけメモ

### Wifi設定(平文で書いてるので真似しちゃだめよ)
```configuration:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        SSID="(SSIDを記載)"
        psk="(keyを記載)"
}

network={
...
}
```

### 固定IP割り振り設定

```configuration:/etc/dhcpcd.conf
...
interface eth0
static ip_address=xxx.xxx.xxx.xxx
...
```
CentOS 7.9 を Azure DevOps Agent Poolに追加する

Azure DevOpsのSelf-Hosted Agentとして、ローカルネットワークのCentOS 7.9 を追加するときのメモです。

## 基本的な手順

公式ドキュメントの [Self-hosted Linux agents](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/agents/v2-linux?view=azure-devops) に従えばよい、はず。


## 引っかかりどころ

### `Must not run with sudo` エラー と `Failed to create CoreCLR 0x80004005` エラー

* 原因
　dotnetのdiagnosticsログ？ で名前付きパイプを作成しようとしているらしく、
　その権限が不足している

* 解決策
　恥を忍んで`root`で実行する。

#### 何が起こったか

基本的にLinuxのサービスの実行時の権限はroot以外のユーザが推奨されているので、例えば `azdevops` ユーザを作成して
以下のようにやればよい。はずだった。

```shell-session
sudo -u azdevops ./config.sh
```

もし `sudo` を使用せずに、または 一般ユーザが `sudo` で `root` に権限を昇格して `./config.sh` を実行すると、
`Must not run with sudo` というエラーが出てセットアップが終了する。

そこで上記のコマンドでやる必要があるのだが、次は `Failed to create CoreCLR` エラーが出てしまう。
この時のエラー番号は `0x80004005` である。

これはDotnetのエラーであるのだが、というか、これはdotnetのエラーである、ということがわかるのは 
.NET を使用しているユーザぐらいではないか？

もし、ほかの言語の開発者、あるいは単にLinuxに詳しいだけではエラーの内容がわからない。
たいていの場合問題となるSELinux（`/var/log/audit/audit.log`）には
エラーは記録されていないし、もちろんjournalにも記録されていないからである。

となれば権限不足であろう。エラーの内容から何かしらを作成できていないことは`create`の文字列でわかるわけで、
問題は何を作成しようとしたかである。

端的に言うと、dotnetのdiagnosticsログ？ で名前付きパイプを作成しようとしているらしく、
その権限が不足しているようである
以下、githubのissueにも指摘がある

https://github.com/PowerShell/PowerShell/issues/13166
>@mskadu At startup, CoreCLR tries to create named pipes for debugging and profiling of the process in /tmp/. It could be that the pipe creation fails intermittently when pwsh gets started so frequently.
Can you please try disabling CoreCLR diagnostics by setting the environment variable export COMPlus_EnableDiagnostics=0 (as instructed here), and then try running your repro step again to see if that helps?
protodep で「ssh: cannot decode encrypted private keys」エラーが出た時の解消法

## protodepとは

Protocol Buffer IDL管理のためのツール。

## インストール

### まずgoがインストールされていない場合はインストール

```bash
brew install go
 ```

### protodepのインストール

```bash
go get github.com/stormcat24/protodep
```

他のサービスに依存している場合は、protodep.toml に依存を追加し、以下のコマンドを実行してIDLを取得します。

```bash
protodep up
```

### protodep up でエラーが出る場合

```bash

$ protodep up
[INFO] force update = false
[INFO] cleanup cache = false
[INFO] identity file = id_rsa
[INFO] use SSH protocol
Error: ssh: cannot decode encrypted private keys
Usage:
  protodep up [flags]

Flags:
  -c, --cleanup                cleanup cache before exec.
  -f, --force                  update locked file and .proto vendors
  -h, --help                   help for up
  -i, --identity-file string   set the identity file for SSH (default "id_rsa")
  -p, --password string        set the password for SSH

ssh: cannot decode encrypted private keys
```


Macでssh keyにpassphraseを設定している場合、実行できません。
現在password optionも正常に動作していないようです。

```bash

cp ~/.ssh/id_rsa ~/.ssh/id_rsa_np
ssh-keygen -f ~/.ssh/id_rsa_np -p
# Passphraseに何も入力しない

protodep up -i id_rsa_np
```

で実行することができます。
Laravel学習  Viewとテンプレートについて

#はじめに
laravel学習をしていて下記について学んだことをまとめてみました。

####①Viewについて
####②テンプレートとは
####③クエリー文字列
####④Bladeについて
####⑤ヘルパ関数とは
####⑥ディレクティブ
####⑦コンポーネント


##①Viewとは
・画面表示を担当。画面表示させる部分をわかりやすい形で作れるようになっている。
・HTMLを使ってそのまま表示内容を記述できる仕組み

##②テンプレートとは

・Laravelの中でもViewを担当する重要な”部品”のこと
・画面表示のベースとなるもの。
・テンプレートを読み込む→変数など必要な情報を当てはめて実際の表示を生成する（レンダリング）
・レンダリングはテンプレートエンジンによって行われる
・テンプレートエンジンとはデータとテンプレートを合体させ、文字列を作る仕組みのこと
・テンプレートエンジンBladeと呼ばれるLravel既存のテンプレート使うか、自分で作成するかで使用する


▼値をテンプレートに返す
・コントローラ側から、テンプレート側へ必要な変数などの値を受け渡す。

```
views/作成フォルダ/作成ファイル（テンプレート側）
<html>

<body>
  <h1>Hello／index</h1>
  <p><?php echo $msg?></p>
  <p><?php echo date("Y年n日j日");?></p>
</body>
</html>
```

```
#Http/○○Contoroller.php（コントローラ側）

class ○○Contoroller extends Controller
{
    public function index() {
        $変数=['msg'=>'コントローラから渡されたメッセージ'];
    return view('フォルダ名.ファイル名',$変数);

     //この場合のviewメソッドは　”return view('テンプレート',配列);”となる

    }}
```
この場合のviewメソッドは　”return view('テンプレート',配列);”となるindexアクションのviewメソッドの部分で値をテンプレート側に呼び出している。コントローラ側で配列として用意した値はviewでテンプレート側に渡されて使えるようになる。

#③クエリー文字列
・クエリー文字列とはアドレスの後に？○○＝✖️✖️と言った形式で付けられたテキスト部分のこと
・クエリー文字列の受け取り方は$request->idというような渡し方をする。


#④Blade
・Laravel内に独自に用意されているテンプレートエンジン
・Bladeは「○○○.blade.php」という形でファイルを作成する。
・変数は{{＄変数}}としてテンプレート内に埋め込める
・同名のファイル名があれば’blade’が優先される。

#⑤ヘルパ関数
→テンプレートで必要となるコードの生成を手助けしてくれるもの。

▼csr_field()
CSRF対策のために用意されたヘルパ関数。フォームに「トークン」と呼ばれるランダムな文字列を非表示で追加し、そのトークンの値が正しいフォームだけを受け受けるようにすることでセキュリティを強化する。

▼CSRF
webサイト攻撃の一つ。外部からのプログラムなどによってフォームを送信する攻撃。
#####※LaravelはCSRF対策がなされていないフォームの送信はエラーが発生し、受け付けない仕組みとなっている。フォームを利用するときは必ず、csr_field()をフォーム内に準備する

```
#csr_field関数の使い方例

  <form method="POST" action="/hello">
  {{ csr_field() }}
  <input type="text" name="msg" >
  <input type="submit">
  </form>
  
```

##Bladeの構文
▼値の表示
{}の間に文を書くことでその文が返す値をその場に書き出すことができる。

```
{{値・変数・式・関数など}}

{{!!値・変数・式・関数など!!}}
//エスケープ処理されて欲しくない場合
```

#⑥ディレクティブ
言語における構文おような役割を担う機能。（@〜の構文）


▼Ifディレクティブ
条件に応じて表示する内容を制御するのが＠ifディレクティブ
↓条件がtrueの時に表示する

```
＠if(条件）
ーーー出力内容ーーー
@endif
```
↓条件によって異なる表示

```
＠if(条件）
ーーー出力内容ーーー
@else 
ーーー出力内容ーーー
@endif
```
↓複数の条件による表示

```
＠if(条件）
ーーー出力内容ーーー
@elseif(条件)
ーーー出力内容ーーー
@else 
ーーー出力内容ーーー
@endif
```

 ▼繰り返しディレクティブ
@for,@foreach,@while

$loop変数を使うことで繰り返しの状態を指定できる。

 ▼＠phpディレクティブ
 変数の定義などに使用

▼＠yield()
＠section内のテキストを表示させる。セクションの内容をはめこんで使用する・



▼＠section
セクションの作成。
一番上の＠sectionでは＠endsectionではなく、＠Showを使用する

#⑦コンポーネント　＠component
・独立したテンプレート
・一部w切り離して組み込みたいときに使用する。

▼＠slot
{{}}で指定された変数に値を設定するためのもの

```
@slot（名前（変数名））
設定する内容
@endslot
```

▼ビューコンポーザ
ビューをレンダリングする際に必要な部品のこと


▼サービスプロバイダ
継承（extends ServiceProvider~）して使用
・サービスを提供するための仕組み
・Bootメソッドをしよう
→割り込み処理

#最後に

認識違いなどありましたらご指摘いただけると幸いです。
SharePointリストの更新で無限ループを解消（したい）QAに投稿したけどさらに回答頂きたいのでこちらに

１．
Sharepoint上のリストで「アイテムが作成または変更されたとき」をトリガーに
リストの更新を行いたいです。

「複数の項目の取得」にて　フィルタークエリを　ID　eq [ID] に設定し
　Sharepointリストの「項目の更新」を作成しました。

警告どおり、無限ループにはいってしまいます。
どこに　さらなる条件を入れればよいのでしょうか？

![1113-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874732/160e1e60-b6fe-adb6-87ad-16ac98eeb939.png)


![1113.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874732/6b58b189-a375-53e3-72d6-209a532c4c30.png)

無限ループ解消方法の簡単な方法がないらしい、というのはネットで見ました。

以下がその記事です。

Power Automate のトリガーにはオプションで「トリガーの条件」が用意されており、ここに設定した条件をクリアしないと起動しないようになっています。
![pausi_2-300x66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874732/b98c453f-6e90-e45a-9d9b-a6498b78b1e9.png)

例えば、条件を「更新日時が現在時刻の3分前」というようにすることで、2回目のフローはここの条件に引っ掛かり起動されないということですね。

この条件文を、教えて頂けると助かります。

なお、日付を日本時間にする関数は
addHours(utcNow(), 9, 'yyyy/MM/dd HH:mm:ss')
だというのは理解していますが、
前述の条件にどう当てはめればよいのでしょうか？
mysqldumpで空ファイルしかできないと思ったら

#mysqldumpで空ファイルしかできないと思ったら

##背景
MySQLでdumpファイルを作りたく```mysqldump　-uroot　-p データベース名 > ファイル名.sql```のコマンドを打っているのにできるのは中身が空のファイル。
今までできていたのに何故？？？

##原因
単純なコマンドミスだった。
dumpファイル(空だが)自体は作成できていたため、指摘してもらうまでコマンドミスをしていることに全く気付かなった。

###mysql -uroot -p データベース名 > ファイル名.sqlでdumpの空ファイルはできる


* 間違い
```mysql　-uroot　-p データベース名 > ファイル名.sql```

* 正解
```mysqldump　-uroot　-p データベース名 > ファイル名.sql```

**mysqldump**と入力するべきところを**mysql**と入力していた。


思い込むとなかなか気付けないこのミス。
空ファイルしかできなくて困ったときには一度コマンドを見直してみてください。
背景色を透過するCSS (opacityとrgba)

# はじめに

Railsでオリジナルアプリ制作中、サイドバー部分を実装しました。

```eruby:sample.html.erb(抜粋)
<div class="side-bar-upper">
 <h2><%= current_user.nickname %></h2>
</div>
```

```css:sample.css(抜粋)
.side-bar-upper {
  width: 90%;
  height: 50px;
  margin: 5px auto;
  padding: 5px;
  background-color: #fff;
}
```

<img width="289" alt="sample" src="https://user-images.githubusercontent.com/70574115/100036961-8d682a80-2e44-11eb-9651-fefe67867335.png">

サイドバー背景には、個人的にお気に入りのキレイな画像を使用しました。
せっかくなので、**重ねた要素は透過して背景画像を生かしたい**と思います。

## 開発環境

Ruby 2.6.5
Rails 6.0.3.4
MySQL
Visual Studio Code
(GoogleChrome)

# 検証

まず背景の透過といえば…`opacity`プロパティが挙げられます。

**opacity**
要素の透明度を指定できます。

```css
.sample {
  /* 透明度50% */
  opacity: 0.5;
}
```

透明度は0.0~1.0内の小数点で指定します。
(0.5であれば、50％の透過率ということです)

こちらをCSSに反映してみます。

```css:sample.css(抜粋/修正)
.side-bar-upper {
  width: 90%;
  height: 50px;
  margin: 5px auto;
  padding: 5px;
  background-color: #fff;
  opacity: 0.5;
}
```

<img width="274" alt="sample.opacity" src="https://user-images.githubusercontent.com/70574115/100038155-d8833d00-2e46-11eb-8f72-ba7f8dc55db5.png">

要素の透過が出来ました…が
sampleの文字も薄い…一緒に透過されているのが分かります。

`opacity`プロパティは**その子孫要素にも透明度が適用される**点に注意が必要です…！


*〜文字はそのまま、背景のみ透過したい！！〜*

そんな時は…`rgba()`を使用します！

**rgba**
CSS3で追加された、RGBAカラーモデルでカラーと透明度を指定出来る値です。

```css
.sample{
 color: rgba(0, 0, 0, 0.5);
}
```

ここで注意が必要なのが、rgbaそのものはプロパティではなく、**あくまで値**ということです。
`background-color`や`box-shadow`などのカラー指定の出来るプロパティに、値として使用ができます。
そのため、カラーはカラーコードではなく、10進数で指定する必要があります。
各値は、**Red, Green, Blue(ここまでがカラー値), alpha(透明度)**の順で指定します。
今回使用している`#ffffff`は、10進数ですと`255, 255, 255`になります。

それでは、こちらをCSSに反映してみます。

```css:sample.css(抜粋/修正2)
.side-bar-upper {
  width: 90%;
  height: 50px;
  margin: 5px auto;
  padding: 5px;
  background-color: rgba(255, 255, 255, 0.5);
}
```

<img width="273" alt="sample.rgba" src="https://user-images.githubusercontent.com/70574115/100039670-0c5f6200-2e49-11eb-9522-f0da737d020c.png">

文字はそのままで、無事に背景の透過が出来ました！

# 終わりに

背景色透過のプロパティはアプリ制作で多用すると思い、今回記事にまとめてみました。

初学者で拙い記事ですが、少しでもお役に立てると嬉しく思います。
最後まで読んでいただき、誠にありがとうございました。

## 参考記事
[要素の透明度の指定（opacity）](https://web-manabu.com/html-css54/)
[カラーの透明度の値（rgba, transparent）](https://web-manabu.com/html-css55/)
[【CSS3リファレンス】opacity](http://www.htmq.com/css3/opacity.shtml)
[【CSS3リファレンス】rgba()](http://www.htmq.com/css3/rgba.shtml)
[カラーコードの一覧表(色を調べる/色を作る)](https://itsakura.com/html-color-codes)
join()メソッドの区切り文字について

#### join()メソッドを理解する
仕事でjoin()メソッドを使った際に、「配列を文字列に変換できるんだなー」という浅い理解にとどまっていたことを痛感しました。
特に区切り文字について理解不足と感じたので、再度理解を深めるために記載しました。

#### 公式を確認

公式を確認します。
[join() メソッド　公式](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/join "join() メソッド")

きちんと読むととてもわかりやすく記載頂いてます。いつもさらっと必要な箇所だけ流し読みしてしまうので、きちんと読む癖をつけたいなと思います。

#####説明の抜粋
>join() メソッドは、配列 (または配列風オブジェクト) の全要素を順に連結した文字列を新たに作成して返します。区切り文字はカンマ、または指定された文字列です。配列にアイテムが一つしかない場合は、区切り文字を使用せずにアイテムが返されます。

```Javascript:
const elements = ['Fire', 'Air', 'Water'];

console.log(elements.join());
// expected output: "Fire,Air,Water"

console.log(elements.join(''));
// expected output: "FireAirWater"

console.log(elements.join('-'));
// expected output: "Fire-Air-Water"
```

#### 再確認

ここで `配列.join();` と `配列.join('');` では挙動が違うことがわかります。

`配列.join();` のように、区切り文字を省略した場合
配列の要素はカンマ (",") で区切られます。

`配列.join('');` のように、区切り文字を空文字にした場合、
すべての要素の間が区切り文字なしで繋がります。

このように配列を何で区切るか設定するとき、設定なし・空文字では挙動が違います。

#### まとめ
配列を文字列にする、そのくらいの浅い理解でしたが、区切り文字について理解不足でした。他にも理解不足な箇所もあると思うので、引き続き勉強し続けたいと思います。
[iOS14]ScrollViewReaderを使って簡単なチャットの実装

## 今までのチャットの実装の難しさとiOS14からの手法
UIKitでチャットアプリを実装する際、UITableViewを使うことが多いかと思います。
LINEのようなチャットの場合は特に`高さの計算`、`一番下へスクロール`の実装が難しいですね。
今までの経験により、実装も複雑になりバグも多かったりしました。

`iOS14`になってからは、SwiftUIの`ScrollViewReader`が出てきて、だいぶチャットの実装が楽になりました。

## 環境

- Xcode12.2
- iOS14.2(SwiftUI2)

## ScrollViewReaderとは

プログラム的にスクロールできるようになります。
[ScrollViewReader - Apple公式ドキュメント](https://developer.apple.com/documentation/swiftui/scrollviewreader)


```swift

ScrollView {
  ScrollViewReader { (proxy: ScrollViewProxy) in
    ...
  }
}
```

ScrollViewReaderのクロージャーで`ScrollViewProxy`にアクセスが可能になります。これを保存しておき、
`scrollTo`でプログラム的にスクロールします。

```swift

func scrollTo<ID>(_ id: ID, anchor: UnitPoint? = nil) where ID : Hashable
```

## 簡単なチャットで使ってみた

```swift
struct ContentView: View {
    
    @ObservedObject private var viewModel: ViewModel = .init()
    
    @State var text: String = ""
    @State var value: ScrollViewProxy?
    
    var body: some View {
        VStack {            
            ScrollView {
                ScrollViewReader { value in
                    LazyVStack(alignment: .center, spacing: 16) {
                        //チャットの表示
                        ForEach.init(self.viewModel.messages, id: \.id) { message in
                            ChatView.init(message: message)
                        }
                    }.onAppear {
                        self.value = value //ScrollViewProxyを保存する
                        self.value?.scrollTo(self.viewModel.messages.count, anchor: .bottom) //初めに表示された時に一番下までスクロールする
                    }.animation(.easeInOut)
                }
            }
            
            //テキスト入力欄
            VStack {
                ...
            }.background(Color(white: 0.95))
        }
    }
}

extension ContentView {
    
    //送信ボタンを押した時
    func sendText() {
        viewModel.send(text: text)
        text = ""
        guard let message = viewModel.messages.last else { return }
        debugPrint(message)
        //わずかにタイミングをずらさないと、スクロールできない
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: {
            withAnimation {
                //一番下にアニメーションする
                self.value?.scrollTo(message.id, anchor: .bottom)
            }

        })
    }
    
}
```

スクショ

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/bf36c21e-c85d-c44d-c4b5-ac44b292b06e.png" />

## ソースコード 

https://github.com/usk-sample/ScrollViewReaderTest

## 参考

https://developer.apple.com/documentation/swiftui/scrollviewreader
https://qiita.com/giiiita/items/be38b9f0135a12bfd49c
https://medium.com/better-programming/build-a-chat-app-interface-with-swiftui-96609e605422
https://developer.apple.com/tutorials/swiftui/animating-views-and-transitions
https://www.raywenderlich.com/5815412-getting-started-with-swiftui-animations
他の人が作ってくれたCloud9でPythonのバージョンが古い時の対応方法

- 環境 : Cloud9
    - 同僚がEC2を利用したCloud9を使っていたので、私も使ってみたくてそのCloud9にアカウントを作ってもらって早速使い始めた。

# 事象 : Pythonのバージョンが古かった
```bash
# Pythonが3じゃない!
$ python --version
Python 2.7.18
# pipは・・・なぜかPython3.6のもの？
$ pip --version
pip 20.2.4 from /home/ec2-user/.local/lib/python3.6/site-packages/pip (python 3.6)
# Python3はあるようだ・・・
$ python3 --version
Python 3.6.12
```

Cloud9のPythonを3にすればよいのか？と思ったらもうなっている・・・

- 参考 : [Cloud9のPythonバージョンをPython3に変更【amazon AWS】｜dot blog](https://dot-blog.jp/news/cloud9-python-version-change/)

```bash
# 「+」がPython3にくっついている・・・けどとりあえず選択してみる
$ sudo update-alternatives --config python

There are 3 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*  1           /usr/bin/python2.7
 + 2           /usr/bin/python3.6
   3           /usr/bin/python2.6

Enter to keep the current selection[+], or type selection number: 2
# Python3にならない・・・
$ python -V
Python 2.7.18
```


## 原因 : `.bashrc`で古いバージョンを指定しているから
```bash
# 自分のアカウントのPythonが2になっている・・・
$ alias | grep python
alias python='python27'
# aliasでPython2.7が設定されている・・・
$ cat ~/.bashrc | grep python
alias python=python27
```

### 対応 : `.bashrc`で指定するPythonのバージョンを変える


```bash
# .bashrcじゃなくても読込順序が後のファイルならOK
$ ls -la
# ...省略...
-rw-r--r--  1 ec2-user ec2-user  336 Jul 24  2019 .bash_profile
-rw-r--r--  1 ec2-user ec2-user 1401 Nov 20 06:48 .bashrc
-rw-rw-r--  1 ec2-user ec2-user  118 Jul 24  2019 .zshrc

# viで開いてaliasでPython3.6を指定して
$ vi ~/.bashrc
$ cat ~/.bashrc | grep python
alias python=python36

# 反映すると
$ source ~/.bashrc 
function

# Python3.6になった・・・
$ python --version
Python 3.6.12
```
【Java】継承についてメモ

# 継承

## 継承とは
**「もともとある[クラス]を利用して、新しいクラスを生み出すこと」**です。
[オブジェクト指向]の勉強でもやりましたが、「この[クラス]はほとんど同じだけど、ここだけちがいます」っていう[クラス]をつくるときに使います。

## スーパークラスとサブクラス
[オブジェクト指向]的にポケモンで考えてみます。
ポケモンという、「身長、体重、名前、タイプなどのデータをもったもの」の[クラス]を継承して、ハガネール という[クラス]を生み出した場合だと

- **スーパークラス(親クラス)** = Pokemon [クラス]
- **サブクラス(子クラス)** = Haganeel [クラス]

ということになります。
 
## 継承する方法
 
 サブクラスを作成する時、以下のように「 **extends スーパークラス名** 」を記述して作ります。
 そのあとで、以下のように「**サブクラス にしか持っていない機能**」を記述していきます。
 
 ```
 class サブクラス名 extends スーパークラス名 {
      親クラスと違う処理
      ...
      ...   
 ```

と、指定します。
サブクラス は空っぽの状態でも、すでに親クラスのフィールドと[メソッド]を引き継いでいて、「**スーパークラスとはどこがちがうか**」を書き込んでいきます。

### 継承のメリット
主に以下の点が挙げられるかと思います。

- **同じような機能を持つ重複したコードを書かないようになるので、コードの再利用性が高くなる。**
- **[メソッド]を追加したり、オーバーライドすることができるので自由に拡張する。**

### 逆に継承をしないデメリット

重複したコードを書くことで、このような問題がズルズルと増えていきます。

1. **勘違いやミスやバグやを起こしてしまう可能性があり、メンテンスが難しくなる。**
2. **「機能の追加」や「改善」が難しくなり拡張性が下がる**

効率よく少ないコードでプログラミングしないと、開発がどんどん難しくなり、コードを書くプログラマーにも大きな負担になります。

[インスタンス]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[インスタンス化]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[アクセス修飾子]:https://qiita.com/takahirocook/items/e51b0b9d37d95ad587fe
[フィールド]:https://qiita.com/takahirocook/items/28df75a133049a74ece1
[フィールド変数]:https://qiita.com/takahirocook/items/28df75a133049a74ece1
[new演算子]:https://qiita.com/takahirocook/items/00f9f97592bf50831d39
[カプセル化]:https://qiita.com/takahirocook/items/e469a7c0539a0012868e
[クラス]:https://qiita.com/takahirocook/items/50cbbdca8e21539170e9
[メソッド]:https://qiita.com/takahirocook/items/5bfe43576d87a2a4006c
[mainメソッド]:https://qiita.com/takahirocook/items/f4635915337303de338c
[メソッドの呼び出し]:https://qiita.com/takahirocook/items/f4635915337303de338c
[コンストラクタ]:https://qiita.com/takahirocook/items/fa1822f2f22c3786593e
[引数]:https://qiita.com/takahirocook/items/5e5b0ba79e869f4a592e
[戻り値]:https://qiita.com/takahirocook/items/3b6fa670a1d6dd4a9386
[this]:https://qiita.com/takahirocook/items/d251ec4693c68f6b9538
[getter・setter]:https://qiita.com/takahirocook/items/27828bc8477735612021
[setter]:https://qiita.com/takahirocook/items/27828bc8477735612021
[getter]:https://qiita.com/takahirocook/items/27828bc8477735612021
[オブジェクト指向]:https://qiita.com/takahirocook/items/041ba7a096b71ab8ffd4
npmを特定のポート番号で動かしたい

ご無沙汰してます、おおのんです。
一時的に指定したポート番号でnuxtアプリを立ち上げる方法。

```javascript:ターミナルでnuxtアプリを5000番で動かす。
npm run dev -- --port 5000
```

はい。
Windows10 プロダクトキーを確認する

# 目的

- Windows10のプロダクトキーをコマンドプロンプトで確認する方法をまとめる

# 詳細情報

- コマンドプロンプトでこれから紹介するコマンドを実行するPCのWindows10のプロダクトキーを確認する方法を記載する。

# 詳細

1. キーボードのWindowsキーを押下する
1. 「cmd」と入力しヒットしたコマンドプロンプトの「管理者として実行」をクリックする。
2. 下記を実行する。

    ```
    wmic path softwarelicensingservice get OA3xOriginalProductKey
    ```
1. `XXXXX-XXXXX-XXXXX-XXXXX-XXXXX` の形で表示される。

# ご注意

- プロダクトキーはWindowsのライセンス一つに紐付いているので第三者の目に触れるところに公開しないようにしよう。
「マイクロサービス イン アクション」翻訳しました。


今日は、翻訳本のお知らせです。

「Microservice in Action」を翻訳しました。



　多くのマイクロサービスプロジェクトに関わる中、適切なサービスの粒度設計について、我流ではなく、世の中で広く使われている考え方を理解したい、という思いで始めました。



　当初は、サービスの設計に特化した本を考えておりましたが、マイクロサービスアプリケーションを一通り説明している当書と出会い、この本に決めました。マイクロサービスは設計に注目が集まりますが、稼働後の運用や監視もこれまでと違う難しさがあります。



　こちらの本では、サービスの粒度に関する考え方はもちろん、マイクロサービスアプリケーションを正しく設計、デプロイ、監視するための考え方や具体的な方法を記載しております。難しい内容ではなく、すぐに使えるノウハウがしっかり入っておりますので、これからマイクロサービスアプリケーションを構築し運用する方々には、ちょうどいい内容です。サンプルコードも公開しておりますので、触れながら理解を深めることもできます。



　簡単に本で解説している内容をご紹介します。

【設計】
　マイクロサービスは、分散した細かなサービスを連携しながら稼働するアプリケーションです。このサービスの境界、スコープをどのように決定するのか？サービスが相互に通信する方法、サービスのレジリエンスを高める方法などについて解説します。



【デプロイ】
　アプリケーションに影響を与えず、サービスを本番環境へデプロイする確かな、いくつかの方法について、解説します。デプロイメントアーティファクトの標準化やデリバリーパイプラインの構築について説明します。



【監視】
　マイクロサービスアプリケーションでは、１つのトランザクションが複数のサービスに跨がります。このような複雑な環境にあってもその状況をしっかり監視できていれば、変更を行うことも難しくありません。クラウド（AWS）における監視環境の構築や監視の考え方について解説します。


今後もこちらのブログで本の解説をご紹介していきたいと思いますが、ぜひ実際の本も手に取って頂ければ幸いです。

今回、始めて翻訳を行うに当たり、非常に多くの方にご協力頂きました。心より感謝したいと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686775/0677d5c7-5863-1e1a-d0c7-a125bd8902e0.png)
2020年11月２４日発売
ISBN978-4-434-2810-4
定価（本体5,000円＋税）
[amazonはこちら](https://www.amazon.co.jp/%E3%80%90Amazon-co-jp-%E9%99%90%E5%AE%9A%E3%80%91%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-%E3%82%A4%E3%83%B3%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-%E3%83%A2%E3%83%BC%E3%82%AC%E3%83%B3-%E3%83%96%E3%83%AB%E3%83%BC%E3%82%B9/dp/4434281046/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9+%E3%82%A4%E3%83%B3+%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3&qid=1606890957&sr=8-1)


大西
プログラマ脳を鍛える数学パズル Q.02「数列の四則演算」

基礎アルゴリズム力upのためPHPで解いてみた。
下記の考えのもと組んだ。

+ 1.for文で1000~9999を回す。
+ 2.正規表現指定（0を全て除外）
+ 3.数字を各位（千、百、十、一）に分け、それぞれの間に四則演算を入れたfor文。
+ 4.文字列式を作成。
+ 5.結合文字列をevalで計算
+6.対象数字と反転した結合結果の数字が一致するなら出力

```
<?php
$four_calc = array('+', '-', '*', '/','');
$count = count($four_calc);
for ($num = 1000; $num < 10000; $num++) {
  if (preg_match("/[0]+/", $num)) {
    continue;
  }
  $arrNum = str_split($num);
  for ($i = 0; $i < $count; $i++) {
		for ($j = 0; $j < $count; $j++) {
			for ($k = 0; $k < $count; $k++) {
        $cal_form = $arrNum[0].$four_calc[$i].
                    $arrNum[1].$four_calc[$j].
                    $arrNum[2].$four_calc[$k].
                    $arrNum[3]; // 文字列式を作成
        if (mb_strlen($cal_form) >= 5) {
          if (eval("return {$cal_form};") == strrev($num)) {
            print $cal_form . "=" . $num . "\n";
          }
        }
      }
    }
  }
}
?>
```
答えは、5*9*31=5931
TypeError　解消ほう備忘録

エラー文
`TypeError at /
__init__() takes 1 positional argument but 2 were given`
本来引数を一つのところ2つあるよと言う意味

変更するコード

```
urlpatterns = [
    path('', views.Index, name = 'index'),
```

`views.Index`の部分はviews.pyのファイルなどでdefと関数定義している場合大丈夫
だが、[そうじゃない場合](https://qiita.com/yuka-f/items/829866fc560a5aeaa86a)は

```
urlpatterns = [
    path('', views.Index.as_view(), name = 'index'),
```

のようにpath('', views.Index`.as_view()`の部分を付け足す必要がある。