OmniAICreator/Qiita-1.07M huggingface dataset:
SSH接続時にIt is required that your private key files are NOT accessible by others. This private key will be ignored.が出たときの対処法

#### はじめに
コンソールからAWSのインスタンスにSSH接続をしようとした際、下記のエラーが出た時の対処法です。

```
$ ssh -i key.pem ec2-user@XX.XXX.XX.XX   
                                                                                        
Warning: Permanently added 'XX.XXX.XX.XX' (ECDSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "XX.XXX.XX.XX.pem": bad permissions
ec2-user@XX.XXX.XX.XX: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

#### 対処法

エラーの原因としては秘密鍵のパーミッションがオープンすぎるという事なので、パーミッションを変更してあげましょう。

```
$ sudo chmod 0600 key.pem
```

これで無事にSSH接続ができるかと思います。

```
$ ssh -i key.pem ec2-user@XX.XXX.XX.XX  
                                                                                                      
Warning: Permanently added 'XX.XXX.XX.XX' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|
ライブラリを利用してProgressBarを実装

#はじめに
現在開発中のカウントアプリにあとゴールまでどのぐらいなの感覚的に伝えるためにProgressBarを導入する事にしました。
この記事では、その際に試した事をアウトプットしようと思います。
#完成形
<img width="300" alt="ezgif-6-e8bc45d9fe83.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930365/e4684a13-6b6f-f0bf-5492-d0a3ace7f7ae.gif">

#使用したライブラリ
・MBCircularProgressBar
→https://github.com/MatiBot/MBCircularProgressBar

#CocoaPodsを利用してインストール
CocoaPodsを使用してSwiftConfettiViewをインストールしてください。

```
pod "MBCircularProgressBar"
```
Podfileに上記を入力して``pod install ``。

#Storyboardにパーツを配置
<img width="300" alt="スクリーンショット 2020-12-30 19.10.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930365/570951bd-34e7-5f34-9308-fc43bde4c237.png">
ViewをViewContorollerに配置します。
![スクリーンショット 2020-12-30 19.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930365/c8a7d4dc-7e8d-5017-22aa-6351c968a558.png)
Custom ClassのClassを``MBCircularProgressBarView``に設定します。
<img width="300" alt="スクリーンショット 2020-12-30 19.17.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930365/9a7778aa-9e01-289c-a932-9b0744e9d797.png">
円形のProgressBarが現れます。
<img width="300" alt="スクリーンショット 2020-12-30 19.22.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930365/9285e37e-a712-df97-3177-84564a8bfa8d.png">
ButtonやTextFieldを設置。

#コーディング
```Swift:
    var number: Float = 0
    var paersent: Float!
    var targetNumber: Float!
    @IBOutlet weak var targetNumberTextField: UITextField!
    @IBOutlet weak var countNumberLabel: UILabel!
    @IBOutlet weak var progressView: MBCircularProgressBarView!
```
変数を宣言し、パーツを関連付け。

```Swift
 @IBAction func countButton(_ sender: Any) {
        //目標回数を取得
        targetNumber = Float(targetNumberTextField.text!)
        //numberに１をたす
        number += 1
        //numberに１をたした数を表示
        countNumberLabel.text = "\(number)"
        //パーセンテージを計算
        paersent = number / targetNumber * 100
        //パーセンテージを表示
        progressView.value = CGFloat(paersent)
    }
```
countButtonを押した時の処理。

```Swift
    @IBAction func resetButton(_ sender: Any)
        number = 0
        progressView.value = CGFloat(number)
    }
```
resetButtonを押した時の処理。

#まとめ
今回は、目標回数を設定しあとどれくらいなのをパーセントで見える化しました。
このライブラリは、バーの色などもカスタマイズすることもできます。カスタマイズについては下記のURLを参考にしてみてください。

#参考
・MBCircularProgressBar
→https://github.com/MatiBot/MBCircularProgressBar
・[iOS][Swift] MBCircularProgressBar で円形のプログレスバーを実現！
→https://dev.classmethod.jp/articles/mbcircularprogressbar/
・円型のプログレスバー実装（MBCircularProgressBar）
→https://qiita.com/Walkdream24/items/440b1c2757048b340920
授業メモ4



# rakeの使用

　rakeは自分でやりたい処理に対して名前を与えて,その名前が入力された時に処理を行うものっぽい.　C言語とかでいうと関数に近いと思います.間違ってたらごめんなさい.


# 共有の短縮

　ここではrakeを用いて[授業メモ2](https://qiita.com/adchello/items/c75ff7218c8e47d57da5)の共有方法で紹介した,githubの共有方法に名前を与えて楽にしてみる.

  以前の共有方法だと4,5行もコードを打つ必要があり,その間に他の生徒が共有しようとするとエラーがでてしまっていた.　そのため、時間短縮を行い相互に共有動作をスムーズにした方がよい.

> desc 'git pull'

> task :pull do

>  p comm = "git pull origin main "

>  system comn

>  exit

> end

　上記を行うことで,origin main を簡略化することができた.この調子でpush動作も簡略化していく.

> desc 'git push'

> task :push do

>  p comm = "git add -A"

>  system comm

>  p comm = "git commit -m \\'hoge hoge\\'"

>  system comm

>  p comm = "git pull origin main"

>  system comm

>  p comm = "git push origin main"

>  system comm

>  exit

> end

　上記によって,git pushと入力するだけで以下の4文を同時に行うことができる.　これにより,時間短縮と共有の効率化が行えた.

　ターミナル上でrakeと入力すると現在使えるrakeコードを見ることができる.

> rake

>rake pull   # git pull

>rake push   # git push



------
 - **source** ~/grad_members_20f/members/adchello/test3.org
軽量なSTNSのDockerイメージを作る

STNSサーバのDockerイメージが大きいので軽量なDockerイメージを作った．

[cdsl-research/stns-container](https://github.com/cdsl-research/stns-container)

# 構成

マルチステージビルドを使うことでビルド環境と実行環境を分離した．

- マルチステージビルド
    - ビルド時イメージ: golang:1.15.6-alpine3.12
    - 実行時イメージ: alpine:3.12

# 比較

公式の提供するDockerイメージに比べて**68%のサイズ削減**を実現した．

```bash
$ docker images | grep stns
stns-server                                                      latest                                           98a315731b33   41 minutes ago   69.2MB
stns/stns                                                        latest                                           597e448def6a   9 days ago       219MB
```

# Dockerfile

```dockerfile
FROM golang:1.15.6-alpine3.12 AS builder
WORKDIR /tmp
ENV BUILD=/artifacts
RUN apk --no-cache update && \
    apk --no-cache upgrade && \
    apk --no-cache add make alpine-sdk gcc openssl libcurl git && \
    git clone https://github.com/STNS/STNS.git && \
    cd STNS/ && \
    mkdir -p $BUILD && \
    make install MODDIR=$BUILD BINDIR=$BUILD

FROM alpine:3.12
EXPOSE 1104/tcp
WORKDIR /stns
COPY --from=builder /artifacts /stns
COPY config.toml /stns
ENTRYPOINT ["/stns/stns", "--config", "/stns/config.toml", "server"]
```
javascriptにおけるメソッド

#splice
配列から要素を取り除いたり、置き換えたり、追加したりするメソッド。

配列.splice()と記述する。

４つまで引数を記述することができ、第一引数は必須で、指定した数字以降の要素を取り出す。
第二引数は、第一引数で指定した要素以降から指定分だけ取り出す。
第三引数以降は、第一引数で指定した位置以降に、その値を配列に追加する。
参考)https://techacademy.jp/magazine/37922

spliceの返り値は配列で返ってくる。なので数値で返り値が欲しい場合は、配列の一番目を取り出すという意味で[0]を付けてあげる。
参考）https://dotinstall.com/lessons/bingo_js/55004


#JavaScriptからhtmlに画像を埋め込む

html

```
<img id="main">
```

javascript

```
const images = [
    'img/pic00.png',
    'img/pic01.png',
    'img/pic02.png',
    'img/pic03.png',
    'img/pic04.png',
    'img/pic05.png',
    'img/pic06.png',
    'img/pic07.png',
  ];
let currentIndex = 0;

const mainImage = document.getElementById('main');
mainImage.src = images[currentIndex];
```

①htmlのidをまずは取得して、キャッシュする
②そのキャッシュした値に.srcを付随させて配列に入れておいた画像を選択する。

また、JavaScriptでsrc属性の値を取得・変更する方法は以下のサイト参照。
参考）http://sarchitect.net/10364

#forEach
配列に格納されたデータを一気に取り出す。

```
構文
配列.forEach(function(item,index)){
 // itemに関する処理
}
```

```
使用例
var fruits = [ "apple", "orange", "melon" ];
   fruits.forEach( function( item ) {
   console.log( item ); 
 });

実行結果
apple
orange
melon
```

また、forEach()で渡す引数を2つにすると(構文のindexのこと)、この配列の中で何番目であるかを2番目の引数であるindexで表現できるようになる。
参考)https://techacademy.jp/magazine/14635

#classlist
特定のクラスを追加したり、削除したりするプロパティ。

参考）https://qiita.com/tomokichi_ruby/items/2460c5902d19b81cace5
https://techacademy.jp/magazine/27026
homebrewで学ぶ「PATHの通し方」

##この記事で学べること
現在、この記事を訪れた方は

```Bash
-bash: xxxx: command not found
```

というエラーにぶち当たっていると思います。
そして今まではこのようなエラーが出てきた時に
「エラー→検索→コピー→よくわからないけど解決」
という感じでやってきたのではないでしょうか？（今までの私がそうでした...）

この記事を見ることでその状態から
「エラー→検索→コピー→__理解__→解決」あるいは
「エラー→__考える__→解決」という状態になることができます。
つまり、PATHとはこのように通すのか！というのがわかるようになります！

##実例から学ぶ
それでは私の実例からPATHの通し方を学習していきましょう。
###どんなエラーが出たか
私は本日MacBook Airを購入し、homebrewを入れたいと思い、[このサイト](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)を見ながらインストールを行なっていました。
するとこのような画面に

```Bash
Warning: /opt/homebrew/bin is not in your PATH.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
```

なんかWarning出てるけど成功してるし、大丈夫か！と思い、次のコマンドを実行すると

```Bash
MacBook-Air:~ username$ brew install
-bash: brew: command not found
```

あれ、brewがない...

###PATHとは？
PATHとは別名環境変数とも言います。
そう、__変数__なのです！
プログラミングで変数と言えば、「__同じものを何回も書くの面倒くさいからある言葉に置き換えて使おう__」のように使われます。
それと同様、PATHも__同じことを何回も書くの面倒くさいから省略しよう！__みたいな感じで存在しています。

さて、__brew__を実行するためにはbrewがどこにあるか知っている必要があります。
上のエラーを頼りに探してみると、__/opt/homebrew/bin/__のところにありました。

```Bash
MacBook-Air:bin username$ /opt/homebrew/bin/brew -v
```
これを実行してみると、うまくいきました！

###PATHの調べ方
__brew -v__が実行できない理由はどうやら変数がうまく設定できていないことによるものだと考えました。
色々調べると、下記コードで変数が調べられるようです。

```Bash
$echo $PATH
```

実行するとたくさんのPATHが出てきました。

```Bash
-bash: /usr/local/bin:/usr/bin:/bin:/usr/sbin: ・・・
```

これはつまり
* /usr/local/bin/xxxxxx
* /usr/bin/xxxxxx
* /usr/sbin/xxxxx
の__xxxxxの部分にファイルがある場合は省略して実行できるよ__と言うものになります。
なのでここに/opt/homebrew/bin/を追加してあげればよさそうです。
###PATHの追加方法
[この記事](https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015)を参考にしました。

```Bash
export PATH="$PATH:/opt/homebrew/bin/"
```

このように入力することで環境変数「__$__」に/opt/homebrew/bin/を追加するよ、と言う命令を下すことができます！

##参考文献
https://qiita.com/zaburo/items/29fe23c1ceb6056109fd
https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015
授業メモ3



# rubyの利用

　私はここまででもお腹いっぱいだったのですが,ここまでが準備だったらしいです.

　次はrubyを用いた文字の入出力を行う.


# Hello worldの出力

　いろんな方法を使ってHello worldを出力してみる.

> puts Hello world

> print Hello world

> p Hello world

> printf Hello world

　上記の方法を用いて

> ruby output.rb

　を実行すると,すべてにおいてHello worldが正常に出力された.

　個人的にはC言語を長く使用してきたのでprintfが楽そうだと思った.


# 文字の入力

　いろんな方法を使って文字を入力してみる.

> printf "Hello #{ARGV[0]}"

> ruby input.rb world

　からHello worldが出力される.

　もう一つ紹介するとgetsを用いる方法がある.

> aaa = gets> printf "Hello #{aaa}"

　ここでworldと入力すると,aaaという変数の中にworldが入る.そして次のprintfで　正常にHello worldが出力される.


# 条件文

　C言語でもよくあった条件文のif,elseif,if-elseが使えるらしい.

　練習としてうるう年の課題をやってみる.

　完成したら2004,1999,1900,2000を試してtrueかfalseを返す.

> p year = ARGV[0].to<sub>i</sub>

> if year % 4 == 0

> printf true

> end

　上記のプログラムは4で割り切れる年が入力されるとtrueが返される条件文が含まれている.

　次に4で割り切れない年に対してはfalseを返す条件を追加する必要がある.

> p year = ARGV[0].to<sub>i</sub>

> if year % 4 == 0

> printf true

> else

> printf false

> end

　これで4で割り切れるときはtrueを,割り切れないときはfalseを返す条件文ができた.

> ruby check<sub>leap</sub><sub>year.rb</sub> 2004

> true

> ruby check<sub>leap</sub><sub>year.rb</sub> 1999

> false

　2004と1999で試すと予想通りの結果が返ってきた.



------
 - **source** ~/grad_members_20f/members/adchello/test2.org
Pythonの試行で使用する.pyファイルの定型(テンプレート) - 2020年

Pythonの試行で使用する.pyスクリプトの定型コード(テンプレート)。以下、定型.pyの欄を参照。

## コードのスタイル

`run__main1()`等で、複数の試行処理を分けて書き、`main()`関数内で`run__main1()`等をコメント/コメントアウトで切り替えて、実行する関数を切り替えるスタイル。コーディング時、エディタ内で関数名`run__main1`等を検索・ジャンプして、`main()`関数内の切り替え状態を確認、もう一度ジャンプすると元の`run__main1`関数位置まで戻って、編集続行するスタイル。

関数は、`def func1(x,`の上のコメント`# ○○の機能`のように、関数定義の上の行に、その関数の簡単な(特徴的な)説明を付加するスタイル。関数のすぐ下には、`def test__func1():`のようにテスト関数(機能が単独で確認できる実行コード)を常に合わせて書いておくスタイル。テスト関数のコードが、その関数の代表的な使い方を表すコード例にもなるのでなお有用。テスト関数は、`# main = test__func1`のように、mainを上書きする形で実行させるスタイル。このテスト関数の実行時は、コメントを外して`main = test__func1`とすることで、テスト関数`test__func1`のみが実行されるように切り替わる。

matplotlibのグラフの定型コード、numbaの高速化の定型コード、を末尾に付随、不要なものは要削除。

## コードの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/a2cd1844-2cc0-88a2-ede0-6ba99c3aa072.png)

## ソースコード 定型.py

```Python:定型.py

# -*- coding: utf-8 -*-

# ○○の試行

# 結果: ○○

# import例: (不要なものは要削除)
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numba

# sec: main

def main(): # 実行切替用
    run__main1()
    # run__main2()
    # run__main3()

# ○○の試行
def run__main1():
    # 結果: ○○

    # sec: config

    pass
    
    # sec: run

    pass

    # sec: draw
    
    pass

"""コンソール出力例:
○○
"""

# ○○の試行
def run__main2():
    pass

# ○○の試行
def run__main3():
    pass


# sec: ○○の機能

# ○○の機能
def func1(x, # 必須引数の説明1
    y = 0, # オプションの説明1
    z = 0): # オプションの説明2
    pass

def test__func1():
    pass
# main = test__func1


# sec: グラフ定型

def draw__main1():
    fig = plt.figure(tight_layout=True)
    ax = fig.add_subplot(111)
    ax.plot((0, 1), (2, 3), "r-o")
    ax.grid()
    # ax.annotate("test", xy=(0.2, 2.2), ha='left', va='top')
    # ax.axis("equal")
    # ax.legend(fontsize=9, framealpha=0.5, labelspacing=0.2)
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    fig.savefig("test.png")
    plt.show()

# sec: Numba定型

@numba.jit(nopython=True, nogil=True, cache=True) # 高速化部のみ関数を分離 約50倍高速に
def numba_func(x):
    pass

# sec: entry

if __name__ == "__main__": main()
```
個人アプリ開発日記 #2

#目次
[1.はじめに](#1-はじめに)
[2.制作背景](#2-制作背景)
[3.おわりに](#3-おわりに)

#1. はじめに
昨日の記事[（個人アプリ開発日記 #1）](https://qiita.com/shimataro1988/items/fd9650906d530016e574)では、転職活動を間近に控える私が
ポートフォリオとして制作中のアプリについて概要を説明しました。
そして、今回は「なぜこのアプリを作るに至ったか」について深掘りしていきます！

自分の振り返りと理解を深めることで、今後のアプリ制作に活かしたいと考えています。
内容には個人的なことなので再現性は低いかもしれないのですが、制作背景から
アプリ開発に至るまでのプロセスで、悩んでいる人や困っている人の参考になれば嬉しいです。

#2. 制作背景
ポートフォリオとしてアプリを作る際に、どのようなものを作れば良いか最初は全く分かりませんでした。
よく、スクールの卒業課題の「フリマアプリのクローン」に手を加えた物をポートフォリオとして
提出する人が多いことは、Twitter等の媒体を通じて知っていました。

私自身、初学者の身なので上記に対して何も意見できる立場にないですが、せっかく作るのであれば
新規事業を立ち上げるようなつもりで（大袈裟？）、０から始めたいという思いだけは強く持っていました！
とは言うものの、これまで特別な人生経験をしてきたわけでも、圧倒的な知識があるわけでも、
卓越した発想力もないので、アイデアが浮かばずに１ヶ月ほどモヤモヤした日々を過ごしていました。

その原因について自分なりに分析してみたのですが、「不特定多数の壮大な人」を無意識の内に
ターゲットに設定してしまっているからではないかと感じました。それは、日頃自分が利用する
アプリやサービスが大衆に支持されている一般的なモノが大半を占めているからだと思います。
そこで、「不特定多数」ではなく「自分の身近な人」の何かしらの課題を解決する、
あるいは生活を少しでも豊かにするものを作りたいと思うようになりました。

そう思い周りを見渡してみると、私の母親は現在父親の都合により大分県に移住しているのですが、
周りに知り合いがおらず日々寂しい思いを抱えながら生活していることを知りました。
昨年還暦を迎えたこともあり、年齢を気にして地域の行事やイベントなどにも顔を出すことを躊躇して、
同年代のママ友のような存在が欲しいができずに困っている様子でした。

また、私の従兄弟は大学1年生なのですが、新型コロナウイルスの影響で入学式や新歓などのイベントが
全てオンラインになったことで、大学で友達ができず大学に行く意味を見失っていました。
彼は友達をたくさん作って華やかに学生生活を謳歌することを思い描いて入学していました。

この2人の話を聞いて、私はある共通する問題に気付きました。
それは「人との繋がりを欲しているが機会に恵まれていない」ことです。
その気づきを得た瞬間、私はこれをアプリのテーマにすることを決断しました。

理由は、私は元々人と話すことが好きで、大学時代のアルバイトも高級シティホテルの配膳スタッフや
居酒屋のホールを経験していました。そして、会社員としても9年ほど営業職をしています（現在も就業中）。
学生時代から周りの人に恵まれていたことに感謝すると共に、人に関するテーマに取り組みたい
気持ちを漠然と持っていましたので、点と点が繋がって線になった感覚を味わいました。
（スティーブ・ジョブズ風に言うと"Connecting Dots"ですね笑）

そこで、改めて問題点を整理すると「人との繋がりを欲しているが機会に恵まれていない」ことで、
解決策として「気軽に人と繋がれる機会を提供する」と考えました。
そこで、「友達探しのマッチングアプリ」に行き着きました。
ターゲットやアプリでできることは昨日の記事[（個人アプリ開発日記 #1）](https://qiita.com/shimataro1988/items/fd9650906d530016e574)で説明済みなので割愛します。

#3. おわりに
「つながりを、もっと身近に」というキャッチコピーを掲げていますが、現存するアプリでも
類似のものがあるのではと感じました。人と繋がる系もしくは人にフォーカスを当てた物だと、
Facebook、Twitter、動画・ライブ配信（TikTokやSHOWROOMなど）が思い浮かびました。
せっかく作るのであれば、既存のアプリではカバーしきれない何かしらの価値が差別化要素に
なるのではと考えました。次回の記事では、既存のアプリとの比較・分析について考察していきます！
SQLを実行する順番に気を付ける

集計処理でグループ化する際にdistinctかgroup byのどちらを使うのか？
またグループ化した場合の集計処理に対して、havingを使うかwhereを使うのかが迷いどころだが、それを解決するには実行される順番さえ意識できれば容易に解決できる。

https://qiita.com/yurina0402/items/78ae1f536b6755d6221a
Raspberry Pi 4で遊べる環境を急いで作る(目標1時間）

# 記事の目的
決して応用編ではない。
PtyhonでAIのプログラミングしたいな〜とか、IoT系の勉強にデバイスつなげて遊びたいな〜
と思ったそこのアタナと僕のために、とりあえず色々できる環境をAFAP（可能な限り早く）作る。その備忘録。
※特に自分の性格だと準備段階でグダると熱意がさがっていくため

こういうのちゃんとメモしていく癖をつける２０２１にしたいと思いに賛同の方はLGTMおねがいします。

# 1.買う
買うところから書きます。Amazonで調達しました。ってかここが入ると１時間無理ですね。
・本体ラズパイ４ 8GB ※8GBである必要は不明
https://www.amazon.co.jp/gp/product/B0891RC99L/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1

・ケース、電源ケーブル、ファン
https://www.amazon.co.jp/gp/product/B07H2WKYBF/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1

・HDMI変換ケーブル　※HDML対応のディスプレイとケーブルはありました。
https://www.amazon.co.jp/gp/product/B07QBZ667V/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1

その他、MicroSDカード、USBキーボード、USBマウスは手元にありました。

# 2.OSセットアップ
到着を待つ間MicrosSDにラズパイ用のOS（Raspbian)を書き込みます。
時間かかるので一晩寝かせました。

ダウンロードとインストールはITmediaさんの以下を参考にしました。
https://www.itmedia.co.jp/news/articles/2006/05/news031.html

# 3.組み上げ＆初期セットアップ
説明書を見ながらディスプレイ、マウス、キーボード、MicrosSDをセットアップ
最後に電源をつないで、ガンダム起動！

最初OSのガイダンスに従って初期設定を投入
英語だけど大丈夫だと思います。一番重要なのはWifiを接続すること。

# 4.SSHやVNCの接続
**これが終われば同じWifiにつないでいるWindwosやMacから操作できるようになるので、キーボード、マウス、ディスプレイケーブルを外せていきなりスッキリします**

・以下のサイトを参考にラズパイ側のSSHとVNCの許可、及びVNCソフトをインストールし、接続
https://dev.classmethod.jp/articles/raspberry-pi-4-ssh-vnc-remote/

・WindwosでSSHがない場合は、Windwos TerminalがMicorsoftらしからぬ使いやすさでおすすめです。
https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701

接続確認できたらケーブルをとっぱらいましょう！

# 5.エディター（Vi）の環境設定
初期設定だとちょっと使いにくかった。矢印キーやバックスペースが使えない。
・sudo vi ~/.vimrc
・sudo vi /root/.vimrc
の２つを実行、両方に以下を記載して保存。

```
set nocompatible
set number
set backspace=indent,eol,start
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
```
通常ユーザが上のファイルを見て、SUDOでは下のファイルの設定を見るらしいので両方を作成しておきます。

vi入力は未だに練習中なので、みんなで一緒に練習しましょう。
https://prev.net-newbie.com/linux/commands/vi.html

# 6.IPアドレス固定
IPアドレスが動的だとSSHやVNCが接続できず、
次回またケーブルを出してこないといけなくなりますので、
今ラズパイに割り当てられたIPを次回も使うようにセットアップします。

https://mugeek.hatenablog.com/entry/2019/05/27/230256

三箇所変えるだけでいいだけですが、ここは自宅環境に依存して設定値が変わりますので、サンプル値は載せません。確認しながらご対応をお願いいたします。

# 7.ソフトウェアアップデート
なんとなくやっておきましょう
SSH接続して下記を実行

```
sudo apt-get update
sudo apt-get upgrade -y
```

# 8.Hollywoodでテンションを上げる
ハッカーっぽい画面を表示してドヤ顔できるだけのネタアプリです。
テンションが上がるので一つのゴールに設定しましょう。

```
sudo apt install hollywood
hollywood
```
( ･´ｰ･｀)ドヤァ

# 9.おわり！
Amazon Primeで10分で届いたので一時間で終わりましたね。
これで一通り作業環境は揃ったのではないかなと思いますが、
ここまでラズパイっぽいことは今の所あまりしてないので、ここから色々遊んでいきたいと思います。

センサをつないで取得してGoogleスプレッドシートにアップしてみたり、
https://qiita.com/c60evaporator/items/283d0569eba58830f86e

プロキシサーバを立ててみていろんな通信を監視したり
https://qiita.com/mascii/items/400a0ecab61d885ac2a8

DjangoをインストールしてかんたんなWebサーバで色々開発してみたり
https://qiita.com/Taro_man/items/19613663ef7bb3c57d4f

たくさんおもろいことをやってぜひQiitaでシェアしてください。
自分もなにか作ったらアップしていきたいと思います。
Larevel 7.x で自動テストをするための予備知識メモ

わからないなりに調べたことを備忘録として残します。

**▼ 現時点の理解度はこんなもん**

- Laravel の処理は追えるようになったぐらい。でも自動テストはよくわからない
- Laravel にはPHPUnit が入っているらしい。ということでPHPUnit の公式ドキュメントを読みつつ実行してみた
- アノテーションやデータプロバイダの使い方はなんとなくわかった

# FeatureTest と UnitTest の違い
- FeatureTest ：コードの幅広い範囲が対象。1つのHTTP リクエスト単位の動きをテストするイメージ。
- UnitTest ：クラスが対象。クラス内のメソッドひとつひとつに対応するテストを書くイメージ。

#コマンド

##テストファイル生成
「UserTest」というクラスを作りたい場合のコマンドです。

```
# Feature ディレクトリにテストを生成する
php artisan make:test UserTest
```
```
# Unit ディレクトリにテストを生成する
php artisan make:test UserTest --unit
```

##DB マイグレーション生成
生成されたマイグレーションは `database/migrations/` 配下に置かれます。

※ まだアウトプットできるほど理解が深まっていないので、公式ドキュメントのリンクを貼っておきます:bow:
　[データベース：マイグレーション 7.x Laravel](https://readouble.com/laravel/7.x/ja/migrations.html)
##DB マイグレーション実行
```
# .env.testing のenv ファイルを読むためのオプションを付けている
php artisan migrate --env=testing
```
## Seeder 作成
「TestSeeder」というSeeder クラスを生成したい場合のコマンドです。
生成されたSeeder クラスは `database/seeds/` 配下に置かれます。

```
php artisan make:seeder TestSeeder
```
生成されたSeeder クラス内で投入したいテストデータを定義します。
## Composer のオートローダ再生成
ファイルを追加・変更した場合に自動読み込みをし直すため、実行します。

```
composer dump-autoload
```
##テスト用データ生成 (Seeder の実行)
データベースに初期値を入れるため、Seeder を実行します。

```
# 「TestSeeder」を個別に実行したい場合のオプションを付けている
php artisan db:seed --class=TestSeeder
```
##キャッシュクリア関連
テスト実行前にやっておきます。
API の場合は以下のみで問題なし。ビューを使っている場合はビュー系のクリアコマンドもやった方がいいかも ( `view:clear` )

```
# コンパイルされたクラスファイルを削除する
php artisan clear-compiled

# フレームワークのブートストラップファイルをキャッシュする
php artisan optimize

# キャッシュファイルを作成して設定の読み込みを高速化
php artisan config:cache
```

##テストファイル実行コマンド
「UserTest」というクラスを実行したい場合のコマンドです。

```
# .env.testing のenv ファイルを読むためのオプションを付けている
php artisan test --env=testing tests/Feature/UserTest
```
#[おまけ] artisan コマンドが思い出せないとき
```
# 一覧を表示
php artisan list | less
```
こんな感じでズラッと出てきます。
![Screenshot 2020-12-30 18.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/ac46e1ab-be9c-2995-49d7-ada26809dfa5.png)


`help [調べたいコマンド]` でくわしく調べることもできます。

```
# [make:migration] を調べたい場合
php artisan help make:migration
```

![Screenshot 2020-12-30 18.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/a4bb3f7a-7a16-eef1-dbf7-5d8eb4871029.png)


#くりかえし読み返すリスト
- [【初心者向け】テストコードの方針を考える（何をテストすべきか？どんなテストを書くべきか？） - Qiita](https://qiita.com/jnchito/items/2a5d3e15761fd413657a)
：テストコードの方針を見失いかけたら読む
- [PHPUnit マニュアル — PHPUnit latest Manual](https://phpunit.readthedocs.io/ja/latest/)：PHP Unit の使い方がわからなくなったら読む
- [テスト: テストの準備 7.x Laravel](https://readouble.com/laravel/7.x/ja/testing.html)：Laravel 公式
- [データベース：シーディング 7.x Laravel](https://readouble.com/laravel/7.x/ja/seeding.html)：Laravel 公式
- [モック 7.x Laravel](https://readouble.com/laravel/7.x/ja/mocking.html)：Laravel 公式。モックのことを何もわかっていないので後でじっくり読む
- [Laravel キャッシュクリア系コマンドなど - Qiita](https://qiita.com/Ping/items/10ada8d069e13d729701)：今回記載したキャッシュクリアコマンドでなんとかならない場合に読む
apt でどうやっても 「unbale to locate package」だった話

## 環境
Windows10
WSL2
Ubuntu 18.04 LTS


# 経緯
WSL2上にROS melodicの環境を作っていたとき

まずは基本通り以下を実行した

```ros_install.sh
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
sudo apt install ros-melodic-desktop-full
```
とそのとき、、
####**突然のBSODで強制終了、再起動！**

仕方ないので、もう一度上のスクリプトを実行すると

```
E: Unable to locate package ros-melodic-desktop-full
```

パッケージが無いと言われてしまう



## 試したこと
とりあえずlistに正しく追加されているか確認

```
$ cat /etc/apt/sources.list.d/ros-latest.list
deb http://packages.ros.org/ros/ubuntu bionic main
```
特に問題なし
keyserverの方も確認したが、問題なくexecuteされている


次にaptの更新の再チェック

```
$ sudo apt update
$ sudo apt upgrade
```
特に問題もなく、logにも

```
Hit:3 http://packages.ros.org/ros/ubuntu bionic InRelease
```
とある

バージョンも合っているので、他の問題もなさそう、、、

## 解決策
もしかしてrepositoryを上手く認識出来ていないのでは？と思い、一旦listから消してupdateを行った

```
$ sudo vim /etc/apt/sources.list.d/ros-latest.list
->書いてあるものを消す

$ sudo apt update
$ sudo apt upgrade
```
そしてもう一度環境を立ち上げ、最初のスクリプトを実行すると、、、**インストール開始！**


##あとがき
aptでのunable to locate packageでのエラーは調べてもほとんどがupdate忘れが原因で、次点でlist追加忘れやその鍵なし、バージョンの不一致など

その他の理由でのエラーは見当たらず、多くの時間を溶かしてしまいました
どうしてもaptでのエラーの原因が分からない誰かの参考になると嬉しいです

突然の再起動の恐ろしさを感じたので、皆さんはこまめにPCを修理しましょう
【Ruby On Rails】親テーブルのデータを子テーブルから検索・保存する方法

#本記事について
備忘録です。

子コントローラーにてcreateアクション、include?メソッドを用いて、親テーブルのデータを検索し、その検索したデータと同じ内容が含まれている場合に、子テーブルのカラムへ保存できるようにします。

#include?メソッドとは

ある数値や文字列などのデータが含まれているかどうかを確認するために、include?メソッドを使います。

例えば、

```ruby:サンプルコード
  array = [aiueo, yayuyo]

  puts array.include?(aiueo)
  puts array.include?(yayuyo)
  puts array.include?(wawon)
```

```terminal:実行結果
  true
  true
  false
```

と、なります。


#前提

①
親：parentsテーブル

|id  |word  |
|---|---|
|1  |あいうえお  |

子：kidsテーブル（まだデータは登録されていません）

|id  |text  |word_id  |
|---|---|---|
|  |  |  |

②
【親のビュー】→【子のビュー】→【newアクション（データ登録画面）】を経て、@kidのparamsにはword_idが含まれているものとします。

#本題

今回は親テーブルの"word"カラムの中身を検索し、ユーザーが入力したデータと一致しているかどうかを調べます。一致していれば保存します。データを保存する際に、親テーブルのカラム情報が含まれているかどうかを判別したいので、if文に任意のメソッド名を追加します。今回はhaving_word?とします。

実際に処理をするメソッドを書いていきます。

① having_word?を定義する。

```ruby:kids_controller.rb
  def having_word?

  end
```

② ユーザーが入力したデータ(@kid)に対して、特定のデータが含まれているかを調べる(include?)。

```ruby:kids_controller.rb
  def having_word?
    @kid.include?
  end
```

③ 「特定のデータをどうやって調べるか」を書くための欄を設ける。→include?の直後に()を記述する。

```ruby:kids_controller.rb
  def having_word?
    @kid.include?()
  end
```

④ createアクションに至るまでのparamsを参照するため、@kidを記述する。

```ruby:kids_controller.rb
  def having_word?
    @kid.include?(@kid)
  end
```

⑤ paramsに含まれているparent(parentsテーブル)の情報を取得する

```ruby:kids_controller.rb
  def having_word?
    @kid.include?(@kid.parent)
  end
```

⑥ "⑤"で取得したparentの情報から、wordカラムを取り出す。

```ruby:kids_controller.rb
  def having_word?
    @kid.include?(@kid.parent.word)
  end
```

include?の()内は、簡単に言えば子から親の情報へ遡って行く感じだと思います。

# createアクションを実行し、データが保存された場合のテーブル例

親：parentsテーブル

|id  |word  |
|---|---|
|1  |あいうえお  |
|2  |元気  |
|3  |走  |
|4  |english  |

子：kidsテーブル

|id  |text  |word_id  |
|---|---|---|
|1  | あいうえお |1   |
|2  | あいうえお順 |1   |
|3  | あいうえお表 |1   |
|4  | あいうえお作文 |1   |
|5  | お元気ですか？ |2   |
|6  | めちゃくちゃ元気です。 |2   |
|7  | 自走力 |3   |
|8  | 走行距離 |3   |
|9  | I have studied english for 5 years. |4   |
|10  | just a random english comment passing by. |4   |

# 最後に
プログラミング初学者のため、至らない点がございましたらご指摘お願いいたします。
バリデーションエラーメッセージが表示されない問題については今後理解指定いく必要があると思いました。
RaspberryPiに.net5をインストールする。

#はじめに
RaspberryPiに.net5をインストールしたときのメモです。
#インストール
##事前調査
RaspberryPiに.net5をインストールしようと、まずはGoogle先生の検索してみましたが、「RaspberryPi .net5」では、お手軽にインストールできるような参考になるブログ等は見つからず。なので、まじめに[マイクロソフトのページ](http://qiita.com/)を読みました。結果は最新のLinux(Ubuntu20.10)ではサポートしている感じがしますが、私のRaspberryPiは、Raspberry Pi OS (32-bit)です。別なSDカードを用意してUbuntuOSにしてもよいのですが、余っているRaspberryPi2や3をサーバーにしたいので、Raspberry Pi OSで頑張ってみたいと思います。
直接、バイナリーをダウンロードしてインストールする方法もありそうなので、今回はこの方法を試してみました。
##ダウンロード
まずは[ダウンロードサイト](https://dotnet.microsoft.com/download/dotnet/5.0)に行きます。
https://dotnet.microsoft.com/download/dotnet/5.0
下記赤丸のリンクからファイルをダウンロードできますが、今回はLinuxらしく進めたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/064da97a-da9a-c8de-17b1-dd6e1a8143ae.png)

##linuxらしくコマンドラインベース
まずは、下記パッケージのインストールをしていない場合は実施します。

```
sudo apt install curl libunwind8 gettext
```

次に下記コマンドでダウンロードします。
これの意味は
カレントディレクトリにdotnet.tar.gzをファイル名としてdotnet-sdk-5.0.101-linux-arm.tar.gzをダウンロードするという意味です。
dotnet-sdk-5.0.101-linux-arm.tar.gzのダウンロードアドレスは前もってホームページから調べておきました。今後バージョンが変わった場合は、この引数部分を変更することで対応可能です。

```
curl -sSL -o dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/567a64a8-810b-4c3f-85e3-bc9f9e06311b/02664afe4f3992a4d558ed066d906745/dotnet-sdk-5.0.101-linux-arm.tar.gz
```

インストールは、ダウンロードファイルを解凍展開することでおおよそ完了します。

```
mkdir -p $HOME/dotnet && tar zxf dotnet.tar.gz -C $HOME/dotnet
```

最後に展開したディレクトリにパスを通します。

```
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
```

補足
今回はお手軽に進めるために上記コマンドを実行しましたが、恒久的には、「.bashrc 」に次のコマンドを追加し、常にパスを通すような設定を各自行う必要があります。

##動作検証

```
dotnet --info
```
実行すると下記の情報が表示されていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/50a4534a-b7c3-1a9c-f89b-2420cd121d29.png)

#テストプログラムの作成
最後に実際にビルドして実行するところを確認してみたいと思います。私は、Homeディレクトリにsourecodeディレクトリを作りそこで下記のコマンドを実行しました。

```
dotnet new console -n test -o test
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/4d157d90-f370-59a0-b3e3-3c351cf06a10.png)

ちょっと時間がかかります。
次にファイルマネージャーからProgram.csを選択してText Editorを開き、ちょっとだけ修正します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/b801e105-a743-a1cd-b94f-dfa54202aea5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/321e7928-2cad-dcd9-caaa-8265f2117035.png)

このあたりは各自好きなようにアレンジしてみてください。

では、ビルドして実行したいと思います。
結果は・・・・・結構時間がかかりました。約17秒もかかっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/e44820d7-4811-304e-de72-1ea139ce534d.png)

実行ファイルはなかなか深い階層にありますのでご注意ください。
実行してみると予定通りの文字が表示されました。成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54916/c2fce4aa-5149-f20e-b333-7342d598c90d.png)

#まとめ
正直、テストプログラムは、monoのときと違って手続きが多くて面倒だったのですが、無事プログラムを実行できました。もう少しスマートなやり方があるのかは、いろいろ調べてみたいと思います。

#参考文献
https://dotnet.microsoft.com/download/dotnet/5.0
https://docs.microsoft.com/ja-jp/dotnet/core/install/linux
Django - models.pyとadmin.py

#目的
この記事では、models.pyファイルで定義した情報を、admin.pyファイルに読み込ませることにより管理画面に表示させることをゴールとする。以下、例としてプロフィールの名前だけをモデルとして定義してみる。
#models.pyの作成とデータベースへの反映

```python:apps/models.py
from django.db import models

class Profile(models.Model):
  name = models.CharField(max_length=100)
```
このように’Profile’というモデルを作ってみた。
※CharField()とは文字列型のデータ
models.pyの中身を作成したら、データベースへ反映させる必要がある。
#データベースへの反映

```terminal
$ python manage.py makemigrations
```

makemigrationsは設計図を作成するようなイメージ。
これを実行すると、データベースに反映する前、エラーが検知された場合に知らせてくれる。

```terminal
$ python manage.py migrate
```

migrateはmakemigrationsによって作成されたファイルの基づき、データベースに反映させるときに使われるコマンド。
####以上でモデルの作成が終了！
#admin.pyファイルに読み込ませる

```python:apps/admin.py
from django.contrib import admin
from .models import Profile

admin.site.register(Profile)
```
admin.site.register()でモデルの登録。
###以上で管理画面にProfileを表示させることができる!
フィッシャーイェーツのシャッフル

## フィッシャーイェーツのシャッフルとは？

現在、javascriptの簡単なアプリ開発を勉強しているのですが、ドットインストールでアプリ開発講座を受けていると、配列をランダムに組み替えて返すという興味深い関数を見つけたのでそれをまとめます。（ドットインストールの三択クイズで使用されていたので興味があればぜひ受講してみてください。）

フィッシャーイェーツのシャッフルとは簡単にいうと引数として指定された配列をランダムにならびかるアルゴリズムです。これを使ってクイズアプリ開発をしました。

## 実際にコードに書いてみよう

今回はjavascriptで書いていくことにします。

```javascript:main.js
  const numbers = [1,2,3,4,5];
```

このように簡単に数字を並べた配列があったとしましょう。今回はこの数字の配列を並び替えてみたいと思います。フィッシャーイェーツのシャッフルを用いてコードを書くとこのような感じになります。

```javascript:main.js
function shuffle(arr) {
    for(let i = arr.length - 1; i > 0; i--) {
      let j = Math.floor(Math.random() * (i + 1));
      [arr[i], arr[j]] = [arr[j], arr[i]];
    }
    return arr;
  }
```

この関数では引数として配列が必要となっているのがわかるかと思います。引数として渡された配列の要素数が負になるまでループを回す処理が書かれています。ここで注目してもらいたいのがMath関数を使用している部分です。

Math.floor(Math.random() * (i + 1));という記述から０から引数として渡された配列の要素の数までの整数をランダムに選択して返すという処理を書く事ができます。

この書き方はドットインストールのjavascriptアプリ開発で頻繁に用いられていたので非常に汎用性が高い事がわかります。（私は何度もこの記述に出会ったのでもう覚えてしまいまいした。）

そして最後の処理には配列の最後の要素とランダムに選択された要素を入れ替えるという処理が書かれています。この処理が一つ終わるごとにiを減らしていき、マイナスになるまでこの処理を続けます。

これによって非常にランダム性の高い配列を生成する事ができるのです。

では実際にこの関数を使用してみましょう。

```javascript:main.js
const shuffledNumbers = shuffle(numbers);
console.log(shuffledNumbers);
```

コンソールで確認します。ランダムに配列が生成されている事がわかるでしょう。

![スクリーンショット 2020-12-30 18.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574301/f1d96028-8faa-c889-a52f-3f5157385206.png)

このようにランダムな配列を返したい時にはぜひフィッシャーイェーツのシャッフルのアルゴリズムを用いてみてください。

## 最後に
私の拙い説明をみていただきありがとうございます。もし間違い、指摘等ありましたらよろしくお願いいたします。
APIGWとlambdaでGoogleスマートホームアプリを作成してみた[前編]


#初めに
業務で初めてスマートホームスピーカーの開発を行うことになった
今回はその中でもGoogleHomeの開発について備忘録的に、実施事項を記載していく

##注意事項
本投稿記事は2020年12月時点の仕様に基づいた実装となります

##参考記事
[Google Assistant 公式ドキュメント](https://developers.google.com/assistant/smarthome/overview)

##この記事で書いていくこと
- cognitoを利用したアカウントリンクの実装 <- ★本記事ではこちらを実施
- APIGateway+lambdaを利用して、Googleスマートホームアプリのコード実装と各種設定

##この記事で書かないこと
- 基本的なGoogleスマートホームアプリの作成手順について

## 事前に用意しておくもの
- Googleアカウント
- Googleアカウントに紐づく(Cloud IAM）GCPアカウント

#1. 事前設定
プロジェクトやアプリの初期セットアップについては、以下の記事を参考に実施しました
[Googleスマートホームアプリの作成方法](https://qiita.com/zono_0/items/453eb5674b490bdc6363)

#2. [AWS]Cognito初期設定
1. AWSコンソールから[cognito]->[ユーザプールを作成する]を押下
2. プール名は任意のものを入力（例ではAccountlink_googleと入力)
3. 画面下の[デフォルトを確認する]を押下
4. [プールの作成]を押下
![Screen Shot 2020-12-30 at 17.20.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110280/c59552c7-a835-44d9-fc79-9650eed59fe8.png)

#3. [AWS]Cognitoアカウントリンク設定
1. cognitoの設定画面から[アプリクライアント]からapiを実行するための新規IDとシークレットキーを作成
![Screen Shot 2020-12-30 at 17.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110280/a993633a-445b-ae14-43b5-a06efa86baad.png)

2. [ドメイン名]から任意のcognitoドメインを作成
![Screen Shot 2020-12-30 at 17.38.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110280/0e1c973b-3292-cf61-f096-bffd10fe03c8.png)

3. [アプリクライアントの設定]にて以下を設定
     - 有効な ID プロバイダ: Cognito User Pool
     - コールバック URL: https\://oauth-redirect.googleusercontent.com/r/[Actions on googleのプロジェクトID]
     - サインアウト URL: https\://gala-demo.appspot.com/
     ※Googleで提供しているサンプルUIを利用します
     - 許可されている OAuth フロー  : [Authorization code grant]にチェック
     - 許可されている OAuth スコープ  :email, openid
![Screen Shot 2020-12-30 at 17.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110280/1a1fe9d3-c568-d209-8561-7fcfac6858e6.png)

#4. [Actions on google]アカウントリンク設定
1. [アクションのコンソール](https://console.actions.google.com/u/0/)にログイン
2. [Account linking]にて以下を設定
  - Client ID issued by your Actions to Google: cognitoのクライアントID
  - Client secret : cognitoのシークレットキー
  - Authorization URL: https://<ドメイン名>.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize
  - Token URL: https://<ドメイン名>.auth.ap-northeast-1.amazoncognito.com/oauth2/token
  - scope: emailとopenidを一つずつ追加
![Screen Shot 2020-12-30 at 18.02.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110280/8831ff91-1fdc-af61-fc17-98f51260d0f2.png)

一旦ここまででアカウントリンクの実装までは完了
APIGWとlambda部分の実装については後編にて記載します
M1のMACでAndroidStudioがフリーズする（フルスクリーン時のみ）

# 事象
ハードの問題か、OSの問題かどちらかは分かりませんが、次の状態時に必ずフリーズします。

- AndroidStudioをフルスクリーンで起動している
- NewProjectなど、↓↓の様にフルスクリーン状態でタブ表示されるとき

![スクリーンショット 2020-12-30 18.03.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88001/40876d62-5340-4677-1a54-756a8a787e1f.png)

原因は不明です。

# 解決策
ウィンドウモードで利用する。以上。
まだ出たばっかりなので、色々おきますね。。。
【Swift】ランダムカラー

こんにちは、@Zhalenです。本当に金欠で死にそう。

この記事では、このように色をランダムに出力するエクステンションを紹介します。

![ezgif.com-resize.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540507/6d788b9d-4a2b-4a84-ac85-f56bd4ebfbe1.gif)


#Extension

これがそのエクステンションです。

```swift

//MARK:- ランダムカラー
extension UIColor {
    static func random() -> UIColor {
        let red: CGFloat = CGFloat.random(in: 0...1)
        let green: CGFloat = CGFloat.random(in: 0...1)
        let blue: CGFloat = CGFloat.random(in: 0...1)
        
        return UIColor.init(red: red, green: green, blue: blue, alpha: 1)
    }
}

```

これ↑をファイルのどっかに記述していただき、

```swift
UIColor.random()
```

と書くとランダムな色が出てきます。

ここで、

```swift

CGFloat.random(in: 0...1)
```
は、```0から1までのCGFloat型をランダムに返す```というものですから、このエクステンションはランダムな```UIColor```の初期値をランダムなrgb値を生成することで実現しています。


#宣伝です。ぜひインストールしてみてください！
![スクリーンショット 2020-12-30 17.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540507/32438993-4e40-e9ae-474f-718d6732c5fc.png)


つい先日、アンケート特化型SNS「<b>Vote.</b>」をリリースしました！

このアプリは、何かの選択で迷った時・悩んだ時、それだけでなく企業のA/Bテストやテストマーケティングなど実用的な面でも役に立つアプリです！　非常にデザインも洗練されており、誰でも気軽にアンケートや投票を取ることができます。

#####インストールはこちらから：https://apps.apple.com/us/app/vote/id1542436046
Tableau ServerをAWS EC2インスタンスにインストールする

むーです。

# はじめに
以前、仕事でAWSにVPCを使ってプライベートネットワークを構築し、その中にEC2インスタンスを構築したことがあります。そしてTableau サーバーをEC2インスタンスにインストールしてデータ分析の基盤を構築します。
今回、同じようなことをやりたい方から、参考にした資料はありますか、というご質問をいただいたので、下記のようにお答えしました。

一般論ですし公開マニュアルにも記載してある情報がほとんどですので、こちらに記載して公開いたします。

では、お答えした内容です。

# 前提知識
EC2インスタンスにTableau Server をインストールするということですと、
まずは、私のブログですが、下記のレベルの話はわかる必要があります。
JupyterNotebook のAWS環境への簡単な構築の仕方

こちらは、tableau serverをインストールしたわけではないですがこのブログの内容をみてやっていることがわかるレベルである必要があります。
# EC2インスタンスにtableau server をインストールするための情報源
次にEC2インスタンスにtableau server をインストールするための情報源です。
[Tableau Server EC２インスタンスへのインストール方法](https://www.tableau.com/ja-jp/support/help?_ga=2.195896428.1384481562.1609299381-1945348960.1598062819)
こちらの下記を参考にします。
 Linux 版　Tableau Server
 クラウド上の Talbeau Server

# AWSクラウドプラクティショナー
EC2の公式マニュアルは情報がまとまっていますがはじめて読むと戸惑うかもしれません。
まずはAWSのクラウドプラクティショナーから勉強するとよいでしょう。
[AWSクラウドプラクティショナー] (https://aws.amazon.com/jp/certification/certification-prep/)
APN（パートナーのネットワーク）に登録しておくと便利です。（うちは登録しました）
[APN] (https://aws.amazon.com/jp/certification/certification-prep/)
# EC2公式マニュアル
EC2がほんとにわからなければ最終的にはAWSの公式マニュアルに頼ることになります。
[AWS EC2インスタンスマニュアル](https://docs.aws.amazon.com/ja_jp/ec2/index.html)
一度、ブログにtableau サーバのインストール方法はまとめて記載したいとも思っています。
東京から福岡まで帰る新幹線の中で、このブログは記載しました。
では、良いお年を。
【AWS】仮想サーバーの立ち上げ

## 【概要】

AWSのログインからサーバーを立ち上げ、「Hello EC2!」を表示するまでの流れです。

## AWSのログイン

1. ページ右上の「アカウント / コンソール」から「AWS Management Console」を選ぶ
2. アカウント作成時に登録したメールアドレスとパスワードでログイン
3. 画面が切り替わると AWS のいろいろなサービスが出てきますので、まずは仮想サーバーの EC2 を立ち上げていきます。

## リージョンを選ぶ

### リージョン」とは

地理的に近い「ゾーン」をグループ化したもので所在地を特定することができます。AWS は色々な地域で展開されていますが、日本にいる人向けにサービスを展開したい場合はここを「東京」に切り替えておきましょう。

## EC2 を立ち上げる ( インスタンスを立ち上げる )

インスタンスとは「実態」といういみで、ここではサーバーの「実体」を立ち上げるという意味で使います。

1. 「インスタンスを起動」から立ち上げます。
2. OS を Amazon Linux AMIに選ぶ。(AWS で使える便利なツールがあらかじめ入っていて便利 )
3. スペックはいつでも変えられるので「無料利用枠の対象」にしておきます。
4. インスタンスタイプの選択、インスタンスの設定、ストレージの追加はデフォルトのままでOK。
5. インスタンスのタグ付けでは、キーに「Name」、値に何か適当な名前(今回はServerTest)を命名
6. セキュリティグループの設定では、ルールの追加で、HTTPを追加します。
7. 全ての設定が完了し、作成をクリックすると、キーペアの作成が求められます。
8. 適当にキーペアに名前を入力し、ローカルにダウンロードします。(今回はfirstKeyとします。）後にsshで接続する際に利用します。
9. キーペアがダウンロードできたらインスタンスを作成を開始します。
10. インスタンスの作成状況は、[EC2ダッシュボード] > [インスタンス]から確認できます。作成したインスタンスの状況がrunning、スタータスチェックが合格となれば作成は完了しています。

## sshで仮想サーバに接続

### **接続情報を確認**

1. EC2ダッシュボードから作成したインスタンスを選び「接続」を選び接続情報を確認
2. 先ほどダウンロードしたプライベートキーファイル(***.pem)をカレントディレクトリに配置します。
3. 「必要に応じて、このコマンドを実行して、キーが公開されていないことを確認します」の「`chmod 400 ***.pem` 」をコピペしてターミナルに打つ
4. 「ご使用のインスタンスの パブリック DNS を使用してインスタンスに接続」の「例」にある「.... amazonaws.com」 部分をコピペしてターミナルに入力
5. 接続確認されるのでyesと入力すると、ログインができターミナルに以下の文字が表示されれば接続が完了！

```

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

```

## webサーバーを立てて接続

### 【準備】**必要なツールをインストール**

sshで接続された状態で、始めにシステムのアップデートをします。

```jsx
sudo yum update
```

httpd、php、mysqlをインストール。

```jsx
sudo yum -y install httpd php mysql update
```

### **webサーバーの設定を行う**

ターミナル上でwebサーバーを立ち上げ、設定をおこないます。

```jsx
sudo service httpd start
```

```jsx
sudo chkconfig httpd on
```

index.htmlの作成

```jsx
sudo vi /var/www/html/index.html
```

index.htmlに記述

```jsx
`<html>
Hello EC2!
</html>`
```

セーブして終了

```jsx
wq
```

作成したインスタンスのパブリックDNSを確認
パブリックDNSをブラウザに入力し、webページが公開されていることが確認できれば成功です！

【実行結果】
![7db4f16d9c80e9d4dd82ead35b0f713c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613675/f517827e-2050-ee5b-666e-583390edd7bb.png)
ポートフォリオ

エンジニアの就職、転職において非常に大切になるのがポートフォリオだと思いますが、近年のプログラミングスクールは受講者全員に同じような通販サイトをポートフォリオとして作成させて就職活動を行わせるようなものも多くあるようです。
そしてやはり、採用側としてはそのような言わば脳死プレーで挑んでくる量産型のスクール受講生に対しては低評価、門前払いという結末になるのが大半だそうです。

しかし、プラスに捉えれば、何か他人や自分の問題解決を意識したオリジナリティのあるポートフォリオを作ることができれば、とりあえずスクールの言いなりになって通販サイトを作ってそのままそれをポートフォリオとして提出するような多くの脳死受講生に対して大きなアドバンテージを作れると言うことです。

プログラミングの学習は「技術力を高める」ということももちろん大事ですが、どういう作品を作るか考えることにしっかり時間をかけるということももっと大事にしていきたいなと思います。それによって、技術力に加え、人間性などのソフトスキルの評価も高まってより良い結果が得られるのではないかと思います。一素人の主観なのであまり参考になるかはわかりませんが、ぜひ何を作るかを考えることにに時間をかけて、周りに差をつけていきましょう!
WSL2 よく使うコマンド一覧

WSL2で、よく使うコマンドの一覧です。

## ディストリビューションを一覧表示

```bash
wsl -l -v
```

## ディストリビューションを指定して起動

```bash
wsl -d <ディストリビューション名>
```

## ディストリビューションを削除

```bash
wsl --unregister <ディストリビューション名>
```

## ディストリビューションをコピー

```bash
wsl --export <ディストリビューション名> <出力するtarファイル名>
wsl --import <新しいディストリビューション名> <インストールするフォルダ名> <tarファイル名>
```

## デフォルトのディストリビューションを設定

```bash
wsl -s <ディストリビューション名>
```

## ディストリビューションが使用するデフォルトのWSLバージョンを2に設定

```bash
wsl --set-default-version 2
```

## ディストリビューションのWSLバージョンを2に設定

```bash
wsl --set-version <ディストリビューション名> 2
```

# 参考

* [Command Reference for Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/reference?WT.mc_id=IoT-MVP-5002686)
micro SDカードをフォーマットする for macOS

## はじめに

micro SDカードにRaspberry Pi OSを入れて、いろいろしていたら環境が壊れてしまったので初期化する。

実はRaspberry Pi単体でも初期化できるらしいが、私の環境ではその初期化手順通りに動かなかった[^1]ため、micro SDカードをフォーマットし、OSを入れ直すことで初期化する。

## 追記(2020/12/30 18:00頃)

Raspberry Pi Imagerを使えば、micro SDカードをフォーマットしながらOSを入れ直せるのでは？
※未検証

## 前提

- macOS Catalina 10.15.7（19H2）
- macOSにmicro SDカードを挿せること。

## 手順

### 1. フォーマットするmicro SDカードを特定する

micro SDカードを挿す前と挿した後で下記コマンドを実行する。
出力結果の差分を確認し、対象を特定する。

```terminal:Terminal
$ diskutil list
```

`/dev/disk7`が差分で出た。

![microSDの特定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990995/22bf3032-cf40-f849-c5a6-42d14ada9f3b.png)

### 2. フォーマットを実行する

下記コマンドを実行し、フォーマットする。

```terminal:Terminal
$ diskutil eraseDisk MS-DOS RPI /dev/disk7
```

調べた感じ、引数の意味は下記の通りらしい。

```
diskutil eraseDisk <ファイルシステム名> <フォーマット後のディスク名> <フォーマットするディスクパス>
```

## 結果

きれいになった。

![フォーマット後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990995/46483313-fdae-8c25-92fc-13b9e475e824.png)


## 参考サイト

- [RaspberryPi OS書き込み後のSDカードをMacでフォーマットする方法 · としつーる](https://7ka.org/raspberrypi-sd-init-mac/)
- [How to Format a Hard Drive on macOS - Howchoo](https://howchoo.com/apple/format-hard-drive-macos)

## 脚注

[^1]: 起動時のRaspberry Piのロゴが出ているところでShiftキーを押しても反応しなかった(無線キーボードだから？)ので。。
AWSの設定とセキュリティー対策の手順（自分用）

# はじめに
AWSが提供しているS３というストレージサービスの設定についてまとめる。
##ストレージサービス
インターネット上でデータを保存するサービスを提供するサービスのこと。
###ストレージサービスが必要な理由
なぜストレージサービスが必要かというと画像はアプリがデプロイ又は再起動されると、時間と共に消える仕様になっているから。
##AWS
Amazon Web Servicesのことであり、Amazonが提供している。
##S3
Amazon Simple Storage ServiceのことでAWSが提供するサービスの一つ。
S3を利用することで画像を保存したり取得したりする事ができる。
##S3の導入
####今回進めていく手順
1. AWSのアカウントの作成
2. IAMユーザーの作成
3. 二段階認証を設定
4. S3で保存先を作成
5. バケットポリシーの設定

##IAMユーザーを作成する理由
ルートユーザーとIAMユーザーを使い分けるため。
####ルートユーザー
AWS上の全てのサービスや機能を使える権限が与えられている。
不正利用されると大変危険。
####IAMユーザー
アクセス権限が制限されたユーザー
###使い分け

|アカウント |　使い分け                                      |
|--------|--------------------------------------|
|ルートユーザー|アカウントの停止やアカウントの作成などの最低限。
|IAMユーザー|使用したいサービスのみにアクセス権を与普段の使用で使う。

##二段階認証の設定
AWSアカウントのID・パスワードが漏れてしまった場合でもすぐに不正利用されないように、ログインを二段階にする。
二段階目のログインの際にはAuthyというアプリケーションを使用。
#### 手順
1.Authyのインストール
2.Authyの初期設定
3.ルートユーザーにログイン
4.ルートユーザーに二段階認証を設定
5.IAMユーザーに二段階認証を設定

アカウントの作成とセキュリティー対策はできた。
##S3で保存先を作成


自分用の保存場所の作成
####バケット
自分用のデータを保存する場所
####リージョン
保存されたデータがある場所

####手順
**※現在ルートユーザーである事**
1.バケットの作成
2.名前とリージョンを設定
3.アクセス許可の設定

##バケットポリシーの設定
####バケットポリシー
バケットに対し、どのようなユーザーがどういった処理をできるのかといった取り決め。
####手順
1.IAMユーザーの情報の取得
2.バケットポリシーの設定
Arch Linux(Manjaro)のminikubeをKVM2で起動する

## 必要なパッケージのインストール

```
yay -S minikube kubectl docker-machine-driver-kvm2 libvirt qemu-headless ebtables
```
﻿
## libvirtdを有効にする

```
sudo systemctl enable libvirtd.service
sudo usermod -a -G libvirt $(whoami)
```
﻿
## libvirtのdefaultネットワークを有効にする

```
sudo virsh net-autostart default
```
﻿
## minikubeがデフォルトでkvm2を使うようにする

```
minikube config set vm-driver kvm2
```
﻿
﻿
## 搭載メモリの1/4をminikubeに割り当てる
﻿
もしManjaroを使っているならfreeコマンドをデフォルトのfreeコマンドにする。

```
unalias free
```

```
MEMORY_FRACTION=4
minikube config set memory "$(($(free --mega | head -n2 | tail -n1 | cut -c15-27)/$MEMORY_FRACTION))"
```
﻿
## 起動して確認する

```
minikube start
kubectl cluster-info
```

## Minikubeのdashboardを表示する

```
minikube dashboard
```
OneDriveでThisWorkBook.pathがhttps:～になる問題

バグについての責任は負いかねます。
各自の責任においてご使用ください

```
Function ThisWorkBookPath()
    Dim tmp As Variant
    Dim OneDrivePath As String
    
    Select Case True
    Case Not ThisWorkbook.path Like "http*"
        ThisWorkBookPath = ThisWorkbook.path
        Exit Function
    
    Case ThisWorkbook.path Like "*my.sharepoint.com*"
        OneDrivePath = Environ("OneDriveCommercial")
        
    Case Else
        OneDrivePath = Environ("OneDrive")
    End Select
    
    tmp = Split(ThisWorkbook.path, "Documents")
    ThisWorkBookPath = OneDrivePath & Replace(tmp(1), "/", "\")
End Function
```
[React] 「チュートリアル：React の導入」をやってみる (2)

#「チュートリアル：React の導入」

Reactの公式チュートリアルをやってみています！

リンク ： [チュートリアル：React の導入](https://ja.reactjs.org/tutorial/tutorial.html "チュートリアル：React の導入")

前回の記事0 ： [[React] 「チュートリアル：React の導入」をやってみる (npx create-react-app my-appについて)](https://qiita.com/IwashiMorino/items/0add4eb89f7e0ef3d883 "Qiita")

前回の記事1 ： [[React] 「チュートリアル：React の導入」をやってみる (1)](https://qiita.com/IwashiMorino/items/f100cb28c8a0085a198b "Qiita")

このチュートリアルは三目並べのゲームを作ってみようというものです。

###State のリフトアップ

>state を親コンポーネントにリフトアップ (lift up) することは React コンポーネントのリファクタリングでよくあることですので、この機会に挑戦してみましょう。

Board にコンストラクタを追加し、初期 state として 9 個のマス目に対応する 9 個の null 値をセットします。

```react:index.js
class Board extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      squares: Array(9).fill(null),
    };
  }

  renderSquare(i) {
    return <Square value={i} />;
  }
```

props を渡すメカニズムを使うようにしましょう。Board を書き換えて、それぞれの個別の Square に現在の値を伝えるようにします。

```react:index.js
  renderSquare(i) {
    return <Square value={this.state.squares[i]} />;
  }
```

次に、マス目がクリックされた時の挙動を変更しましょう。
renderSquare メソッドを以下のように書き換えましょう。

```react:index.js
  renderSquare(i) {
    return (
      <Square
        value={this.state.squares[i]}
        onClick={() => this.handleClick(i)}
      />
    );
  }
```

Board から Square には props として 2 つの値を渡しています。value と onClick です。
Square に以下のような変更を加えましょう。

>・Square の render メソッド内の this.state.value を this.props.value に書き換える
>・Square の render メソッド内の this.setState() を this.props.onClick() に書き換える
>・Square はもはやゲームの状態を管理しなくなったので、Square の constructor を削除する

```react:index.js
class Square extends React.Component {
  render() {
    return (
      <button
        className="square"
        onClick={() => this.props.onClick()}
      >
        {this.props.value}
      </button>
    );
  }
}
```

まだ handleClick を定義していないので、handleClick を Board クラスに加えましょう。

```react:index.js
class Board extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      squares: Array(9).fill(null),
    };
  }

  handleClick(i) {
    const squares = this.state.squares.slice();
    squares[i] = 'X';
    this.setState({squares: squares});
  }

  renderSquare(i) {
    return (
      <Square
        value={this.state.squares[i]}
        onClick={() => this.handleClick(i)}
      />
    );
  }
```

>Square コンポーネントはもう自分で state を管理しないようになったので、Board コンポーネントから値を受け取って、クリックされた時はそのことを Board コンポーネントに伝えるだけになりました。React 用語でいうと、Square コンポーネントは制御されたコンポーネント (controlled component) になったということです。Board が Square コンポーネントを全面的に制御しています。
初めて投稿してみた

# はじめに
初めて投稿します。ご容赦ください。
初めまして、大学院進学予定の大学4年生のkiiiijapanです。理系です。データサイエンティストやデータアナリストになりたいです。

+ 機械学習
+ マーケティング領域
+ kaggle
+ Python
+ WordPress
+ PHP
+ Youtube（投稿する方）

に興味があります。
大学の研究室では、機械学習（特に、教師あり学習）メインに勉強しています。
技術や知識は未熟ですが、Qiitaを上手く活用していきたいです。

# 背景
<b/>今年も残り2日。やり残したことはないか考えていたところ、Qiitaへの記事投稿が思い浮かびました。他にもやり残したことはたくさんあるけれど、Qiitaの投稿は簡単にできるし、物は試しということで、とりあえずやってみました！
<b/>来年から記事を投稿していきたいです。</b>

# 目的
一番は、勉強した内容をアウトプットできることです。

+ 内容を深く理解できる（理解する→説明できる、になるため）
+ 後から見返すことができる
+ ステップアップにつながる可能性

アウトプットすると、上記3つがもれなくついてくる点がとても嬉しいですね。


# とりあえず
アウトプット頑張ります。
週一回投稿、、、くらいの気持ちで頑張ります。
質は高くなくても、アウトプットしていけば何か身につくはず、、、！！
フォームに入力された値をDBから呼びだす【Laravel】

フォームで入力された値をDBから呼びだす方法をメモしておきます。
今回はUserモデルからusernameもしくはfirst_name,last_nameを含むものを呼び出してます。


Route

```php:web.php
Route::get('/search', [SearchController::class, 'getResults'])->name('search.results');
```

form

inputのnameをqueryに指定。

```php:form.blade.php
<form action="{{ route('search.results') }}" class="navbar-form navbar-left" role="search">
  <div class="form-group">
    <input type="text" name="query" class="form-control">
  </div>
  <button type="submit" class="btn btn-default">Search</button>
</form>
```

入力された値を`$query`に渡す。`$users`にDBから呼び出した値を入れる。
Viewに返す。



```php:SearchController

use Illuminate\Http\Request;
use App\Models\User;

public function getResults(Request $request)
    {
        $query = $request->input('query');
        
      if (!$query) {
         return redirect()->route('home'); 
      }
        $users = User::where(DB::raw("CONCAT(first_name,' ', last_name)"), 'LIKE', "%{$query}%")
      ->orWhere('username', 'LIKE', "%{$query}%")
      ->get();
  
        return view('search.results')->with('users', $users);
   }
```


できました。
Node.js: Redis のデータを削除 (Delete)

## プログラム

```js:redis_delete.js
#! /usr/local/bin/node
// ---------------------------------------------------------------
//	redis_delete.js
//
//					May/25/2023
//
// ---------------------------------------------------------------
'use strict'

const redis = require('redis')

// ---------------------------------------------------------------
async function delete_proc (options)
{
	var argv = options.argv
	const key_in=argv[2]
	console.log (key_in)

//	const redis = new IORedis()	

	const client = redis.createClient()

	await client.connect()

	await client.del(key_in)

	await client.disconnect()
	console.error ("*** 終了 ***")	
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

delete_proc({ argv: process.argv })

// ---------------------------------------------------------------
```

## 実行コマンド

```bash
./redis_delete.js t1856
```

## 確認したバージョン

```text￼
$ node --version
v20.2.0
```
Node.js: Redis のデータを更新 (Update)

## プログラム

```js:redis_update.js
#! /usr/local/bin/node
// ---------------------------------------------------------------
//	redis_update.js
//
//					May/25/2023
//
// ---------------------------------------------------------------
'use strict'

const redis = require('redis')

// ---------------------------------------------------------------
function get_current_date_proc ()
{
	const today = new Date ()
	var ddx = today.getFullYear () + "-" + (today.getMonth () +1)
	ddx += "-" + today.getDate ()

	return ddx
}

// ---------------------------------------------------------------
async function update_proc(options)
{
	var argv = options.argv
	const key_in=argv[2]
	const population_in=parseInt(argv[3],10)

	console.log (key_in + "\t" + population_in)

	const client = redis.createClient()

	await client.connect()

	try
		{
		const value = await client.get(key_in)
		const unit_aa = JSON.parse(value)
		var out_str = key_in + "\t"
		out_str  += unit_aa.name + "\t"
		out_str += unit_aa.population + "\t"
		out_str += unit_aa.date_mod
		console.log (out_str)
		unit_aa.population = population_in
		unit_aa.date_mod = get_current_date_proc ()
		const json_out = JSON.stringify (unit_aa)

		console.log (json_out)

		await client.set(key_in, json_out)
		}
	catch (error)
		{
		console.error ("*** error *** from JSON.parse ***")
		console.error (error)
		console.error (key_in)
		}

	await client.disconnect()
	console.error ("*** 終了 ***")
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

update_proc({ argv: process.argv })


// ---------------------------------------------------------------
```

## 実行コマンド

```bash
./redis_update.js t1857 82597400
```

## 確認したバージョン

```text
$ node --version
v20.2.0
```