OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder Beginner Contest 166 A問題「A?C」解説(Python3,C++,Java)

Ruteです。
AtCoder Beginner Contest 166 A問題「A?C」の解説を行います。

>問題URL:
https://atcoder.jp/contests/abc166/tasks/abc166_a

#問題概要
コンテストの開催ルールは以下のようである。(この問題における)
・ABCが開催された次の週にはARCが開催される
・ARCが開催された次の週にはABCが開催される

先週開催されたコンテストを表す文字列$S$が与えられる。
今週開催されるコンテストを表す文字列を出力せよ。

##制約
・$S$は`'ABC'`または`'ARC'`である

#解説
・ABCが開催された次の週にはARCが開催される
・ARCが開催された次の週にはABCが開催される

というルールから、
<b>・$S$が`'ABC'`なら今週開催されるのはARC
・$S$が`'ARC'`なら今週開催されるのはABC
</b>
ということが分かります。
よって、<b>文字列$S$を読み取って上の条件分岐通りの出力をすれば良いです。</b>
<b>$S$の2文字目を読みとってその条件分岐を行う</b>という方法でもACすることは可能ですが、実装が楽なのは前述した方法です。

以下、Python3,C++,Javaでの解答例を示します。

##各言語解答例
<details><summary>Python3での解答例</summary><div>

```{ABC166.py}
S = input()
if S == "ABC":
  print("ARC")
else:
  print("ABC")
```


</div></details>

<details><summary>C++での解答例</summary><div>

```{ABC166A.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  string S;
  cin >> S;
  if (S == "ABC"){
    cout << "ARC" << endl;
  }else{
    cout << "ABC" << endl;
  }
}
```

</div></details>

<details><summary>Javaでの解答例</summary><div>

```{ABC166A.java}
import java.util.Scanner;
public class Main{
  public static void main(String[] args)
  {
    Scanner scan =new Scanner (System.in);
    String S =  scan.nextLine();
    if (S.equals("ABC")){
      System.out.println("ARC");
    }else{
      System.out.println("ABC");
    }
  }
}
```
※ Javaでは文字列比較の時に`==`ではなく`"文字列A".equals("文字列B")`とコーディングしましょう。`==`という条件式の場合コンパイルエラーが発生する場合があります。後者の方だと文字列Aが文字列Bと同じかを正しく判定することが出来ます。
</div></details>
そのウィンドウはどこのウィンドウ？

ステージング環境でのバッチテスト

ターミナルウィンドウからコマンドを入力して実行

霹靂のアラート通知

押し寄せる運用チームからのSlack

ああそうかこれは

本番環境のウィンドウだったか

----
ターミナルウィンドウは環境ごとに背景色を変えたりしてわかりやすくしましょう

- iTerm2でSSHログイン先別にプロファイルを自動的に切替えて事故防止する方法 | Developers.IO https://dev.classmethod.jp/articles/iterm2-ssh-change-profile/
"Test code or tested code did not (only) close its own output buffers"エラーの調査方法




Cakephp3でControllerのテストをしていたのですが、次のようなメッセージが表示されました
> Test code or tested code did not (only) close its own output buffers

エラーメッセージでコードを検索すると、出力バッファの階数を検査している箇所でエラーになっていることが分かりました。出力バッファを開始したもののきちんと終了できていないことが原因でにエラーになっています。

```/vendor/phpunit/phpunit/src/Framework/TestCase.php
private function stopOutputBuffering()
{
    if (\ob_get_level() != $this->outputBufferingLevel) {
        while (\ob_get_level() >= $this->outputBufferingLevel) {
            \ob_end_clean();
        }

        throw new RiskyTestError(
            'Test code or tested code did not (only) close its own output buffers'
        );
    }
    ...
    以下続きます
```

そこで、テスト対象のコードから ob_start() を探して、終了するまでの間に何か起きていないか調べてました。デバッガを止めながら実行してみると、途中でExceptionを吐いている箇所を発見することができました。

まとめると```Test code or tested code did not (only) close its own output buffers```のエラーになった場合は、デバッガでステップ実行しながらExceptionを吐き出している箇所を見つけましょう。ということになります。

## バージョン

* PHPUnit 6.5.14
* Cakephp 3.7.7
python 関数でのグローバル変数の使用

関数でグローバル変数を作成または使用するにはどうすればよいですか？

ある関数でグローバル変数を作成した場合、そのグローバル変数を別の関数でどのように使用できますか？アクセスを必要とする関数のローカル変数にグローバル変数を格納する必要がありますか？

グローバル変数は、それに割り当てる各関数でglobalとして宣言することにより、他の関数で使用できます。

```python
globvar = 0

def set_globvar_to_one():
    global globvar    # Needed to modify global copy of globvar
    globvar = 1

def print_globvar():
    print(globvar)     # No need for global declaration to read value of globvar

set_globvar_to_one()
print_globvar()       # Prints 1
```


参照： https://python5.com/q/biukniir
ESXi にデプロイした Fedora CoreOS のディスクサイズを手動で拡張する

[公式](https://getfedora.org/en/coreos?stream=stable) から取得した OVA でインストールした Fedora CoreOS のディスクサイズを後から手動で拡張する手順。

# 手順

とりあえずインストール後、仮想ディスクのサイズを拡張する。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124014/ea2871d5-465b-6bc2-3c08-a59523922279.png)

起動したら以下のコマンドを順に実行する。

- 拡張したいパーティションの番号を確認（今回は `sda4` が対象）
- 拡張したいデバイスとパーティションを指定して `growpart` を実行
- 一旦リブートして再接続
- パーティションを指定して `xfs_growfs` を実行

```
# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  250G  0 disk
|-sda1   8:1    0  384M  0 part /boot
|-sda2   8:2    0  127M  0 part /boot/efi
|-sda3   8:3    0    1M  0 part
`-sda4   8:4    0  7.5G  0 part /sysroot

# growpart /dev/sda 4
CHANGED: partition=4 start=1050624 old: size=15726559 end=16777183 new: size=523237343 end=524287967

# reboot now

# xfs_growfs /dev/sda4
meta-data=/dev/sda4              isize=512    agcount=14, agsize=146432 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=1965819, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1965819 to 65404667

# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0   250G  0 disk
|-sda1   8:1    0   384M  0 part /boot
|-sda2   8:2    0   127M  0 part /boot/efi
|-sda3   8:3    0     1M  0 part
`-sda4   8:4    0 249.5G  0 part /sysroot
```

### ポイント

- `growpart` コマンド
    - デバイスとパーティションを指定して拡張可能にするコマンド

        [growpart: extend a partition in a partition table to fill available space - Linux Man Pages (1)](https://www.systutorials.com/docs/linux/man/1-growpart/)

        [パーティションサイズの拡張 | さくらのクラウド ドキュメント](https://manual.sakura.ad.jp/cloud/storage/modifydisk/resize-partition.html#id8)

- `resize2fs /dev/sda4` ではない
    - CentOS 7 から `xfs_growfs` に変更になった

        [CentOS 7(XFS)でLVMディスク拡張でハマったこと - Qiita](https://qiita.com/fetaro/items/d7dc74262633ba474bc8)
(小ネタ) FATファイルシステム相手にrobocopy/rsyncするときはタイムスタンプに気をつけよう

# はじめに

FATファイルシステムを使っているパーティションや共有フォルダとデータを同期したい、が
ログを見ると、変更されていないはずのデータまでも転送されてしまっている…。

それはFATのタイムスタンプの精度がよくないからかもしれません。

帯域と時間の無駄なので、変更されていないはずのデータを改めて取得してくるのをやめたい。


# こうしよう

その他のオプションについては必要に応じて追加してください

## robocopy

```bat
C:\> robocopy /MIR /FFT \\server\source X:\dist
```

> /fft  FAT ファイル時間 (2 秒の精度) を想定します。 

from: [Microsoft Docs - robocopy](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/robocopy)



## rsync

```bash
$ rsync -a --modify-window=1 /mnt/source /home/user/dist
```

```bash
$ rsync --help
rsync  version 3.1.2  protocol version 31
Copyright (C) 1996-2015 by Andrew Tridgell, Wayne Davison, and others.

(中略)

     --modify-window=NUM     compare mod-times with reduced accuracy

(後略)
```


# おわりに

根本的な解決策としては「FATを使わない」になってしまいますが、レガシーなシステムではまだ現役です。
もう少し辛抱しましょう…。
Google ColaboratoryのTPUでKerasを動かす

※公式ページを参考にしました．

#準備


```
%tensorflow_version 2.x
import tensorflow as tf
print("Tensorflow version " + tf.__version__)

try:
  tpu = tf.distribute.cluster_resolver.TPUClusterResolver()  # TPU detection
  print('Running on TPU ', tpu.cluster_spec().as_dict()['worker'])
except ValueError:
  raise BaseException('ERROR: Not connected to a TPU runtime; please see the previous cell in this notebook for instructions!')

tf.config.experimental_connect_to_cluster(tpu)
tf.tpu.experimental.initialize_tpu_system(tpu)
tpu_strategy = tf.distribute.TPUStrategy(tpu)
```


```
def create_model():
  #model定義
  return model
```


```
with tpu_strategy.scope():
  model = create_model()
```


#学習部分
通常通り，学習を行う．

```
history = model.fit( x_train, y_train, epochs = 50, batch_size = 2048, validation_data=(x_test, y_test))
```
S3からDb2 Warehouse on Cloudにデータをロードする

S3やiCOSに生データ・加工済みデータをアップロードして、必要に応じてDWHにデータをロードして分析をするということは普通によくある。
とはいえ、最初はみんな初心者なのでやり方がわからない。
Db2 Warehouse on CloudはAWSにも当然対応している（宣伝）ので、AWS上にデプロイされたDb2 Warehouse on CloudにS3からデータをロードする方法を簡単に説明する。

##用意するもの

- Db2 Warehouse on AWS
- S3
- クライアントPC(ブラウザ/CLI)

これだけ

##WebコンソールからS3データをロード

何がなんだかわからなくてもすぐ試せるのがGUIの良いところ。
Db2 Warehouse on Cloudはユーザーが利用可能なクライアントGUIとしてWebコンソールを提供しているので、これを使ってまずはS3からのロードを試してみる。

1. Webコンソールにつないで、左のパネルから[Load]を選択するとこんな画面が出る。データソースの欄にバッチリS3が表示されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137326/4e09b56f-fadf-93d8-ee4a-5a5fadf561d9.png)

必要な情報と、その情報で正しくロードが動作することを確認するのに便利。

この画面をみると、[Endpoint], [S3 access ID], [S3 secret access key]の３つの情報が必要であることがわかる。
S3情報は自分の持っている情報を入れるだけで動作する。
エラーが出たときは以下を疑う

- アクセスキー、パスワードの入力ミス
- S3の権限について、特にロードログの書き出しが入るので書き込み権限をつけることを忘れずに
    - アクション　　
        - 読み込み
            - GetObject
            - GetObjectVersion
        - 書き込み
            - PutObject
    - リソース
        - すべてのリソース
            - arn:aws:s3:::バケット名/*


##CLIからデータをロード

GUIからのロードが動作することが確認できたら、今度はCLIでのロードを実行する。
クライアントPCにDb2クライアントSWを導入して、Db2 Warehouse on Cloudに接続ができる状態にしておく必要がある。ここは割愛。

外部表での実行コマンド例は以下

> db2 "INSERT INTO <I>ターゲットテーブル</I> SELECT * FROM EXTERNAL '<I>ソースファイル名</I>' USING (s3('<I>endpoint url</I>', '<I>authkey1</I>','<I>authkey2</I>', '<I>endpoint</I>') DELIMITER ',' )"

特に注意することはないが、authkey1がユーザーID、authkey2がパスワードであることに注意するくらい。

ロードコマンドを利用したい場合は、Admin CMDを使って以下のようになる。

> CALL SYSPROC.ADMIN_CMD('LOAD FROM "S3::<I>endpoint url</I>::<I>s3-access-key-ID</I>::<I>s3-secret-access-key</I>::<I>s3-bucket-name</I>::<I>path-to-data-file</I>" OF <I>filetype</I> <I>additional-load-options</I> INTO <I>table-name</I>)

何れにせよ、GUIからのロードがうまく行ったならば、あとはそのパラメータをCLIに当てはめるだけで実行可能。
最初からCLIで頑張るのではなく、GUIをうまく使うのがコツ。

##唐突にFAQ

Q: データサイズはどれくらいにするのが正解ですか？
A: お客様次第。S3の場合はデフォルトで５GBのファイルサイズ制限があるので、５GBに分割してファイルがアップロードされていることが多い。過去のオンプレSWの仕様上１００MBごとのファイルロードをしている人もいる。

Q: すべてのファイルを纏めてオブジェクトストレージにおいて、 一回のロードで終わるようにします！
A: 止めはしませんが、ロード失敗時のリトライ処理や時間、並列処理を用いたロードによるパフォーマンスを考慮したでしょうか？

Q: 外部表を使えばわざわざロードしなくてもそのままS3のデータに対してSQL投げれますよね？
A: はい、できます。ただしやはりS３への直接I/Oは重いです。外部表を利用したロードは非常に高速なので、必要なデータはさっさとデータベースに入れてしまうほうがみんなのストレスが減ります。
【Vue.js】Vue CLI 新規ページの追加方法

#【 Vue.js】Vue CLI 新規ページの追加方法

Vue CLIで作成したサイトに新たにページを追加する方法。

##手順
1. viewsフォルダ配下に新規ファイルを作成する
2. ルーティングを追加
3. router-linkタグでリンクを追加


#1. viewsフォルダ配下に新規ファイルを作成する
viewsフォルダ配下にページを作成する。ファイル名はコンポーネントの作成規則に則り大文字始まり、キャメルケースとする。

以下、BitcoinAPI.vueを作成場合。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/52b4e8e1-5e35-5648-d66a-b0a09ad6f80d.png)


#2. ルーティングを追加
routerフォルダのindex.jsファイルのルーティングに作成したページを追加する。

必須なのは、①pathオプションと②componentオプションの２つ。

①path：URLを記述。
②component：指定の記述で作成したファイルを指定。
`component: () => import('../views/ファイル名')`

nameオプションを追加しておくと、リンクを設置する際に、pathではなく、nameで指定した値も使える。

`name:'ルーティングの名前'`


```js:index.js
  const routes = [
  {
    path: '/bitcoin-api',
    component: () => import('../views/BitcoinAPI.vue'),
  }
]
```



<br>
#3. router-linkタグでリンクを追加
リンクを設置したいページのtemplateタグ内に、router-linkタグを設置する。

リンク先のpathはto属性に記述する。

`<router-link to="相対パス">アンカーテキスト</router-link>`

```html:templateタグ
<router-link to="/bitcoin-api">Bitcoin API</router-link>
```

設置したリンクから、該当URLでページが開けば完了。
IPAとは？　基本的な言葉の意味から詳しく解説！

こんにちは！　Peaceful Morning社でインターンをしている高橋です！

ところで、みなさん**IPA**という言葉をご存知でしょうか？
近年、**RPA単体ではできない高度な業務に対して、IPA**という言葉が注目されるようになりました。

そこで、今後より主流になるであろう**IPA**という言葉の概念など基本情報を解説して行きます！

##IPAとは
IPAは**Intelligent Process Automation**の略称です。
これはRPAとAIを足したもの、いわばRPAの進化系と言えます。RPAだけではなし得なかった、高度な自動化をAIも活用していきながら実現する概念のことを指します。

**RPAは決められたことしかできない、人間が指示したことができない特徴があります。**つまり言い方を変えると人間が逐一、指示出しをする必要性がありました。**そこでこの人間の部分をAIに変えてしまおう、というのがIPA**です。AIを組み合わせることによって、自らが学習しRPAに指示を出してくれます。それにより、さらなる高度な自動化が実現できます。

UiPathのホームページにはAIとRPAの活用について、ゴルフを例としてあげています。400ヤード離れたカップにゴルフボールを入れたい時、パタークラブだけでは、難しいですよね。同様に、高度な作業を自動化する時にAIだけではうまくいきません。ドライバーやアイアンなどを駆使していきながらカップを狙うゴルフ同様に、RPAなども一緒に駆使していきながら高度な自動化は実現する必要性があります。

というような感じでRPAとAIの共存について書かれています。
(https://www.uipath.com/rpa/intelligent-process-automation)



##事例紹介
ここではどんなものがIPAにあたるのか確認していきましょう。

###UiPath 
UiPathでは**AI Fabric**といったソリューションを開発しました。この製品により、様々な、機AIを一元管理・改善していくことができます。AI Fabricが、データサイエンティストとRPA 運用者との間の架け橋になり、RPAのワークフロー内に、自由にAIを展開させることができます。

###Blue Prism
Blue Prismでは**Blue Prism Decipher**と言うBlue Prism製品にAI機能を搭載したものを開発しました。この製品によって、RPAが読み込めるデータをAIが自動で識別、抽出してくれるため人が介入する必要が無くなります。

##AIを過信しすぎては行けない
AIは何でも出来ると思い込んでしまってはいけません。AIはまだ様々な業務に対応出来るような機能が備わっていないからです。そのためAIが出来るもの、出来ないものを予め把握することが必要となります。

それによりIPAも同様で出来るものが限られています。AIは日々進歩しているので今後に期待しましょう。


##ハイパーオートメーション

またこちらの言葉も関連ワードとして、おさえておくとよいのはないでしょうか。
ハイパーオートメーションはUiPth社のHPで**複数のAIや機械学習、自動化ツールなどを組み合わせて、一連の仕事を実行する概念と実装**と紹介されています。

ハイパーオートメーションにおいて、RPAは業務自動化を構成するツールの一つという位置付けです。**RPAをはじめとした様々な最先端のツールが共存し、相互に連携する一連の構造がハイパーオートメーション**と呼ばれています。

ハイパーオートメーションについての記事はこちらが詳しくかかれているのでおすすめです！↓
**【2020年】業務効率化の最前線！ハイパーオートメーションとは？**
https://rpahack.com/hyperautomation

##RPA HACK おすすめ記事 3選
RPA HACKを少しでも気になった方にむけてこちらの記事をおすすめします。
RPA HACKでは100本以上の記事が無料で読めます！

1.**「自動化が進む世界で、時代に合わせて変化する人を応援したい――藤澤専之介氏インタビュー」**
(弊社代表のインタビューです。弊社の思いであったりビジョンがわかります！)
https://rpahack.com/sennosukefujisawa_interview

2.**「UiPath StudioXの基本をマスター！～画面構成/カード/アクション」**
(RPAツールであるUiPath StudioXの使い方を丁寧に解説しています！これからRPAを使ってみたいという方にはおすすめです！)
https://rpahack.com/uipath_studiox_1

3.**「RPAの導入事例　部門ごとに事例を紹介！」**
(RPAが実際どんな業務に使われているのかイメージがつかないという方におすすめです！)
https://rpahack.com/rpa-casestudy

この他にも、RPA関連の情報を随時更新しています！ご覧ください！

最後まで読んでいただき誠にありがとうございました！
教科書に出てくる等高線を描いてみる(Excel)

この記事は[教科書に出てくる等高線を描いてみる(Fortan+gnuplot)](https://qiita.com/yotakagi77/items/8333e6c0d8c495467add)及び[教科書に出てくる等高線を描いてみる(Python)](https://qiita.com/yotakagi77/items/1a703e1f42b2521ca7f8)の続編です．

# はじめに

筆者は大学の工学部で習う流体力学を勉強しているが，流体力学の最初のほう(完全流体の理論)では速度ポテンシャル $\phi$ や流れ関数 $\psi$ といった物理量が現れ，それらの量を用いた代表的な流れの例がいくつか出てくる([二重わき出し](https://ja.wikipedia.org/wiki/%E3%82%8F%E3%81%8D%E5%87%BA%E3%81%97)など)． これらの量の2次元での等高線が教科書の図として載っているが，自分でも作図できたら理解が深まるような気がする．しかしながら，関数 $y = f(x)$を手軽に描画できるグラフソフト・サービスでは，2次元面でのある物理量の等高線を描くのは難しいことが多い．前回までの記事ではFortranやPythonを用いてみたが，プログラムミングの知識が少し必要&環境準備が必要ということで若干敷居が高い．そこで今回は，有料だけれども必ずPCにインストールされていると思われるExcelを使って等高線を描画してみる(アンチExcelの方はこの記事を無視してください)．

# 事前準備: Excelがインストールされたパソコン

まず，Excelが使える環境・PCを必要とします．互換ソフトであるLibreOfficeのCalcやGoogleのスプレッドシートでも途中のデータ生成まではできそうですが，等高線の描画については当方は知識を持っていないので何とも言えません．

# 対象とする流れ場

前回の記事と同じ吹き出し・吸い込みについて対象とする． 原点からの距離を $r$ とすると， 3次元での速度ポテンシャル $\phi$ は以下のように表せる．
$$
  \phi = -\frac{m}{r},\, r = \sqrt{x^2+y^2+z^2} \tag{1}
$$
ここで$m$は吹き出しの強さと呼ばれる係数である．2次元での等高線が描きたいので， $z=0$ として，
$$
  \phi = -\frac{m}{r},\, r = \sqrt{x^2+y^2} \tag{2}
$$
を描画してみる．

# 作業方針

作業はExcelのみで解決することを目指す．

1. 下の図のような2次元の格子点(等間隔のマス目)をエクセルシート内に作成し，各格子点(セル)での $\phi (= \phi_{i,j})$の値を計算する．
2. グラフ機能で等高線を描画する．

という流れでExcelを活用する．見栄えはあまり気にしない．

![grid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128259/e15e5ffb-bd7f-f73f-2f26-319bb0214f87.png "2次元格子")

# Excel操作手順

### パラメータの入力

計算に用いる以下のパラメータを適当なセルに入力する．

* 領域の大きさ(`xmin`, `xmax`, `ymin`, `ymax`)
* 格子点刻み(`delta`)
* わき出しの強さ(`m`)

<img width="131" alt="ex1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128259/2b5d1ff4-225d-ac12-5c2d-84cde3c6a471.png">

### x座標， y座標の設定

$x$座標，$y$座標を2次元データを計算する領域の外側2辺に設定する．
パラメータである`xmin`，`ymin`，`delta`のセルを絶対参照しても良いし，規則的なデータなので数セル分値を入力してオートフィルしても良い．

<img width="960" alt="ex2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128259/dbdcb6d0-5d66-2a9e-9bcb-41f06dffc42b.png">

### 2次元データの計算

2次元データ$\phi_{i,j}$を座標値で囲まれた空白セルで計算する．このとき，エクセルの絶対参照・相対参照の機能を活用して式を設定する．絶対参照・相対参照の切り替えはF4キーを押すことで素早くできる．

先ほどの座標値を設定した図において，B9のセルには以下の式を代入する．

```Excel
=-$B$6/SQRT(B$8^2+$A9^2)
```
$が付くと絶対参照になるので，`SQRT`の中では行の絶対参照，列の絶対参照を組みわせている．あとはオートフィルで全てのセルで式計算をさせて値を埋める．

<img width="887" alt="ex3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128259/acd1b281-b5be-7fc3-565c-c6390ab0fbce.png">

ここでそれぞれのセル数値を確認する必要はないが表示をうまく切り替えて正しそうなことを確認する．

### 等高線グラフの挿入

計算された数値が入っているセルを選択し，「挿入」メニューの「グラフ」から「等高線」を選択する。塗りつぶしありのカラーコンターまたはワイヤーフレームの等高線を描画できる。

<img width="505" alt="ex4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128259/b382b643-bf9d-af84-ba39-97974a936bd4.png">
<img width="471" alt="ex5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128259/1b3dc1c1-ba54-5fc0-35a2-809a3ea782cf.png">

なお，この記事ではMicrosoft Excel for Mac Version 16.39を用いた．

# まとめ

Excelの表計算で2次元関数の値を計算し，グラフ挿入機能を用いて等高線を描画する方法を紹介した．Excelを用いた描画ではあまり広い領域or大きな格子点数の処理には向いていないが，Excelが入ったPCがあれば気軽に等高線描画を試すことができる．筆者はExcelの使用にあまり慣れていないので細かな設定を説明できないが，工夫次第ではそれなりの見た目にすることもできるかもしれない．
Ajaxで非同期削除をしてみる

view
=

- Ajaxでタスクを削除するための作戦

⑴削除はサーバサイドでやる必要があるものの、今表示している一覧画面をそのまま表示し続けていたいため、Ajaxでサーバにリクエストを飛ばす

⑵削除された項目の非表示は、クライアントサイドにてJavaScriptで行う。
　’⑴’の処理が無事行われたら非表示になるようにする





- ページ遷移ではなくAjaxリクエストを発生させる
remote: trueを記述

```ruby:index.html.slim
= link_to '', user, method: :delete, remote: true, data: { confirm: "ユーザ「#{user.name}」を削除します。よろしいですか？" }, class: 'far fa-trash-alt fa-lg'

```


controller
=

- destroyアクションをAjax向けに変更する
具体的には、リダイレクトをなくし、ステータスコード（204）だけ返すようにする。
※HTTP のレスポンスコード 204 No Content は、リクエストが成功した事を示します

``` ruby:user_controller.rb 
def destroy
  @user.destroy
  head :no_content
  # redirect_to users_url, notice: "ユーザ「#{@user.name}」を削除しました"
end
```

RailsのHTTPステータスのシンボル表現まとめ
https://blog.toshimaru.net/rails-http-status-symbols/


javaScript
=

[記載場所]


- 通常（v6.0のデフォルトはWebpackerになっている）
app/javascript/packs 配下のファイル
app/assets/javascripts/xxxxx.js
> RailsGuide(v6.0)
> https://railsguides.jp/asset_pipeline.html
※アセットパイプラインはassetsフォルダ内の各ファイルを最終的に一つのファイルに連結・圧縮する）
アセットパイプラインのパスを変える場合は、config/initializers/assets.rb内を変更する

- 組み込みrubyを使う場合
app/views/[controller名]/xxxxx.js.erb
※js.erbファイルでないと、<%= user.name %>などの記述は読み込めない

- Webpackerを使う
app/javascript/packs配下
※Webpackerでバンドルされたファイルは public/packs 配下にコピーされる。
（バンドルする対象のファイルは app/javascript 配下のファイル）

バンドルする単位をエントリーポイントと呼び、エントリーポイントとなるファイルは app/javascript/packs 配下のファイルです。
CSS,javaScript のどちらも app/javascript/packs 配下に配置することでエントリーポイントとすることが出来る。
※エントリーポイントとなるファイルに javaScript は import, CSS は @import を記載ればそれらがエントリーポイントのファイル名としてバンドルされる。


- 削除した対象を非表示にする

Ajaxは非同期通信です。
そのため、削除が成功したことを確認してから非表示にするためには、「削除処理が成功した」というイベントのハンドラの中に、対象を非表示にする処理を記述します。

rails-ujsは、remote: trueをつけたa要素に対して、Ajax通信が成功した時に、ajax:successというイベントを発行してくれます。
そこで、これに対応するイベントハンドラを記述します。

イベントハンドラを追加するにあたっては、対象となるa要素を簡単に特定できるようにしたいので、まずは、次のように削除リンクのa要素に「delete」という独自のCSSクラスを目印として付与してみます。

```ruby:index.html.slim
= link_to '', user, method: :delete, remote: true, data: { confirm: "ユーザ「#{user.name}」を削除します。よろしいですか？" }, class: 'far fa-trash-alt fa-lg delete'
```

- この目印を利用して、削除リンク（a要素）にイベントハンドラを設定します。
※ここでは、Turbolinksを利用しているため、windows.onloadを利用していない

```javascript:app/assets/javascripts/user.js
document.addEventListener('turbolinks:load', function() {

  document.querySelectorAll('.delete').forEach(function (a) {
    a.addEventListener('ajax:success', function() {
      var td = a.parentNode;
      var tr = td.parentNode;
      tr.style.display = 'none';
    });
  })

});
```

- 確認方法

・javaScriptのDOM要素はデベロッパーツールのコンソールでタグを堀々して確認してから実装しましょう。非表示対象を見つけたら、style.display = 'none' にしてみましょう。

・javaScriptが正常動作しない場合は、
デベロッパーツールのブレークポイントでどこまでコードを読めているか？を見ましょう。

・Ajax通信についても、通信が正常にできているかはデベロッパーツールで確認する事ができます。
期待するNetworkXHRでステータスが返ってきているかを見ましょう

・フロントエンドだけでなくバックエンドまで確認しましょう。
うまくいかない場合は、登場人物を明確にしてデータの受け渡しフローのどこでつまづいているのか？を切り分けましょう。



備考
-

> techRacho
> Rails 6: Webpacker+Yarn+Sprocketsを十分理解してJavaScriptを書く: 前編（翻訳）
> https://techracho.bpsinc.jp/hachi8833/2020_01_16/85940
GoogleChromeのページ翻訳がマウスオーバーで原文が表示されなくなった？

### Chrome標準機能から原文のポップアップがなくなった。
僕は英語がわからないので**Chrome**の設定は**「英語を常に翻訳」**にしてあります。

ときどき変な訳もありますが、僕の目的のほとんどが**ドキュメント**であり、会話の要素などないので**Google先生の翻訳**に不足を感じたことはありません。

ただ、以前は「ページを翻訳」した場合、翻訳されたテキストの上にマウスカーソルを移動すると「原文」のポップアップが表示されてましたが、現在ではその機能がなくなってしまいました。

### 機能拡張で復活！

Chrome内蔵のページ翻訳からは、原文のポップアップがなくなりましたが、**拡張機能**の**Google翻訳**にはその機能が搭載されたままでした。

[Google 翻訳 - Chrome ウェブストア](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb) からインズトールできます。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280129/dde415f3-8c67-dfe4-7e30-197bfbacc094.gif)

### ちょっと惜しいのは…
英語のドキュメントの**[例]**としての**コード**まで翻訳されることがあります。
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280129/132b01d6-877f-c3c4-aedf-3d825935ecfc.gif)
翻訳された説明を読んでは、原文に戻してコードを眺めてまた翻訳してもらって…
とはいえ、英語のわからない僕でも読めるように翻訳してくれてありがとうございます。
これからも、どうぞよろしくお願いします。m(__)m
AtCoder Beginner Contest 167 B問題「Easy Linear Programming」解説(Python3,C++,Java)

AtCoder Beginner Contest 167 B問題「Easy Linear Programming」の解説を行います。

>問題URL:
https://atcoder.jp/contests/abc167/tasks/abc167_b

#問題概要
$1$が書かれたカードが$A$枚、$0$が書かれたカードが$B$枚、$-1$が書かれたカードが$C$枚存在する。
これらのカードからちょうど$K$枚を選んで取るとき取ったカードに書かれた数の和として、ありうる最大値はいくつか答えよ。

##制約
・入力は全て整数
・$0 \leq A,B,C$
・$1 \leq K \leq A+B+C \leq 2×10^9$

#解説
最大値を<b>可能な限り大きくするため</b>$K$の値によってカードの取り方を以下のようにします。

1.$K \leq A$の場合
$K$枚の$1$が書かれたカードを選んで取れば良いです。

2.$A < K \leq A+B$の場合
1.で示した取り方を行った後に、残りの$(K-A)$枚の$0$が書かれたカードを選んで取れば良いです。

3.$A+B < K \leq A+B+C$の場合
2.で示した取り方を行った後に、残りの$(K-A-B)$枚の$-1$が書かれたカードを選んで取れば良いです。

1.の場合答えは$K$
2.の場合答えは$A$
3.の場合答えは$A-(K-A-B)$
となります。

$K$の値によって答えの出力を変えれば良いです。

なお、制約が
$A+B+C \leq 2×10^9$
となっていますが、
一般的な`int`型(C++やJava)で表せる数値の範囲は
<font color = "red">$-2^{31}$～$2^{31}-1$まで</font>あり、
$2^{31} = 21474883647$であることから、
制約内では、$K$は`int`型で定義しても問題はないでしょう。

以下、Python3,C++,Javaでの解答例を示します。

##各言語解答例
<details><summary>Python3での解答例</summary><div>

```{ABC167B.py}
A,B,C,K = map(int,input().split())
if (K <= A):
  print(K)
elif (A < K <= A+B):
  print(A)
else:
  print(A-(K-A-B))
```

</div></details>

<details><summary>C++での解答例</summary><div>

```{ABC167B.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  int a,b,c,k;
  cin >> a >> b >> c >> k;
  if (k <= a){
    cout << k << endl;
  }else if (k <= a+b){
    cout << a << endl;
  }else{
    cout << a-(k-a-b) << endl;
  }
}
```

</div></details>

<details><summary>Javaでの解答例</summary><div>

```{ABC167B.java}
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    int a = scan.nextInt();
    int b = scan.nextInt();
    int c = scan.nextInt();
    int k = scan.nextInt();
    if (k <= a){
      System.out.println(k);
    }else if (k <= a+b){
      System.out.println(a);
    }else{
      System.out.println(a-(k-a-b));
    }
  }
}
```

</div></details>
2線分の交点座標(2次元)

Aizu Online JudgeのCoursesを埋めていたところ、[2線分の交点を求める問題](https://onlinejudge.u-aizu.ac.jp/courses/library/4/CGL/2/CGL_2_C)に出会った。
そこで2線分の交点導出方法を考える。

# 2線分の交点導出アルゴリズム
ここでは同一平面上に存在し、並行でない線分 $AB, CD$ について考える。
4点 $A, B, C, D$ の2次元座標が与えられたときの交点 $X$ の座標を求めたい。

点 $X$ は線分 $AB, CD$ 上に存在するため媒介変数 $s, t$ を用いて

```math
X = A + s\vec{AB} = C + t \vec{CD}
```

と表現できる。
![交点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308399/6aebee92-a0c3-a97e-c090-00072e5ad81b.png)

$\vec{AB} = B - A, \vec{CD} = D - C$ であるため、各点に関して $x, y$ 座標の関係式が求まる。

```math
\begin{equation}
\left \{
\begin{array}{l}
A_x + s(B_x - A_x) = C_x + t(D_x - C_x) \\
A_y + s(B_y - A_y) = C_y + t(D_y - C_y)
\end{array}
\right.
\end{equation}
```

これを $s, t$ に関して解く。

```math
s = \frac{(C_x - A_x)(D_y - C_y) - (C_y - A_y)(D_x - C_x)}{(B_x - A_x)(D_y - C_y) - (B_y - A_y)(D_x - C_x)} \\
t = \frac{(A_x - C_x)(B_y - A_y) - (A_y - C_y)(B_x - A_x)}{(D_x - C_x)(B_y - A_y) - (D_y - C_y)(B_x - A_x)}
```

線分 $AB, CD$ が並行でないとき、この式より2線分の端点座標から $s, t$ の値が求まり、交点の座標を計算できる。

### 2線分の交差判定
$s, t$ の値から2線分の交差判定を行うことができる。
**直線** $AB, CD$ の交点が**線分** $AB, CD$ 上に存在するとき線分 $AB, CD$ の交点が存在するといえる。
したがって $s, t$ が共に $[0, 1]$ の範囲に収まっているとき線分 $AB, CD$ は交差する。

```math
0 \leq s, t \leq 1 を満たすとき交差する
```

# パラメータ s, t の幾何的意味
[2線分の交点導出アルゴリズム](#2線分の交点導出アルゴリズム) で得られた $s, t$ の式を見ると分母分子が共に外積の形をしていることに気づく。

```math
s = \frac{(C_x - A_x)(D_y - C_y) - (C_y - A_y)(D_x - C_x)}{(B_x - A_x)(D_y - C_y) - (B_y - A_y)(D_x - C_x)}
  = \frac{|\vec{AC} \times \vec{CD}|}{|\vec{AB} \times \vec{CD}|}
```

2次元ベクトルにおける外積の大きさは2ベクトルで成す並行四辺形の面積に等しい。
ここで $\vec{AC}, \vec{AB}, \vec{CD}$ の関係を図示する。
![外積.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308399/9974d1a0-d5bc-16d5-7050-1266d7f55906.png)

$|\vec{AC} \times \vec{CD}|$ と等しい面積を持つ並行四辺形を<font color="ForestGreen">緑</font>、
$|\vec{AB} \times \vec{CD}|$ と等しい面積を持つ並行四辺形を<font color="Blue">青</font>で表した。

図に表現してみると $|\vec{AC} \times \vec{CD}| = |\vec{AX} \times \vec{CD}|$ であることがよく理解できる。
またパラメータ $s$ が青と緑の平行四辺形の面積比を表していることがわかる。

# C++ ソースコード
引数に4点 $A, B, C, D$ の座標を渡すと2線分 $AB, CD$ の交点の座標を返す関数IntersectionをC++で書く。

```cpp
#define INF 1e60
typedef struct Point_Coordinates {
	double x, y;
	friend Point_Coordinates operator-(const Point_Coordinates& l, const Point_Coordinates& r) {
		return { l.x - r.x, l.y - r.y };
	}
} point;

double Cross(const point& a, const point& b) {
	return a.x * b.y - a.y * b.x;
}

point Intersection(const point& a, const point& b, const point& c, const point& d) {
	double s, t, deno = Cross(b - a, d - c);
	point error = { INF, INF };
	if (deno == 0.0) {
		// 線分が平行
		return error;
	}
	s = Cross(c - a, d - c) / deno;
	t = Cross(b - a, a - c) / deno;
	if (s < 0.0 || 1.0 < s || t < 0.0 || 1.0 < t) {
		// 線分が交差していない
		return error;
	}
	return { a.x + s * (b - a).x, a.y + s * (b - a).y };
}
```

# まとめ
図で表すとその式が出てくる理由が透けることがあって面白いです。
AOJ埋めのんびり頑張ります。
「ゼロから作るDeep Learning」自習メモ（その４）3.6.2 ニューラルネットワークの推論処理

「ゼロから作るDeep Learning」(斎藤 康毅　著　オライリー・ジャパン刊)を読んでいる時に、参照したサイト等をメモしていきます。　[その３](https://qiita.com/slow_learner/items/9447c5717d52d3e60930)←　→[その５](https://qiita.com/slow_learner/items/4e799af75779e35abca9)

##3.6.2 ニューラルネットワークの推論処理

本来なら、訓練データで学習させてから、テストデータで推論させる、という順番なわけだが、この本では学習の前に、推論処理を説明している。

で、私の場合、テストデータの準備の部分が、本の例とは違っています。

```python
# 学習済みのニューラルネットワークで、テストデータを識別してみる
import numpy as np
import pickle
import sys, os

dataset_dir = os.path.dirname(os.path.abspath('__file__'))+'/dataset'
mnist_file = dataset_dir + '/mnist.pkl'
with open(mnist_file, 'rb') as f:
    dataset = pickle.load(f)

def normalize(key):
    dataset[key] = dataset[key].astype(np.float32)
    dataset[key] /= 255
    return dataset[key]

def get_data():
    x_test = normalize('test_img')
    t_test = dataset['test_label']
    return x_test, t_test

def init_network():
    # 学習済みの重みパラメータを読み込む
    weight_file = dataset_dir + '/sample_weight.pkl'
    with open(weight_file, 'rb') as f:
        network = pickle.load(f)
    return network

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

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y

def predict(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = softmax(a3)

    return y

x, t = get_data()
network = init_network() 

accuracy_cnt = 0
for i in range(len(x)):
    y = predict(network, x[i])
    p= np.argmax(y) # 最も確率の高い要素のインデックスを取得
    if p == t[i]:
        accuracy_cnt += 1

print("Accuracy:" + str(float(accuracy_cnt) / len(x))) # Accuracy:0.9352
```

これだけだと、どんなふうに推論しているのかよくわからないので、テスト画像と予測結果を表示してみた。

```python
# 識別結果の内容を確認してみる
import matplotlib.pyplot as plt

def showImg(x):
    example = x.reshape((28, 28))
    plt.figure()
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(example)
    plt.show()
    return

for i in range(10):
    y = predict(network, x[i])
    p= np.argmax(y)
    print("[ " + str(p) + " ]")
    print(y)
    showImg(x[i])
```

結果はこうなりました。
![p77.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686010/96a6f477-aaeb-5d0e-42e9-f2ab16995c6b.jpeg)

配列 y[7] の予測確率の数字が一番大きくなっています。その次が y[3]、y[9]となっています。

間違ったときは、どのように推論しているかも確認してみた。

```python
# 間違ったものを表示
for i in range(200):
    y = predict(network, x[i])
    p= np.argmax(y)
    if p != t[i]:
        print("正解 " + str(t[i]))
        print("[ " + str(p) + " ]")
        print(y)
        showImg(x[i])
```

![p78.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686010/34194165-dd34-d8c2-f2b1-4316a8aebe8c.jpeg)

４である確率が48%と予測している。正解の９については39%の確率と予測している。

[その３](https://qiita.com/slow_learner/items/9447c5717d52d3e60930)←　→[その５](https://qiita.com/slow_learner/items/4e799af75779e35abca9)

[読めない用語集](https://qiita.com/slow_learner/items/03eb3367119e98b5a22c)
【AWS】S3ストレージクラスについて

awsソリューションアーキテクトアソシエイトの勉強中です。

試験によく出てくる
S3のストレージクラスについてシンプルにまとめてみました。

#ストレージクラス
1.Amazon S3 standerd
一般的なS3ストレージ。
→普通のやつ。

2.Amazon S3 Intelligent-Tiering
データのアクセスパターンをモニタリングして、最も効率の良い階層へデータを保管をしてくれる。
（例：30日間利用されていないオブジェクトを低頻度アクセス階層へ移動する。など）
→データの保管コストが安くなるように、うまいこと自動でやってくれる。

3.Amazon S3 standerd IA(Infrequent Access)
アクセス頻度は低いデータ向け。
価格はGlacier以上、S3標準以下。
データをすぐに取り出せる点がGlacierとの違い。
取り出すときにも料金が発生する点も注意。
→普通のよりちょっと安い。ただ、頻繁にデータの取り出しが発生するとS3 standerdよりも高価に..?

4.Amazon S3 One-Zone IA(Infrequent Access)
Amazon S3 standerd IA(Infrequent Access)では最低3つのAZにデータを保管していたのに対して、
名の通りOne Zone(1つのAZ)にデータを保管する。
冗長性が低くなった分、Amazon S3 standerd IAより安価。
→あまり重要じゃないけど、念のため保存しておきたいデータ向け。（ログデータとか..）

5.Amazon S3 Glacier
低頻度アクセスデータ用で安価。
取り出しに数分から数時間かかるのがネック。
→安い。データの取り出しに少々時間がかかる。また、最低保存期間が90日ということも覚えておく。

6.Amazon S3 Glacier Deep Archive
Amazon S3の中で最も低コスト。
データの取り出し時間は12時間以内。
→最安。データの取り出しに半日。
Vue CLIをインストールしたらcommand not found: vueになったから解決したやり方共有！

# はじめに

本日2回目の投稿になってしまいました。
先ほど、Vue CLIを導入しようと思って、ターミナルを操作してたら、なんかひたすらcommand not found: vueになってちょっと手間取ったので、無事解決したやり方を、こちらで共有させて頂きます。

【利用環境】
MacBook pro(macOS Catalina バージョン10.15.6)
ターミナル(zsh)
node.js v12.18.2
npm 6.14.5

# Vue CLIをインストールしてみる

ターミナルに次のコマンドを入力し、インストールを試みました。

```
npm install -g @vue/cli
```
しばらく待つと...


```
+ @vue/cli@4.5.2
added 1307 packages from 704 contributors in 29.079s
```
っていうのが出てきたので、「いけた！」と思ったんです。
しかし！

```
vue --version
```
とすると...

```
zsh: command not found: vue
```

となってしまって、「vue createできないじゃん！」ってなりました。

# 解決策

次のコマンドをターミナルに入力してください。

```
export PATH=~/.npm_global/bin:$PATH
```
すると...

```
vue —version
@vue/cli 4.5.2
```
はい、解決しました！！！無事、vue createもできました！

もし、Macを利用していて同じような問題に遭遇してしまった方の手助けになれればと思います！

## 参考資料

以下のStack Overflowの質問・回答を参考にさせて頂きました！！

https://stackoverflow.com/questions/58590890/how-to-fix-zsh-command-not-found-vue
Laravelログイン機能にTwitter認証を追加するのに参考にした記事まとめ

前提、私の環境ではLaravelバージョン6.xです。
バージョン5.x以前とでは処理が違う部分があるそうさので注意。

Laravel Socialite 4.x でソーシャルログイン（OAuth認証）を行う
https://www.ritolab.com/entry/207

データベース周りはこちらの記事を参考にしました。
https://qiita.com/tetsu-upstr/items/d1cccfac362872ed140c

すでにusersテーブルは作ってしまっていたので、changeについてはこちを参考
https://qiita.com/shosho/items/a5a5839735dfef9214b1
Banking Community Cloud

With a working experience involving over 350+ banks including private, PSUs, micro finance, district central co-operatives, apex, rural, scheduled and other financial organizations, ESDS’ distinct Banking, Financial Services & Insurance (Banking) Community Cloud has been developed keeping the sector’s smallest of concerns in mind. ‘Moving to Cloud’ has emerged as an organic process for banks today to reduce costs and save resources while providing efficient and secure services. Governments too demand complete compliance and maintenance of security standards as per laws and regulations. Taking the cloud computing approach is only natural for banks today because it decreases total cost of ownership, provides more flexibility and agility as well as offers relief from software licensing management. Other benefits include reduced hardware costs and added time to focus on customer-centric and active business models. 

For more information visit:https://esds.co.in/banking-community-cloud
【AWS】Lightsail DNSゾーンとRoute53 ホストゾーンの違いは？

# はじめに
Route53でドメイン取得して、Lightsailにドメインを設定する際にLightsailのDNSゾーンとRoute53のホストゾーンの違いがよくわからずDNS設定に悩んだ為、まとめたいと思います。

# 環境
+ Lightsail
+ Route53

# Lightsail DNSゾーン
Lightsailは、AWSが提供するVPSサービスです。
Lightsailには、標準でDNS機能が含まれており、DNS管理を行うことが可能です。

Lightsailでは、DNS管理を行う際にDNSゾーンを作成します。
このDNSゾーンに対してドメインのDNSレコードを設定することでDNS管理を行います。

DNSゾーンの作成方法などについては、AWS公式サイトを参照ください。
[Amazon Lightsail でドメインの DNS レコードを管理する DNS ゾーンを作成する](https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/lightsail-how-to-create-dns-entry)

# Route53 ホストゾーン
Route53は、ドメイン取得やドメインのDNSレコード管理などが行えるサービスです。
Route53では、DNS管理を行う際にホストゾーンを作成します。
このホストゾーンに対してドメインのDNSレコードを設定することでDNS管理を行います。

# 違いは？
Lightsail DNSゾーンとRoute53 ホストゾーンは、サービスの違いによる機能差はありますが、
本質的にはドメインのDNSレコードを管理する同じ役割となるため違いはありません。
なので、どちらのサービスを利用してもLightsailへドメインの設定を行うことができます。

# 結論
Route53の機能を特に利用する必要がなく、ランニングコストを出来る限り抑えたい場合は、
Lightsail DNSゾーンを利用するで問題ないかと思います。
Lightsailの月額料金にDNS機能が含まれていますので、追加料金は発生しません。

**【補足】**
Route53でドメイン取得時にホストゾーンを作成すると月額料金が発生します。
Route53のホストゾーンを作成しなくてもLightsailへドメインの設定を行うことは可能なので、
必要ない場合はホストゾーンを削除しましょう。
Postfixでやらかさないためにメールサイズ制限を変更する

Postfix で扱うことの出来るメールサイズの上限は添付ファイルも含めデフォルトで10MBです。知ってましたか？

最近のスマホの画像は、１枚で８MB〜10MBを超えるものもあります。

Postfixでは、メールサイズ制限を超えた場合どうなるかというと、添付ファイルを削られるなどということもなく、なんとメールが飛びません。

うちの会社ではこの設定でやらかしました。

ブラウザで画像を添付してメールを送信するプログラムをPHPで組んでいたのですが、メールが飛ぶものと飛ばないものがある。
つまり制限を超えたメールだけが飛ばないという状況です。

その再現性になかなか気づかず問題解決までに数ヶ月を要しました。

お客様の受注に関連するメールフォームだったため、損害賠償問題までに発展しました、、、

よそで同じような過ちを起こしてほしくないので記録しておきます。ご注意を！

# Postfix のメールサイズ変更

`/etc/postfix/main.cf` に次の行を追記します。（ここの設定では20MB）

```
message_size_limit = 20480000
```

Postfix をリロード

```
service postfix reload
```
【GCP】Cloud Next onAir 20の「Opening Keynote」をまとめてみた

絶賛開催中のCloud Next onAir 20です。
業務でGCPを扱っていることもあり、情報収集のためにチェックしておりますが、やはり、「Opening Keynote」からみたほうがいいなと思いました。

去年はAnthosの発表があり、沸いたようですが、今年はびっくな機能の発表より、「Anthosを使ってさらにこんなことが！」「マルチ、ハイブリッド、エッジを推進するためにこんなことが！」みたいな内容が中心のようです。

以下がポイントになります。

#議事メモ
####sundar pichai　CEO
・パンデミックによる新しい働き方を支援してきた。
・Googleでもすべての業務をリモートでやるのは困難だったが、様々なツールを試験導入した
・その中で社外の方々にもどのツールが役立つのか検討した
・Chromeの配布　meetの無料開放など
・colgate netflix ツイッターでテレワークができるように支援した
・ロウズ、targetなとの小売店が需要増に対応できるように支援した
・病院システムで患者がより適切にケアできるように支援した
・イタリア、インドネシア、インディアナ州で子供たちのオンライン学習を支援
・政府への支援（失業調査の処理、司法機関の運営維持）
・これからの世の中が変わっていく部分
- 仕事のデジタル化が進む　オンライン作業、教育、医療、ショッピング、エンタテインメントの増加
　７５％の企業がDXを進めている　クラウド化が進み、２０２３年には２０％まで増加する
- コラボレーションを促進する　チームの連携、仮想コミュニティの確立、suiteやビデオ会議ツール、
　共同作業に適したツールへの進化をする
- 柔軟な働き方　予期せぬ発見を得るための時間を作る（いいアイデアが昼食時の会話、コーヒーの時間に生まれることもあった）
・業務のデジタル化、コラボレーション化、柔軟化が進み、クラウドに移行する。そのとき、セキュリティ、柔軟性、解決策を提供するパートナーが必要。
・昨年はcloud nextでAnthosを発表した。今年はデータをいつでも使用中でも暗号化することでクラウドのシステムを維持できるソリューションを発表する。
・また、マルチクラウド分析ソリューションも導入する

####Thomas Kurian　CEO
・３つの重要なケーパビリティがある
1. distributed infrastructure as aservice
2. digital transformation platform
3. industry-specific digital transformation solutions
・1について
- パブリック、ハイブリッド、マルチ、エッジとして使える
- コンピューティングソリューションの大幅強化　大規模メモリに対応　性能と費用対効果を向上
- ベアメタル環境の性能と機能を必要とする環境の運営のためベアメタルサービスの導入
　永続性ディスクの強化　データ記録と保存量の拡大
- CDNサービスの拡充　CloudArmor 
- 24テラバイト規模の大型SAPを利用できるよう最適化を図る
- IBM、UNIX、Windows、OracleのワークロードをGCPに移行して使えるようにする。簡単、早く
- セキュリティーとプライバシーについては、Confidential Computingにより、保存中、移行中、処理中のデータを暗号化する。
- 侵入の監視については、BeyondCorpだけではなく、ワークロードの実行、業界標準順守のほか、自社の標準を順守しているかも確認可能になった。
- Assured cloudでは、運用上の要件を順守しながらクラウドを運営し、業界の規制を順守しているかをテストできる。

・2について
- Anthosを使ってモダナイズする
- ハイブリッドでAnthosを使う場合、VMwareをAnthosで実行できる。Cisco,HPなどでも実行できる。
- AWSでもAnthosを実行可能。Azureはテスト中。
- DC上でデプロイ、保護、管理する単一の方法を提供。
- Anthosは開発手法のモダナイズに役立つ包括的なフレームワーク
- Anthosで運用もモダナイズが可能

- BigQuery Omni:Azure AWSのデータを分析できる、GCPに移動する必要はない
　マルチクラウドへの対応を継続的に進める。
- StreamingAnalitics:BQの100個平行ストリーム。ストリーミング分析機能の拡張。
- Natural Langage query intergaface:アナリストが簡単に質問してデータを理解するようにBQに追加。スプレッドシート、ボットと統合すればBQの分析を自動化できる。

・Gsuite essential
- meetはコロナ間無料
- コラボレーションを促進させる

・3について
- データサイエンティストを雇う必要はない
- 小売業；データと顧客を中心に添えた分析ができる
- 通信業界：５Gとエッジコンピューティングの後押しする。プライベート５Gからエッジクラウドソリューションを展開できる。
- 金融業界：顧客分析、マーケット、リスク、流動性の分析を促進。法規制への対処。
- 医療、ライフサイエンス：創薬プロセスの加速。セキュリティも徹底。遠隔治療も可能。

・グローバルセールスチームの拡張、専門分化。至急対応は１５分で返答。
[GAS] スプレッドシートで組み合わせを生成するスクリプト

## 目的
組み合わせを作りたい。

## 結論
### コード
```js
// 直積集合
function cartesian_product(array) {
  return array.reduce(function(a,b){
      return a.map(function(x){
          return b.map(function(y){ return x.concat(y) })
        }).reduce(function(a,b){ return a.concat(b) },[])
    }, [[]])
}


function convert_values_to_array(values) {
  var array = []
  for(var i = 0; i < values.length; ++i){
    if( values[i][0] === ''){
      // pass
    } else {
      array.push(values[i][0])
    }
  }
  return array
}


function generate_combination() {
  const book = SpreadsheetApp.getActiveSpreadsheet()
  const sheet = {
      from: book.getSheetByName("from_name"), 
      out: book.getSheetByName("out_name")}
  // 出力先シートをきれいにしておく
  sheet.out.clear()

  const row = {
      first: 1, // Headerがあれば2 / なしなら1
      last: sheet.from.getLastRow()}
  const values = sheet.from.getDataRange().getValues()
  var array = []

  for (var j = 0; j < values[0].length; ++j) {
    array.push(convert_values_to_array(sheet.from.getRange(row.first, j+1, row.last).getValues()))
  }
   
  const r = cartesian_product(array)
  sheet.out.getRange(1, 1, r.length, r[0].length).setValues(r)
}
```

### from データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219427/07629d7a-474c-8595-3756-b930569dc936.png)

### out データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219427/c5978f2b-e966-e814-e695-ea274e8ba8d0.png)




## 概説。
(実は、若干見様見真似なので、自分でも理解しきっていないところがあります。すいません。)
直積集合使えるよ? みたいなことを、高専時代の同期に言われたので、色々検索したところ、それっぽいのにあたりました。

[Stack Overflow - Cartesian product of multiple arrays in JavaScript](https://stackoverflow.com/questions/12303989/cartesian-product-of-multiple-arrays-in-javascript)

ここの部分。


```js
function cartesian_product(array) {
  return array.reduce(function(a,b){
      return a.map(function(x){
          return b.map(function(y){ return x.concat(y) })
        }).reduce(function(a,b){ return a.concat(b) },[])
    }, [[]])
}
```
tarコマンドのエラー(未解決)



# はじめに

前回のチュートリアルに引き続き、SageMakerを触ってみたいという思いから資料を探してみたところ、機械学習を利用した画像判定Webアプリケーションの作成を行う[ハンズオン資料](http://www.intellilink.co.jp/article/column/ai-ml01.html)を発見した為、実施してみる事にしました。
しかし、SageMakerの実行途中でエラーが発生し、解消する事が出来なかった為断念しました。本記事では発生したエラー事象について記載します。

以下、構築予定だったアーキテクチャの概要です。

![ai-ml01-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646352/44cf2c8d-83dd-8cd0-4f50-0f582caa37e5.png)

(http://www.intellilink.co.jp/article/column/ai-ml01.html より引用)

また、以下が開発するWebアプリケーションの完成形イメージになります。
画面左側で判定したい画像を選択し、画像に何が写っているかの判定結果を画面右側に表示する仕組みです。

![ai-ml01-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646352/25fb4281-d124-9143-aea9-81c1955200e9.png)

(http://www.intellilink.co.jp/article/column/ai-ml01.html より引用)



# 本編

[ハンズオン資料](http://www.intellilink.co.jp/article/column/ai-ml01.html)を参照し、
- S3作成
- SageMakerによる機械学習部分の実施

と進めていったが、SageMakerを実行した所、エラーが発生している事を確認。

ログを確認すると、以下の実行部分でエラーが表示されている。

```
%%bash

mkdir -p caltech_256_train_60
for i in 256_ObjectCategories/*; do
    c=`basename $i`
    mkdir -p caltech_256_train_60/$c
    for j in `ls $i/*.jpg | shuf | head -n 60`; do
        mv $j caltech_256_train_60/$c/
    done
done

python im2rec.py --list --recursive caltech-256-60-train caltech_256_train_60/
python im2rec.py --list --recursive caltech-256-60-val 256_ObjectCategories/
```

エラー文言は以下。

```
ls: cannot access 256_ObjectCategories/*/*.jpg: No such file or directory
```


更に確認を続けていると、1つ前の実行部分が、中断はされていないものの以下のメッセージを出力していた。以下は実行部分。

```
import os
import urllib.request

def download(url):
    filename = url.split("/")[-1]
    if not os.path.exists(filename):
        urllib.request.urlretrieve(url, filename)


# Caltech-256 image files
download('http://www.vision.caltech.edu/Image_Datasets/Caltech256/256_ObjectCategories.tar')
!tar -xf 256_ObjectCategories.tar

# Tool for creating lst file
download('https://raw.githubusercontent.com/apache/incubator-mxnet/master/tools/im2rec.py')
```


メッセージは以下。

```
tar: This does not look like a tar archive
tar: Skipping to next header
tar: Exiting with failure status due to previous errors
```

tarの解凍コマンドを実行しているが、対象ファイルがtar形式ではないので処理をスキップしている、とのこと。


- tarファイルではない？  
→対象を確認したが、tarファイルだった  
- 権限等の原因でダウンロード出来ていない？  
→tarコマンドなしで実行したが、問題なくダウンロードできた  
- tarコマンドのオプションが間違っている？  
今回のtarコマンドのオプションは以下。  
x：アーカイブされたファイルを解凍し展開・復元を行う  
f：アーカイブファイル名を指定する  
→コマンドfを外して実行してみた所、上記メッセージは出力されなくなったものの終わらず。

調べてみると、tar.gzになっていると上手く解凍できない事があるようだが今回gzip圧縮もされておらず。。。
断念し一旦中断。
【Vuex】Stateを丸ごと置き換える

#Good:ok_hand:
`Object.assign`を使って置換できます。

```js:mutation.js
export default {
  replaceState (state, { value }) {
    Object.assign(state, value)
  }
}

```


# Bad:thumbsdown:


Vuexでstateを置き換えたいときに、
以下のように代入してもうまく動作しません。

```js

export default {
  replaceState (state, { value }) {
    staet = value
  }
}
```
『GAFAコーディング面接こんな感じでした』を読んで

[GAFAコーディング面接こんな感じでした - yambe2002’s diary](https://yambe2002.hatenablog.com/entry/2020/06/12/113056) を読んで、課題のコードを書いてみる気に。

元記事だと「URL の履歴を保存するデータ構造」が**ひとつ**だけど、**ふたつ** (進む用 + 戻る用) に分割した方が良さそう。

あと、今更 **React** のチュートリアルを読んだので、練習を兼ねて。

ついでに **Bootstrap 5 alpha** もチラ見しよう。

# Web ブラウザの履歴を管理するようなコード

比較用にいくつか書いた。

- CodePen
    - [jQuery × Bootstrap 4](https://codepen.io/desktopbomb/pen/MWKeaEz)
    - [React (Class Component) × Bootstrap 5 alpha](https://codepen.io/desktopbomb/pen/mdPJvVL)
    - [React (Hooks) × Bootstrap 5 alpha](http://codepen.io/desktopbomb/pen/MWyKbBY)

# 感想

## Bootstrap 5 alpha

### [v4 と v5 の差異](https://v5.getbootstrap.com/docs/5.0/migration/)

- v4 からの破壊的変更は少なめ
- 気になった点は以下
    - [Custom forms](https://getbootstrap.com/docs/4.5/components/forms/#custom-forms) 廃止 (通常のフォームに統合)
    - フォームのレイアウト周りの廃統合
        - `.form-row` -> `.row`
        - `.form-group` -> `.mb-3`
        - `.form-inline` -> `.col-auto` など
        - フォームラベルに `.form-label` が必要に
        - cf. https://v5.getbootstrap.com/docs/5.0/forms/layout/
    - `.form-control-file` -> `.form-file`
    - `.form-control-range` -> `.form-range`
- IE 11 などのサポート終了
    - とはいえ、結局どうなる？
        - [Bootstrap 5 dropping IE 10 & 11 browser support: where does that leave us? - Themesberg Blog](https://themesberg.com/blog/bootstrap/bootstrap-5-ie-11-browser-support)
        - [Internet Explorer 11 and Polyfills for Bootstrap 5 · Discussion #31222 · twbs/bootstrap · GitHub](https://github.com/twbs/bootstrap/discussions/31222)
- jQuery 廃止
    - DOM API (Vanilla JS) が高速なのは分かるし使うけど、書き易くはない。。

## React

### [state と props の違い](https://ja.reactjs.org/docs/thinking-in-react.html#a-brief-interlude-props-vs-state)
- `state`
    - コンポーネント内部で使うプライベート変数のようなオブジェクト
    - 変更は必ず `setState()` メソッドを使うこと
- `props`
    - 別のコンポーネントから渡される、読み取り専用のオブジェクト

### [React と HTML における属性名の差異](https://ja.reactjs.org/docs/dom-elements.html)

- `class` -> `className`
- `for` -> `htmlFor `
- `readOnly` -> `readOnly` など

### [フック](https://ja.reactjs.org/docs/hooks-overview.html)

- **関数コンポーネント**を使って、クラスコンポーネントより完結に書ける機能
  - 他にも色々便利らしい
  - `this` が不要になるだけで嬉しい
  - 今から書くなら、クラスコンポーネントより**フック**を使えとのこと
- 公式ドキュメントは分かりづらいので、以下を参考に
    - [5分でわかるReact Hooks - Qiita](https://qiita.com/Mitsuzara/items/98d1bc4a83265a764084)
    - [React Hooks、関数コンポーネントを使ってみた - Qiita](https://qiita.com/d0ne1s/items/2d6cc5cc577e290537c5)
- ただし、公式の [フックの FAQ](https://ja.reactjs.org/docs/hooks-faq.html) は良かった
- CodePen で `import React, { useState } from "react";` を使うには  
    `const { useState } = React;` と書く

### jQuery との比較

- JSX とコンポーネントにより、JS 上での **CSS セレクターによる要素の指定がほぼ不要**に。
- `sate` オブジェクトで状態を保持して、それを更新するだけで**自動的に DOM 側にも反映**できるので簡潔に記述できる。

### TODO

- コンポーネントをもっと分割できるのか？
- フォームの検証はどう書くのが良いのか？
- 良いコードをもっと読まないと。
教科書に出てくる等高線を描いてみる(Python)

この記事は[教科書に出てくる等高線を描いてみる(Fortan+gnuplot)](https://qiita.com/yotakagi77/items/8333e6c0d8c495467add)の続編です．

# はじめに

筆者は大学の工学部で習う流体力学を勉強しているが，流体力学の最初のほう(完全流体の理論)では速度ポテンシャル $\phi$ や流れ関数 $\psi$ といった物理量が現れ，それらの量を用いた代表的な流れの例がいくつか出てくる([二重わき出し](https://ja.wikipedia.org/wiki/%E3%82%8F%E3%81%8D%E5%87%BA%E3%81%97)など)． これらの量の2次元での等高線が教科書の図として載っているが，自分でも作図できたら理解が深まるような気がする．しかしながら，関数 $y = f(x)$を手軽に描画できるグラフソフト・サービスでは，2次元面でのある物理量の等高線を描くのは難しいことが多い．前回の記事ではFortran+gnuplotで描画してみたが，やはり人気があるプログラミング言語でやってみたいので，今回はPythonを用いて等高線を描いてみる．

# 事前準備: Pythonと必要なモジュールのインストール

Pythonはマルチプラットフォームなので各環境に合わせてインストールを行う．Pythonのインストール方法は色々あるので自分で調べて良さそうなものを選んで欲しい．インストールが難しそう or PCに色々インストールしたくない，という人には[Google Colaboratory](https://colab.research.google.com/notebooks/intro.ipynb)の利用をおすすめする．

Python本体以外に，モジュールとしてnumpyとmatplotlibが必要である．OSに元々入っているPythonなどを利用する場合は追加インストールする．

# 対象とする流れ場

前回の記事と同じ吹き出し・吸い込みについて対象とする． 原点からの距離を $r$ とすると， 3次元での速度ポテンシャル $\phi$ は以下のように表せる．
$$
  \phi = -\frac{m}{r},\, r = \sqrt{x^2+y^2+z^2} \tag{1}
$$
ここで$m$は吹き出しの強さと呼ばれる係数である．2次元での等高線が描きたいので， $z=0$ として，
$$
  \phi = -\frac{m}{r},\, r = \sqrt{x^2+y^2} \tag{2}
$$
を描画してみる．

# 作業方針

Pythonのmatplotlibモジュールは各種の描画をできるので作業はPythonのみで解決する．

1. numpyの機能で2次元の格子点(等間隔のマス目)を作成し，各格子点での $\phi (= \phi_{i,j})$の値を計算する．
2. matplotlibの機能で等高線を描画する．

という流れでPythonスクリプトを作る．高度なことはしないので，オブジェクト指向などは考慮しない．

![grid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128259/e15e5ffb-bd7f-f73f-2f26-319bb0214f87.png "2次元格子")

# Pythonスクリプト

以下にスクリプト例を示す．

**contour.py**

```Python
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

xmin = -10.0
xmax =  10.0
ymin = -10.0
ymax =  10.0
delta = 0.1
x = np.arange(xmin,xmax,delta)
y = np.arange(xmin,xmax,delta)

m = 1.0
X, Y = np.meshgrid(x,y)
r = np.sqrt(X**2 + Y**2)
Z = -m/r

fig, ax = plt.subplots(figsize=(6,6))
levels = np.arange(-1.0,0.0,0.2)
cont = ax.contour(X,Y,Z,levels)
cont.clabel(fmt='%1.1f', fontsize=12)
plt.show()
```

最初に$x$，$y$に座標値を入れ，$X$，$Y$が格子点に変換したものである．matplotlibのグラフ描画では2つの流儀があるが，Artistオブジェクトを使う方法を用いている．等高線に数値を入れられるのはmatplotlibの長所の一つなので入れておいた．

端末で上記スクリプトを実行するのは以下のとおりであり，等高線図が別ウィンドウで現れる．

```bash
python contour.py
```
![c2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128259/244cd6f6-b18d-3923-0ca3-385c5f99fb76.png)

画像を保存したい場合はこの描画ウィンドウで保存(Save)ボタンを押して保存するか，スクリプト最後の`plt.show()`を以下に変更する．

```Python
plt.savefig('c2.png')
```

# まとめ

Pythonのmatplotlibの機能を用いて等高線を簡単に描画する方法を紹介した．今回はmatplotlibの設定に関して必要最低限のものしか設定していないが，matplotlibはグラフの隅々まで詳細に設定できるので，こだわれば教科書に載っている図を正しく綺麗に描画することも可能である．
Python初心者によるDjango超入門！その３ テンプレートファイルの継承機能を使ってみた

# 本記事について
UdemyでDjangoについて学習した結果のアウトプットページです。
<a href=https://qiita.com/drafts/903397960d7164ff31ac/edit>前の記事</a>の続きになります。
今回は、Djangoのテンプレートファイルの継承機能を使ってみようと思います。

#urls.py
今回はテンプレートファイルの継承機能の説明になるため、ulrs.pyは前回と同じです。

```first\myapp\urls.py
from django.urls import path
from . import views

app_name = 'myapp'

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

# views.py
views.pyも前回と同じですが、念のためコードは下記になります。

```first\myapp\views.py
from django.shortcuts import render

def index(request):
    context = {
        'names':['鈴木','佐藤','高橋'],
        'message':'こんにちは。',
    }
    return render(request, 'myapp/index.html', context)
```

# ベースとなるHTMLファイルを作る
継承元となるHTMLを作ります。
作成場所は、前回作ったindex.htmlの1個上のフォルダになります。
同じフォルダではないので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/b018fea6-76ad-40b7-7bfb-6c94f264ac04.png)

作成出来たら以下のコードを記入します。

```first\myapp\templates\base.html
<html>
    <head>
        {% block title %}
            <title>継承元ページ</title>
        {% endblock %}
    </head>
    <body>
        <h1>Django勉強ページです</h1>
        <div>
            {% block body %}
            {% endblock %}
        </div>
    </body>
</html>
```

ポイントは2つ。
head部分に``{% block title %}{% endblock %}``を記入することと、
body部分に``{% block body %}{% endblock %}``と記入することです。
次は継承先となるindex.htmlを編集しましょう。

# 継承先テンプレートファイル(index.html)の編集
前回の記事でも作りましたが、ファイルの場所は下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/059a9cb4-74c2-722a-8b06-5314e93a3f6a.png)

ファイルを開いて、以下のように記述します。

```first\myapp\templates\myapp\index.html
{% extends "base.html" %}

{% block title %}
    <title>Django勉強ページ</title>
{% endblock %}

{% block body %}
    <p>{{ names.0 }}さん。{{ message }}</p>
    <p>{{ names.1 }}さん。{{ message }}</p>
    <p>{{ names.2 }}さん。{{ message }}</p>

    <hr>

    {% for name in names %}
        <p>{{ name }}さん。{{ message }}</p>
    {% endfor %}
{% endblock %}
```

コードの解説です。
まず、``{% extends "base.html" %}``で先ほど作成したテンプレートファイルを継承します。よくやるミスが間違った場所にbase.htmlを置いてしまいエラーになるケースです。

続いて、``{% block title %}{% endblock %}``の中にtitleタグを入れています。
これは、index.htmlページ独自のタイトルを入れる意味になります。
index.html以外にhtmlページを作成し、違うタイトルにしたい場合などに役に立ちます。
何も記入しないと、base.htmlにあるtitleが反映され「継承元ページ」と表示されます。

続いて、前回作成したbody部を丸ごと``{% block body %}{% endblock %}``で囲みます。
これもtitleと同じです。index.htmlページ独自のbodyを記述するという意味です。

その外にもよくやるのがナビ部分を継承させたり、フッター部分を継承させたりします。
継承機能を利用することで、ページの一部に変更があっても全体に反映がさせやすくなります。
Djangoには色々な機能がありますが、継承機能は必ず利用する機能だと思います。

# 動作確認
py manage.py runserverで開発用サーバーを起動し、動作確認します。
base.htmlにだけ記入した「Django勉強ページです」と記載され、
ページタイトルが「Django勉強ページ」と表示され、
body部が正常に表示できていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/2428d47c-2ea1-3a41-0f95-bacc410f8635.png)


# 次の記事
https://qiita.com/sw1394/items/c81aa8685e003ea9f246