OmniAICreator/Qiita-1.07M huggingface dataset:
重相関係数の意味あい

重回帰分析において，重相関係数の二乗（決定係数ともいうが）は独立変数どもが従属変数をどの程度説明するかを表す。
つまり，重相関係数が 0.5 ということは，独立変数どもが挙って従属変数を説明しようとしているが 0.5^2（Python なら 0.5**2であるが）つまり，0.25（つまり 25 %）しか説明できないということ。これは，ヤバいよね。

なお，重回帰分析の最も単純な場合である回帰分析においては，重相関係数は相関係数の絶対値を取ったものであり，重相関係数の二乗は相関係数の二乗に他ならない。
つまり，独立変数と従属変数の間の相関係数が r の場合，重相関係数は abs(r) であり，重相関係数の二乗（決定係数）は r^2 である。

相関係数の絶対値が 0.7 以上であれば，「強い相関がある」というように判断されるが，「独立変数は従属変数の 0.7^2 = 0.49 つまり，半分以下しか説明できていないのだよ」ということだ。

```R 
> x = c(3, 2, 4, 5, 1)
> y = c(1, 3, 4, 5, 6)
> ans = lm(y ~ x)
> summary(ans)

Call:
lm(formula = y ~ x)

Residuals:
   1    2    3    4    5 
-2.8 -0.9  0.3  1.4  2.0 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)    4.100      2.322   1.766    0.176
x             -0.100      0.700  -0.143    0.895

Residual standard error: 2.214 on 3 degrees of freedom
Multiple R-squared:  0.006757,	Adjusted R-squared:  -0.3243 
F-statistic: 0.02041 on 1 and 3 DF,  p-value: 0.8955

> cor(x, y)^2
[1] 0.006756757
```
 Multiple R-squared:  0.006757 と cor(x, y)^2 = 0.006756757 ということだ
NAT・DNAT・SNAT について

## 勉強前イメージ

確かdestinationNAT と sourceNATなんだけど、
中身が思い出せない

## 調査

### NAT とは

Network Address Translation の略で
送信元のプライベートIPをグローバルIPに変換する技術です。
プライベートIPとグローバルIPは1対1でしか変換できません

詳細は [こちら](https://qiita.com/miyuki_samitani/items/f743e92abe08d4611bdc) を御覧ください

### DNAT とは

destination NAT の略で、
外部からプライベートネットワークへの通信のためのIPアドレスの変換になります。

例えば以下の図のようにサーバから外部へのpingを叩いた際には
このようなIPアドレス変換になります。

![12021-11-17 # NAT・DNAT・SNAT について - diagrams.net - G.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/321c8f34-7203-d846-04d5-3aefdbd57030.png)


### SNAT とは

source NAT の略で、
プライベートネットワークから外部ネットワークへのIPアドレスの変換になります。
[IPマスカレード](https://qiita.com/miyuki_samitani/items/a54f200e12ff8bdfe358) はSNATの仕組みを使っている

例えば以下の図のようにGIPとlocalIPの紐付けをすると、このようにlocalに変換されます。

![22021-11-17 # NAT・DNAT・SNAT について - diagrams.net - G.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/fb6abecb-ed7e-ba44-b83a-2ce741847137.png)


## 勉強後イメージ

解説見たら思い出すんだけど、パッと出てこないんだよねー

## 参考

- [DNATとSNATの違いやそれぞれの特徴について](https://rainbow-engine.com/dnat-snat-difference/)
- [NAT と SNAT と DNAT](https://yoru9zine.hatenablog.com/entry/2015/12/19/072304)
シンプルな Java Servlet サンプル (Spring Boot 版)

ちょっと Java Servlet を Spring Boot で動作させてみたい時のサンプルをメモしておきます。

# Maven (pom.xml)

Spring Boot で Java Servlet を動作させるには `Spring Web` が必要です。
`Spring Initializr` を利用するなどの何らかの方法で `pom.xml` ファイルの `<dependencies>` に以下の `Maven Repository` 記述を追加します。 (ビルドでの自動ダウンロードの実現のためには、インターネットに接続されている必要があります)

```xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
```

なお、[Spring Initializr サイトはこちら](https://start.spring.io/)を参照してください。

# Java コード

`Spring Web` が利用可能になれば、以下のような Java Servlet を実行するコードを記述しましょう。

```Java
import java.io.BufferedWriter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ServletCtrl {
    @RequestMapping("/*")
    public void serv(
        final HttpServletRequest req
        , final HttpServletResponse resp)
        throws ServletException {
        System.err.println("Servlet: begin: "
            + req.getMethod() + " " + req.getRequestURI());
        try {
            BufferedWriter writer = new BufferedWriter(resp.getWriter());
            writer.write("<HTML><BODY><P>Hello World!</P></BODY></HTML>");
            writer.flush();
        } catch (IOException e) {
            throw new ServletException(e.getMessage(), e);
        }
        System.err.println("Servlet: end.");
    }
}
```

## 簡易な解説

* `RestController` アノテーションを利用してクラスを登録
* `RequestMapping` アノテーションを利用してリクエストをメソッドにマッピング
* メソッドの引数に `HttpServletRequest` と `HttpServletResponse` を加えることにより Java Servlet 処理を可能にする

# 文書情報

* 初出: 2021-11-17

## 関連情報

* [シンプルな HTTP クライアント Javaサンプル (Apache HttpComponents 4.5系を利用)](https://qiita.com/igapyon/items/b0f9918db992c308949b)
【Gatsby】twin.macroでアニメーション

twin.macroでアニメーションする

```react

import React,{useState} from 'react'
import tw,{ styled, css } from "twin.macro"


const Title2 = styled.h1(({ bool, rotate }) => [
    tw`text-3xl font-bold bg-red-500 transition`, // 基本のスタイル
    bool && tw`text-4xl`, // 変数boolがtrueになると、text-3xl -> text-4xlになる
    rotate > 0 &&
      css`
        transform: rotate(${rotate}deg);
      `, // 変数rotateに数を入れると、${rotate}度回転する
]);

const Title3 = styled.div(({bool}) =>[
  tw`text-3xl font-bold bg-red-400 transition`,
  bool ? css`transform: rotate(45deg);` : css`transform: rotate(0);` //45度回転したり戻ったりする
])


const AboutPage = () => {
  const [bool,setBool ] = useState(false)
  const [rotate,setRotate] = useState(0)
  return (
    <Layout tw="w-4/5" pageTitle="About Me">
      <p>Hi there! I'm the proud creator of this site, which I built with Gatsby.</p>
      <Title2 bool={bool} rotate={ro} >わきげ</Title2>
      <Title4 bool={bool} >わきげ</Title2>
      <button tw="w-10 h-10 " onClick={()=>setRotate(rotate+45)} >わきげ</button>
      <button tw="w-10 h-10 " onClick={()=>setBool(!bool)} >わきげ</button>
    </Layout>
  )
}

export default AboutPage


```
【MLOps】docker/mlflowを使った競馬AI開発環境構築（2021年版）~python実行環境構築~

今回は環境構築のうち、実際のコードを実行するPython実行環境を構築していきましょう。

下の図のうち赤い枠の部分をインストールしていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69277/aec87407-890d-cf6d-37e8-dc1d805f8ad8.png)

### 大まかな流れ
今回のインストールは次の順番で進めていきます。

1. ローカル環境にanacondaをインストールする
2. tensorflowをインストールする
3. optunaをインストールする
4. mlflowをインストールする

#### 1.ローカル環境にanacondaをインストールする

まずは、python環境を構築するためにanacondaをインストールしましょう。
下記のリンクから自分の環境に合ったインストーラをダウンロードしてインストーラを実行してください。インストーラの指示に従って進めてください。特別な設定は不要です。

https://www.anaconda.com/products/individual

#### 2. tensorflowをインストールする

機械学習を行うためにtensorflowを使うため、pipコマンドを使ってインストールしましょう。コマンドプロンプトやterminalで実行してください。もし、pipエラーが出る場合は、anacondaのインストールに問題がある可能性があるので、1からやり直してみてください。

```python
pip install --upgrade tensorflow
```

下記の公式チュートリアルでは、pythonの仮想実行環境を用意してルートの環境とは分けてインストールする設定方法が記載されているので、そちらを試したい方はチャレンジしてみてください。

https://www.tensorflow.org/install/pip?hl=ja#virtual-environment-install

#### 3. optunaをインストールする

tensorflowとは別に、ハイパーパラメータチューニングのためのライブラリであるoptunaをインストールします。これを入れておくと、複数パターンのパラメータを自動で探索したい場合に非常に楽になります。

```python:
pip install optuna
```

公式ドキュメント↓

https://optuna.org/#installation

#### 4. mlflowをインストールする

mlflowはdocker側にもインストールしていますが、pythonのコードの中でmlflowへの記録をしたり、モデルの保存・読み込みを行うためにpython側にもライブラリをインストールしておきます。

```python
pip install mlflow
```

https://mlflow.org/docs/latest/quickstart.html

#### その他のライブラリ

今回インストールしたライブラリの他にも、numpyやpandasなどの数値計算に必要なライブラリがありますので、必要に応じてインストールしてくしてください。

### まとめ

今回は機械学習を実行するために必要なpython環境の構築を行いました。anacondaを使えば簡単にインストールできるし、pipコマンドもとても便利なので他に必要なライブラリが出てきた場合はぜひ追加でインストールしてみてください。
miniflux2 on Ubuntu でRSSリーダーをつくろう

# miniflux2 on Ubuntu でRSSリーダーをつくろう

## 環境

- OS: Ubuntu 20.04 LTS

https://miniflux.app/docs/installation.html

## Installation

```shell
# root権限で実行
# minifluxとpostgresqlのインストール
curl -s https://apt.miniflux.app/KEY.gpg | sudo apt-key add -
echo "deb https://apt.miniflux.app/ /" | sudo tee /etc/apt/sources.list.d/miniflux.list > /dev/null
apt-get update
apt-get install miniflux postgresql
pstree #postgresが起動している事を確認
su - postgres
# postgres ユーザで実行
# DBの作成
createuser -P miniflux
#username
#password
createdb -O miniflux miniflux
psql miniflux -c 'create extension hstore'
psql -c 'ALTER USER miniflux WITH SUPERUSER;'
export DATABASE_URL="postgres://username:password@localhost/miniflux"
miniflux -migrate
psql -c 'ALTER USER miniflux WITH NOSUPERUSER;'
# admin権限の作成
miniflux -create-admin
#username
#password
exit
# root権限実行
# minifluxのConfig設定
echo 'DATABASE_URL="postgres://username:password@localhost/miniflux"' >> /etc/miniflux.conf
systemctl restart miniflux
# これで127.0.0.1:8080でminifluxがLISTENする。
# LISTENポートを変えるには
# echo 'LISTEN_ADDR="127.0.0.1:8080"' >> /etc/miniflux.conf
```

## 応用

内部利用であればUNIXソケットを使ってみよう。

https://miniflux.app/docs/howto.html#reverse-proxy-unix-socket

```shell
### root権限で実行

## postgresqlをUNIXソケットでのみ通信できるように設定する
vi /etc/postgresql/12/main/postgresql.conf
#既存のlisten_addressesディレクティブをコメントアウト
echo "listen_addresses = ''" >> /etc/postgresql/12/main/postgresql.conf
systemctl restart postgresql
netstat -anlt #psqlのポートのリッスンが無くなった事を確認
netstat -an | grep postgresql # /var/run/postgresql/.s.PGSQL.5432 が出てくるはず

## minifluxをunixソケットでpostgresqlに接続するように設定する
vi /etc/miniflux.conf
#既存のDATABASE_URLディレクティブをコメントアウト
echo 'DATABASE_URL="user=username password=password dbname=miniflux sslmode=disable host=/var/run/postgresql/"' >> /etc/miniflux.conf

## miniflux自体をunixソケットでのみ通信できるように設定する
vi /etc/miniflux.conf
#既存のLISTEN_ADDRディレクティブをコメントアウト
mkdir /run/miniflux
chown miniflux: /run/miniflux
echo 'LISTEN_ADDR=""' >> /etc/miniflux.conf
systemctl restart miniflux
netstat -anlt #minifluxのポートのリッスンが無くなった事を確認

#接続テスト
# curl --unix-socket /var/run/miniflux/miniflux.sock http://index.html

# nginxのリバースプロキシの転送先に設定
#
# https://miniflux.app/docs/howto.html#reverse-proxy-unix-socket を参考に
```

## 何に使うの？
- エクスポート・インポート機能があるので、おすすめのOPML RSS詰め合わせセットを作って公開してみよう

![minifluxのフィード一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123740/1ce6f88a-c464-a587-5ec4-1061dbfd9a2a.png)

- Fever,Pinboard,Instapaper,Pocket,Wallabag,Nunux Keeper,Telegram Botと連携してみよう


![関連付け](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123740/0457e30c-3d04-02e9-1f3d-1500a09f7364.png)

- RSSデータベースサーバとしてminifluxを酷使しよう


自分だけのニュースサイトを作ろう https://miniflux.app/docs/api.html

## Webパスワードを忘れたときのリセット方法

```shell
su postgres;
psql miniflux;
¥d;
CREATE EXTENSION pgcrypto;
UPDATE users SET password = crypt('password', gen_salt('bf')) WHERE username = 'username';
exit;
```
AWS ECS　コンテナ追加の仕方

##状況
現在AWSにサービスをデプロイしている途中です。そこでECSでサービスを動かそうとしているのですが、うまく動かなかったので、まずはRDSに接続せずにECS + mysqlコンテナの組み合わせで動かそうとしています。

##手順①
新しいリビジョンの作成をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1361918/2f341e2c-1579-e6a2-bce3-030a553662a2.png)

##手順②

コンテナの追加をクリックし、コンテナ名、ポート番号、環境変数を記入し、追加をクリック。最後に一番下の”作成”をクリックするとコンテナが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1361918/bda5ef83-e2dd-a5b3-b5cc-70f9d1e7180c.png)
batファイル MySQL実行

#MySQLに接続する例
```connect.bat
@echo off
REM MySQLSQLのbinディレクトリ
set MYSQLPATH=C:\Program Files\MySQL\MySQL Server 8.0\bin\
REM 接続情報
set PASS=abc123
set DB_NAME=house_work
set USER_ID=root
set DB_NAME=house_work
set OPTION=--default-character-set=utf8
REM スクリプト実行
"%MYSQLPATH%mysql.exe" %OPTION%  %DB_NAME% -u %USER_ID% -p%PASS% -D %DB_NAME%

```


#指定したSQLファイルを実行する例(DB:MySQL)
```insertShoppingSample.bat
@echo off
REM MySQLSQLのbinディレクトリ
set MYSQLPATH=C:\Program Files\MySQL\MySQL Server 8.0\bin\
 
REM 接続先情報
set DB_NAME=house_work

set PASS=abc123
set USER_ID=root
set OPTION=--default-character-set=utf8
 
REM スクリプト実行
"%MYSQLPATH%mysql.exe" %OPTION%  %DB_NAME% -u %USER_ID% -p%PASS%< insertShoppingSample.sql
```
```insertShoppingSample.sql
insert into shopping(item_name)values('牛肉')
```
|項目|説明|注意点|
|----|----|----|
|@echo off|コマンドの画面表示を消す→コマンドの結果だけを表示する||
|set 変数名|変数の定義|ダブルクウォート不要。<br>例のようにディレクトリを代入する際は、直後にスペースが入るとうまく動作しないので注意。|
|%変数名%|変数の使用||
|REM|コメント||
|-P%PASS%|MySQLパスワードオプション|-Pと%PASS%の間にスペースが入るとうまく動作しないので注意|

#ファイル名を入力させてSQLを実行する例
```exeSQL.bat
@echo off
REM MySQLSQLのbinディレクトリ
set MYSQLPATH=C:\Program Files\MySQL\MySQL Server 8.0\bin\
 
REM 接続先情報
set DB_NAME=house_work
set PASS=abc123
set USER_ID=root
set OPTION=--default-character-set=utf8
set USR_INPUT_SQL=
set /P USR_INPUT_SQL="SQLファイルを入力してください: "
REM スクリプト実行
"%MYSQLPATH%mysql.exe" %OPTION%  %DB_NAME% -u %USER_ID% -p%PASS%< %USR_INPUT_SQL%
cmd/k
```
|項目|説明|注意点|
|----|----|----|
|set /p| [入力情報を入れたい変数]="[コマンド実行時に表示するメッセージ]"||
https://jj-blues.com/cms/command-set/

#ドラッグアンドドロップしたsqlファイルを実行する例
```spl
@echo off
if "%~1" =="" (
  echo 引数が指定されていません。
  pause
  exit
)
if %~x1 neq .sql (
  echo %~x1
  echo sqlファイルを引数にしてください。
  pause
  exit
)

REM MySQLSQLのbinディレクトリ
set MYSQLPATH=C:\Program Files\MySQL\MySQL Server 8.0\bin\
 
REM 接続先情報
set DB_NAME=house_work
set PASS=abc123
set USER_ID=root
set OPTION=--default-character-set=utf8
set USR_INPUT_SQL=%~nx1

REM スクリプト実行
"%MYSQLPATH%mysql.exe" %OPTION%  %DB_NAME% -u %USER_ID% -p%PASS%< %USR_INPUT_SQL%
cmd/k
```

https://www.softel.co.jp/blogs/tech/archives/2140

https://www.projectgroup.info/tips/Windows/cmd_0030.html


https://qiita.com/plcherrim/items/8edf3d3d33a0ae86cb5c#1if%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E5%9F%BA%E6%9C%AC
【Rust】（Option型）Someの中身の取り出し方

Rustの学習を行っていて、まだまだ参考になる資料が見つからない場合が多くあります。
もし、どなたかの参考になればと思い、メモをしておこうと思います。
  
※まだ、他にもたくさん方法はあると思いますので、随時追加していきたいと思います。
※記述時rustバージョン=1.56.1

## `match`を利用する方法①
以下のようにすると、Someの中身`5`を使用することができ、`a = 5`と表示される。

```rust
fn main() {
    let a = Some(5);

    match a {
        Some(i) => message(i), // このようにしてSomeの中身iを使うことができる。iはなんと命名してもいい
        None => println!("None"),
    }

    fn message(number_in_some: u32) {
        println!("a = {}", number_in_some);
    }
}
```

## `match`を利用する方法②（条件分岐）
以下のようにすると、matchの条件にSomeの中身を使用することができ、`larger or equal to 10`と表示される。

```rust
fn main() {
    let a = Some(10);

    match a {
        Some(i) if i >= 10 => println!("larger or equal to 10"), // このように左辺の条件としてiを使用できる。
        Some(i) => println!("smaller than 10"),
        None => println!("None"),
    }
}
```

## `if let Some(i) = variable`と書く方法
以下のようにすると、`c = 10`と表示される。
[Rust公式ドキュメントのChapter17](https://doc.rust-lang.org/book/ch17-03-oo-design-patterns.html#requesting-a-review-of-the-post-changes-its-state)で使われている方法

```rust
fn main() {
    let c = Some(10);

    if let Some(i) = c {
        println!("c = {}", i);
    }
}
```


## `unwrap()`を使う方法
以下のようにすると、`d = 10`と表示される。
[Rust公式ドキュメントのChapter17](https://doc.rust-lang.org/book/ch17-03-oo-design-patterns.html#adding-the-approve-method-that-changes-the-behavior-of-content)で使われている方法

```rust
fn main() {
    let d = Some(10);
    println!("d = {}", d.unwrap());
}
```
`systemd-analyze verify` でcodedeployのエラーが表示される

## 環境情報

- Amazon Linux 2

## 起きたこと

新規に作成したserviceの自動起動設定を行おうとしたところ、下記エラーが発生した

```
$ systemctl enable my.service
Failed to execute operation: Invalid argument
```

詳細調査のため、`systemd-analyze`で確認したところ、下記エラーが表示された

```
$ systemd-analyze verify my.service
Configuration file /usr/lib/systemd/system/codedeploy-agent.service is marked executable. Please remove executable permission bits. Proceeding anyway.
```

## 解決方法

ちょっと乱暴ですが、該当のserviceの権限を変更したら`systemd-analyze`で表示されたエラーは消えました

```
$ chmod 644 /usr/lib/systemd/system/codedeploy-agent.service
```
bootstrap4のテンプレートを使ってjqueryの簡易テスト

初心者の強い味方、BootstrapはjQueryを使い始めた初心者には強い味方。

functionで画面操作をひとまとめにするのってどうやるんだっけ？
簡易に確認したいけど、すぐ実装ってのもなぁ・・・
というわけで、テスト用にコピペで出来るbootstrap4を使って確認してみました。

bootstrap4のテンプレートなら楽にテストができるかなと思い実行してみた。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="RwZEBZZ" data-user="kyo07" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kyo07/pen/RwZEBZZ">
  Untitled</a> by kyo07 (<a href="https://codepen.io/kyo07">@kyo07</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


#参考ページ
https://getbootstrap.jp/docs/4.3/getting-started/introduction/


```html:html

<!doctype html>
<html lang="ja">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

    <title>Jquery初心者用テストテンプレート</title>
  </head>
  <body>
<!--追記開始-->
      <div>
    <h1>Jquery初心者用テストテンプレート</h1>
    <p>id=test1 <input id="test1" var=""></p>
    <p>テスト１の値が１以外のとき確認後にtest2に値が入る<br>テスト１が１のときそのままtest2に値が入る</p>
    <p>id=test2 <input id="test2" var=""></p>
    </div>
<!--追記終了-->
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
    <script>
//テストしたいjsのコードをここに入れる。
$('#test1').on('change', function () {
    var test10 = function() {
        sucsess = "sucsess";
        $('#test2').val(sucsess);
    };
    var test11 = function() {
        comment = "やーん";
        $('#test2').val(comment) ;
    };
    if($('#test1').val() == 1){
        test10();
    }else if(confirm("test")){
        test11();
    }
});
    </script>
</body>
</html>
```


#コードペンの参考
https://qiita.com/fumu238/items/f73274aa1a188eb15794
ESP32をJavascriptでLチカする：LCDとRTCデバイスを制御する

前回の投稿「[ESP32をJavascriptでLチカする](https://qiita.com/poruruba/items/96db9d20e7e4ced7635d)」に引き続き、ESP32でJavascriptを動かします。
今回は、M5StickCについているLCDとRTCを制御してデジタル時計を作ります。

ソースコードもろもろは、前回同様以下に上げてあります。
随時、修正、拡張しています。

poruruba/QuickJS_ESP32

https://github.com/poruruba/QuickJS_ESP32

#LCDを制御する

LCDの制御に、LovyanさんのLovyanGFXを使っています。
そのI/FをJavascriptから叩けるようにしています。

```js:public/main.js
import * as lcd from "lcd";
```

今回デジタル時計で使っているAPIはざっと以下の通りです。

* lcd.width()
* lcd.height()
* lcd.setTextColor()
* lcd.setTextSize()
* lcd.setTextDatum()
* lcd.textWidth()
* lcd.setCursor()
* lcd.print()

見た目で想像できるものばかりかと思いますが、詳細は以下を参照してください。

https://github.com/lovyan03/LovyanGFX

さらに、以下のAPIを追加しています。

* lcd.downloadImage(url)
　urlで示されるサーバの場所から、HTTP Getで画像ファイルをダウンロードし内部に保持します。

* lcd.drawImage(x, y)
　LCDの(x、y)座標に、保持した画像を表示します。

M5StickCのLCDは160x80のサイズですので、あらかじめリサイズしたJPEG画像をサーバに配置しておきます。

#現在時刻を取得する

RTCから時刻を取得します。
WiFi接続時に、NTPと時刻合わせしてあります。

```js:public/main.js
import * as rtc from "rtc";
```

* rtc.getDate()
　現在の日付(Year、Month、Date、WeekDayを取得します。

* rtc.getTime()
　現在の時間(Hours、 Minutes、Seconds)を取得します。

#デジタル時計を作る

ソースコードを示します。

```js:public/main.js
import * as lcd from "lcd";
import * as rtc from "rtc";

var width, height;
var last_update = -1;
var last_minutes = -1;

async function setup() {
  var ipaddress = esp32.getIpAddress();
  console.log("ipaddress=" + ((ipaddress >> 24) & 0xff) + "." + ((ipaddress >> 16) & 0xff) + "." + ((ipaddress >> 8) & 0xff) + "." + (ipaddress & 0xff));

  lcd.downloadImage('http://【WebサーバのURL】/sky_160x80.jpg');

  width = lcd.width();
  height = lcd.height();

  lcd.setTextColor(0x0000ff);
  lcd.setTextSize(3.5);
  lcd.setTextDatum(lcd.middle_left);
}

function to2d(val) {
  return ('00' + val).slice(-2);
}

async function loop() {
  var now = millis();
  if (last_update < 0 || now - last_update >= 10000) {
    last_update = now;

    var time = rtc.getTime();
    if (last_minutes < 0 || time.Minutes != last_minutes) {
      last_minutes = time.Minutes;

      lcd.drawImage(0, 0);

      var str = to2d(time.Hours) + ':' + to2d(time.Minutes);
      console.log(str);

      lcd.setCursor((width - lcd.textWidth(str)) / 2, height / 2);
      lcd.print(str);
    }
  }
}
```

#終わりに

だいぶ楽に作れました。
また、再書き込みが不要なので修正も早いです。

以上
経験が偏ってるAWS3年生がソリューションアーキテクトアソシエイト(SAA)を取得するまで

# はじめに
SAA取得にあたってどんなことをやったのか、どんな気分だったのかを書いていきます
これから受けようとしている方、勉強中の方に少しでも参考になれば嬉しいです！

# 受験を決めたときの状態
* AWSを使用した業務経験3年(くらい)
    * といっても触ってるのはEC2, RDS, S3程度
    * 他のサービス(ECS, Kinesisなど)は全く触ってないか個人でほんの少し触った程度
* 受験歴はなし
* 他のAWS認定資格もなし
* 勉強苦手

AWS経験はありますが、このまま受けても合格する確率は天文学的に低いぐらいの知識量です

# 勉強期間
**1ヶ月**くらいです
だらだらと続けても引き伸ばし続けるだけになりがちなので、短期集中でやるのがいいと思います

自分の場合は試験を受ける日を先に決めてから勉強を開始しました
1週間前とかになると、夏休みの課題に追われていた学生時代を思い出しました

# 使用した教材
#### 参考書
[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書 徹底攻略シリーズ](https://www.amazon.co.jp/dp/B07M7S9GDL/)
いわゆる黒本というやつです

#### Udemy
[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
試験形式の問題集6個(通常難易度1つ + 高難度5つ)セット
セールのときにかなり安くなってたので買っておきました

AWSの模擬試験もありますが、Udemyで慣れそうだったのとお金がかかるのを気にして受けませんでした
余裕がある方は受けてみてもいいかもしれません
[AWS認定アカウント](https://www.aws.training/Certification)のページから受験できます

# どのくらい勉強したの??
参考書1周、あとはUdemyで問題を解くといった感じで進めました

参考書は入門には良さそうでしたが、試験対策には少し弱いと感じたので1周したあとはUdemyの実践に切り替えました

Udemyでは、

```
問題を解く
↓
間違えた or たまたま当たった問題をリストアップ
↓
リストアップした内容を勉強し直す
↓
(最初に戻る)
```

といった感じのループをひたすら実施していました

勉強するときは**ノートにひたすら書いて**覚えるようにしました
個人によってやり方は異なると思いますが、実際に書く方が頭に残りやすかったです
**なぜこの解答が正解なのかを説明できる**くらいを目処に勉強するといいかなと思います

同じUdemyの内容で勉強するなら、

* 通常難易度 80%安定
* 高難度 60~70%

がとれるくらいを目標にするといい感じになると思います
高難度は本番より難しかった気がしてます...

ちなみに筆者の前日までの最終スコアは下記です
3~5がしんでますが、いけんじゃね??的な気分でした

```
演習1: 86%
演習2: 72%
演習3: 55%
演習4: 47%
演習5: 55%
演習6: 72%
```

# いざ本番
[AWS認定アカウント](https://www.aws.training/Certification)のページからピアソンVUEで予約しました
11時くらいからの回を予約して、当日は一切勉強せずに臨みました

最初の方は集中力があるのでそれなりにサクサク進みますが、半分超えたあたりで集中力がきれて、とあるうさぎの「ハァ?」が頭の中でこだましてました

試験後、画面に「合格」の結果が表示され、小さくガッツポーズ決めて帰りました

試験後にアドバイスできるなと感じたことは

* 時間はたくさんあるので割とゆっくりでも大丈夫
* たまに日本語が変なので読むのに疲れる
    * 問題形式に慣れておく
* 数字はしっかり覚えておく
* 前日はしっかり寝るべき

です

> 数字はしっかり覚えておく

一例をあげると、Glacierでの取り出し時間があります

    迅速取り出し   : 1~5分
    通常取り出し   : 3~5時間
    大容量取り出し : 5~12時間

明日までに取り出せればよくて、コスト最適はどれでしょう
みたいな問題が簡単に溶けるようになります

# さいごに
えらそうなこと散々書いてきましたが、筆者のスコは合格ライン720に対し**794**とスレスレです
(850くらいやろと思いながらこのザマです)
調子に乗ってしまいましたが、少しでも参考になれば幸いです。
![スクリーンショット 2021-11-17 202849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544115/3fc4ed02-e099-9a73-afb6-55b517deaed9.png)
Laravel：パスワードリセット実装の仕方

プログラミング初心者です。

##やりたいこと
LaravelのAuthをインストールすると、```Forgot your Password?```という名前でパスワードリセット機能が実装されます。
ただそのままだとメール送信することができず、エラー表示がでました。そこから実装に成功したので、ここに記録します。

日本語やデザイン変更してしまってますが、パスワードリセット部分の写真です。
![スクリーンショット 2021-11-17 1.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1362518/bc40309c-6473-4183-fa6a-03e6d482adfb.png)


##1 まずエラー①
何も自分で実装してなかったのでそのままメール送信すると以下のエラーが出ました。

```
Call to undefined method App\User::notify()
```
###1-1 エラー①解決方法
①Notificationsディレクターに一つもファイル作成してなかったのでCustomResetPasswordという名前で作成しました。

```
$ php artisan make:notification CustomResetPassword
```
②User.phpに以下追記

```User.php
use App\Notifications\CustomResetPassword;

class User extends Authenticatable
{
    //メール送る上で必須
    use Notifiable;

    /**
     * パスワード再設定メールの送信
     *
     * @param  string  $token
     * @return void
     */
    public function sendPasswordResetNotification($token)
    {
        $this->notify(new CustomResetPassword($token));
    }
```

##2 エラー②
エラー①が解決したと思って再度メール送信したら次のエラーが出ました。

```
swift_transportexception expected response code 250 but got code "530", with message "530 5.7.1 authentication required 
```

###2-1 エラー②解決方法
envの設定と、今回送信元に　gmailを使用した為googleのセキュリティー変更をしました。

①以下.envの設定

```.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=使用したい@gmail.com
MAIL_PASSWORD=gmailのパスワード
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=使用する@gmail.com
MAIL_FROM_NAME="${APP_NAME}"
```
②Googleのアカウントで「安全性の低いアプリの許可」を有効にする。
メール送信に使いたいアカウントでgoogleログインし、以下のページで有効化する
https://myaccount.google.com/lesssecureapps

##3 一部日本語化
送信されたメールはデフォルトだと英語になっているので、一部日本語にしました。
CustomResetPassword.phpのtoMailメソッド部分を以下のようにしました。

```CustomResetPassword.php
public function toMail($notifiable)
{
return (new MailMessage)
        ->from('example@gmail.com', config('app.name'))
        ->subject('パスワード再設定')
        ->line('下のボタンをクリックしてパスワードを再設定してください。')
        ->action('パスワード再設定', url(config('app.url').route('password.reset', $this->token, false)))
        ->line('もし心当たりがない場合は、本メッセージは破棄してください。');
}
```

##補足
まずgmailを使用する前に送信テスト的なことをしてみたいと思ったので、MailHogというメールのテストツールを使用しました。

```
インストールの仕方
$ brew install mailhog
$ brew services start mailhog
```
```
.envはこんな感じで設定
MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=sender@example.com
MAIL_FROM_NAME="${APP_NAME}"
```

http://localhost:8025/
にアクセスしてMailHogの画面が表示されれば成功です。



##参考

https://qiita.com/usaginooheso/items/9d61361d449a521a5854

https://yaba-blog.com/laravel-passwordreset-without-email/
【RSpec】例外処理が発生することをテストしたいときに気をつけること

例外処理が発生することをテストするときは```()```ではなく
ブロック```{}```で捉える

```ruby
expect{ instance.method }.to raise_error(RuntimeError)
```
 
##参考

https://qiita.com/jiz/items/0cd302bb16ce55d231cb
[Android Studio]ビルドエラー Gradle project sync failedを解決した方法

Androidアプリのチーム開発をするために、新規プロジェクトの雛形コードをGitHubにPush。

チームメンバがgit cloneして動作確認しようとしたところGradle project sync failedが発生してエラーに。

その時の原因と解決策です。

## 原因

原因は、Android Studioのバージョン違いによる、GradleおよびAndroid Gradle Pluginのバージョン違いでした。

最初にプロジェクトを作成してソースコードをpushした環境は、以前からAndroid Studioをインストール済みだったため、

* Android Studio: 3.1.2
* Android Gradle Plugin: 4.1.3
* Gradle: 6.0.2

一方、チームメンバーはAndroid Studio Arctic Fox (2020.3.1)だったため、デフォルトで同梱されているバージョンが以下となり、旧バージョンに対応していなかったためです。

* Android Gradle Plugin: 7.0.2
* Gradle: 7.0.2

ということで、Android Gradle PluginとGradleのバージョンを上げれば良さそう。

## 解決方法：Android Gradle PluginとGradleのバージョンアップ

プロジェクトで指定されるAndroid Gradle PluginおよびGradleのバージョンを上げます。

Gradleのバージョンを上げるには以下の２つの方法があります。

1. Android StudioのUpdate通知に従ってアップデートする
2. Android Studio > File > Project Structure > Projectからバージョンを上げる

今回は１の方法で解決しました。

2の方法については公式サイトの[Android Gradle プラグインのリリースノート  |  Android デベロッパー  |  Android Developers](https://developer.android.com/studio/releases/gradle-plugin?buildsystem=ndk-build&hl=ja#updating-plugin)に記載があります。

### 環境

* PC: MacBook Air 2020
* OS: macOS Big Sur 11.6
* Android Studio Arctic Fox | 2020.3.1

### Android Gradle PluginとGradleのバージョンアップ手順

Android Studioでプロジェクトを開くと、右下にAndroid Gradle PluginのUpdateを促すポップアップが表示されます。この”upgraded”をクリック。

Android Gradle Plugin Upgrade Assistantというダイアログで、
現在のバージョン(current version)から、アップデートするバージョン(to version)が表示されます。
Android Studio Arctic Fox | 2020.3.1では7.0.2が安定版として標準搭載されています。

アップデートを実行するには右下の”Begin Upgrade”をクリック。

Android Studioの「Upgrade Assistant」タブで、2Run selected steps”をクリック。

１０分ぐらい経つとアップデートが完了します。

Android Studio > File > Project Structure > Projectを確認すると、アップデートされていることが確認できます。めでたしめでたし。

## これで万事解決…とはイカナイ

Gradleのバージョンをアップデートしたところビルドエラーが（汗

どうやらAndroid Gradle Plugin 7.0以上を動かすにはJava 11が必要とのこと。

[AGP 7.0 の実行に JDK 11 が必要](https://developer.android.com/studio/releases/gradle-plugin?buildsystem=ndk-build&hl=ja#jdk-11)

### 解決方法：Android Studio Arctic Fox標準のJava11を利用する

先ほどの画面に出てくるGradle settingsをクリックし、Gradle JDKのプルダウンから、Android Studio java home version 11.0.11を選択します。

次に、build.gradleを、compileOptions を目的の Java バージョンに設定し、compileSdkVersion を 30 以上に設定します。

```groovy
android {
	compileSdkVersion 30

	compileOptions {
		sourceCompatibility JavaVersion.VERSION_11
		targetCompatibility JavaVersion.VERSION_11
	}
}
```

再ビルドしてみたら無事にBUILD SUCCESSFULの表示が！やったね。

## 参考

[[Android Studio]Gradle project sync failedビルドエラーの解決法](https://donachikiblog.com/android-gradle-sync-failed/)
Fluent UIのDetailsListをいじってみる(基礎編)

# 記事を書くきっかけ
React, TypeScriptを始めてから7カ月が経ちました。ある程度慣れてきたので何か残そうと思い、Qiitaで記事を書くことにしました。
どうせなら他の人が書いていなそうなFluent UIについて書いてみようかと思います。

# DetailsList
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2296091/a02cd190-6851-599b-e8a7-824fa884ac6f.png)


# DetailsListでできること
・アイテムの表示・選択(本記事ではここまで)
・選択したアイテムの取得
・インデックスを指定してのアイテムの選択、フォーカスのセット
・セルやヘッダーのカスタマイズ
・見た目の変更( ホバー時や選択時のセルの色等)

# 実際に定義してみる
detailsリストを定義するのには下記の設定が必要です。
・items : 表示するアイテム
・columns : 列の横幅やヘッダーの表示名、ヘッダークリック時の関数等を設定する
・viewport, styles(root) DetailsListの高さと幅を指定する

### 1.import
@fluentui/reactからDetailsListと、カラムの設定に必要なIColumnをインポートします。

```js
import { DetailsList, IColumn} from '@fluentui/react';
```

### 2.アイテムの定義
DetailsListに渡すアイテムを定義します。
ヒト型のデータとし、インターフェース名をIPersonとします。
アイテムのnameは好きな歌手の名前がおぼろげに浮かんだのでそれを書きました。

```js
interface IPerson
{
  key?:string;
  name?:string;
  age?:number
};

const items:IPerson[] = [
  {'key':'1', 'name':'deng', 'age':10},
  {'key':'2', 'name':'zi', 'age':20},
  {'key':'3', 'name':'qi', 'age':30}
];
```

### 3.カラムの定義
DetailsListに渡すカラムを定義します。IColumnsの配列をわたすひつようがあります。
name: カラムに表示する名前
fieldName: セルに表示する名前(上記アイテムのname, ageを指定しています)
onColumnClick: カラムクリック時の関数 イベントと選択したカラムが渡されるので便利

```js
const columns:IColumn[] = [
  {'key':'column1', 'minWidth':80, maxWidth:120,  name:'Name', fieldName:'name', onColumnClick:(e, column)=>alert(column.name)},
  {'key':'column2', 'minWidth':80, maxWidth:120,name:'Age', fieldName:'age', onColumnClick:(e, column)=>alert(column.name)},  
]
```
ここのfieldnameと、インターフェースのプロパティ名(name, age等)を一致させないと表示されないので注意してください。

### 4.DetailsListの定義

DetailsListを定義し、これまでに定義したアイテムとカラムをセットします。
(サイズを固定するためにviewportとstylesを設定しています。)

```js
const MyGrid = () => 
  <>
    <DetailsList viewport={{width:400, height:400}} styles={{root:{maxWidth:400, maxHeight:400}}} 
items={items} columns={columns}/>
  </>
```

# コード全体

```js
import { DetailsList, IColumn} from '@fluentui/react';

interface IPerson
{
  key?:string;
  name?:string;
  age?:number
}

const items:IPerson[] = [
  {'key':'1', 'name':'deng', 'age':10},
  {'key':'2', 'name':'zi', 'age':20},
  {'key':'3', 'name':'qi', 'age':30}
]

const columns:IColumn[] = [
  {'key':'column1', 'minWidth':80, maxWidth:120,  name:'Name', fieldName:'name', onColumnClick:(e, column)=>alert(column.name)},
  {'key':'column2', 'minWidth':80, maxWidth:120,name:'Age', fieldName:'age', onColumnClick:(e, column)=>alert(column.name)},  
]

const MyGrid = () => 
  <>
    <DetailsList viewport={{width:400, height:400}} styles={{root:{maxWidth:400, maxHeight:400}}} items={items} columns={columns}/>
  </>

export default MyGrid;

```

# まとめ
簡単にDetailsListを定義できます。説明が雑ですいません。
【Rails】例外処理raise

##環境
Ruby 3.0.2
Rails 6.1.4.1

引数にメッセージのみ指定すると初期値のRuntimeErrorが発生する

```ruby
raise 'error message'
```

第1引数に例外クラス、第2引数にエラメッセージを指定できる

```ruby
raise NoMethodError, 'error message'
```


##参考

https://techacademy.jp/magazine/28226

https://mgmmy.hatenablog.com/entry/2019/12/01/232019
RHEL のサブスクリプションにシステムを登録するワンライナー

以下のコマンドでシステムを登録することができる。

```
subscription-manager register --username <user_name> --password '<password>' --auto-attach
```

複数インスタンスを登録する場合は、ssh を使って

```
ssh server1 -C 'subscription-manager register --username <user_name> --password <password> --auto-attach'
ssh server2 -C 'subscription-manager register --username <user_name> --password <password> --auto-attach'
ssh server3 -C 'subscription-manager register --username <user_name> --password <password> --auto-attach'
```

という感じで一括で登録できる。

## 2021-12-01 追記

今までだと Subscription が一つだけなので問題なかったが、 「Red Hat Beta Access」 を利用し始めたところ `--auto-attach` が失敗するようになった。

pool ID を直接指定することで、問題が解決した。

```
subscription-manager register --username <user_name> --password '<password>' &&\
subscription-manager subscribe --pool=<pool_id>
```

pool ID は以下のコマンドで確認できる。

```
subscription-manager list --available
```

## Environment

* RHEL(6|7|8)
手順と補語の助詞

　プロデルの手順で使える助詞には何があるか。

## 助詞
### が

```プロデル
［甲］がアレする手順
	甲を表示
終わり
「あ」がアレする
```

→動作OK

### の

```プロデル
［甲］のアレする手順
	甲を表示
終わり
「あ」のアレする
```

→エラー

### を
```プロデル
［甲］をアレする手順
	甲を表示
終わり
「あ」をアレする
```

→OK

### に，へ

組み込みの手順を見ても，「に」と「へ」は交換可能のようである。

```プロデル:手順いろいろ.rdr
［甲］に［乙］へアレする手順
	甲＆乙を表示
終わり
「あ」に「い」へアレする
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150160/54026a76-8cf0-f26c-b45f-87a35d84028b.png)

こうなるんだ。

　なお，

```プロデル
「あ」へ「い」にアレする
```

の場合も同じ結果になったので，1つ目の引数が優先される模様。

### と

```プロデル
［甲］とアレする手順
	甲を表示
終わり
「あ」とアレする
```

→エラー

### から

OK

### より

エラー

### で

OK

### まで

OK

## 助詞まとめ

```プロデル
［甲］が［乙］を［丙］に［丁］から［戊］で［己］までアレする手順
	甲＆乙＆丙＆丁＆戊＆己を表示。
終わり
「あ」が「い」を「う」に「え」から「お」で「か」までアレする。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150160/a84c7424-af28-d724-0d30-80ad16011e5d.png)

## 助詞以外

　[ドキュメント](https://docs.utopiat.net/rdr/manual/primitive/string.htm)を見ると，

```プロデル
【文字数】文字、【自分】の末尾から消す
```

とか

```プロデル
【自分】から【列番号】番目と【列番号】番目を交換する
```

などが定義されている。自作の手順でもできるのか。

### 文字

```プロデル
［言語］文字，出す手順
	言語を表示
終わり

「アラビア」文字，出す
```

→OK

### 番目2つ

```プロデル
［あ］番目と［い］番目でどうにかする手順
	あ＆いを表示
終わり

1番目と2番目でどうにかして
```

→OK

### 何でも良い？

[ドキュメント](https://docs.utopiat.net/rdr/manual/syntax/procedure.html)には実補語を「，」で区切って書くように書かれている。区切ってあれば何でも良いのだろうか？

```プロデル
［春はあ］けぼの，［やうやう］白くなりゆく山ぎは，［すこしあ］かりて，［紫だちた］る雲の，ほそくたなびきたる手順
	春はあ＆やうやう＆すこしあ＆紫だちたを表示
終わり

「あ」けぼの「やうやう」白くなりゆく山ぎは「すこしあ」かりて「紫だちた」る雲のほそくたなびきたる
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150160/b784b1c7-c332-35b6-250b-8e7dda95ea98.png)

動いた。


## まとめ

「，」で区切らない場合は，「が」「を」「にorへ」「で」「から」「まで」が使える。区切れば何でも使える。
pangu-spacing.el : 全角と半角の間に自動でスペースを入れる

* [pangu-spacing.el : 全角と半角の間に自動でスペースを入れる新実装](http://emacs.rubikitch.com/pangu-spacing/) 

上記の Tipsを参考にして、markdown-modeに導入してみた。

日本語においては、いわゆる半角文字と全角文字の間にスペースを入れた方が見やすいと言われていて、`pangu-spacing.el` はそれを自動で行ってくれるというものです。

ただ、「Google日本語入力」などと書くときに「Google 日本語入力」となり、なんとなく間延びした感じになるのが好みではなかったので、**アルファベット文字列の前にだけスペースが入る** ようにカスタマイズした。

`pangu-spacing.el`のコードを見るとデフォルトでは、正規表現で [a-zA-Z0-9] なっているので半角数字の場合にも同様に処理されてしまう。数字にも半角スペースが有効になると、[2021 年 11 月 16 日] という感じになるので、日付表示のケースでは面白くない。

そこで、正規表現の記述を [a-zA-Z] に変更して **半角数字は対象外** としアルファベットのみが pangu-spacingの対象となるようにしている。

```emacs-lisp
(leaf pangu-spacing
  :ensure t
  :hook ((markdown-mode-hook text-mode-hook) . pangu-spacing-mode)
  :config
  (setq pangu-spacing-real-insert-separtor t)
  (setq pangu-spacing-include-regexp
		(rx (or (and (or (group-n 3 (any "。，！？；：「」（）、"))
						 (group-n 1 (or (category japanese))))))
			(group-n 2 (in "a-zA-Z")))))
```

上記の例では、markdown-mode と text-modeに導入している。
ボタンを押したら画面上の数字が増減するだけのアプリを作りました。

## 作ったアプリ
https://agitated-ptolemy-d15ec6.netlify.app/
「Increase」か「Decrease」ボタンを押すと、画面中央の数字が増減します。
ライブラリやフレームワークは使わずに作成しました（リセットCSSだけ使用）。
[こちら](https://dev.to/codefoxx/25-beginner-javascript-project-ideas-3m9h)のProject No.5を元ネタにさせてもらいました。

## 特記事項
### ボタンを押すとき、レイアウトが崩れる
ボタンを押したときに枠線を太くするために`:active`に`border`を設定すると周りの要素も影響を受けます。で、これ自体は`border`ではなく、`outline`を設定すれば解決することが出来ます。

```css
.btn:active {
    outline: 3px solid #a9a9a9; /* borderではなくoutline */
}
```

しかし、この時に`.btn`に`border`の代わりに`outline`を設定すると、ボタンをクリックしたときに枠線が消えます。ボタン以外の場所をクリックすると元に戻ります。

```css
.btn {
    outline: 1px solid #a9a9a9;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681683/d56ef1bf-1dc6-12e0-46b7-45e785bfa905.png)
これを回避するために、`.btn`には`border`を設定し、`.btn:active`には`outline`を設定するようにしました。

```css
.btn {
    border: 1px solid #a9a9a9;
}

.btn:active {
    outline: 3px solid #a9a9a9; /* borderではなくoutline */
}
```

### ボタンを押したときの動作
最初に数字を表示する`div`要素を取得して、0を設定しています。
「Increase」ボタンが押されると現在の要素の値を取得して、`String`から`Number`に変換して1を足しています。

```html:index.html
<div class="number"></div>
```

```JavaScript:script.js
const currentNum = document.querySelector('.number')
currentNum.textContent = 0

const increaseBtn = document.getElementById('increase')

increaseBtn.addEventListener('click', () => {
  currentNum.textContent = Number(currentNum.textContent) + 1
})
```

## 参考文献・記事
[MDN](https://developer.mozilla.org/ja/)
【初心者向け】Railsのビューでエラーが表示されない・レイアウトが崩れる

###■環境
・Windows10(64bit)
・Ruby 2.7.4
・Rails 5.2.6
・devise 4.8.0
###■Railsのビューでエラーが表示されない
####状況
Railsアプリケーションにgem「devise」をインストールし、ビューは「users」ディレクトリ内に格納するようにした。
（デフォルトの　app\views\devise　ではなく　app\views\users　に）
そして、ビューのフォームを「form_for」から「form_with」に書き換えるなどカスタマイズした後から、ユーザ情報更新時などにビューでエラーメッセージが何も表示されなくなった。
####原因
１）「form_with」内に「local: true」を追加していなかった。
２）renderメソッドでのリソース指定を修正していなかった。
####対処
１）local: trueの追加

```app\views\users\registrations\edit.html.erb
#修正前
<%= form_with(model: resource, scope: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
#修正後
<%= form_with(model: resource, scope: resource_name, url: registration_path(resource_name), html: { method: :put }, local: true) do |f| %>
```

２）リソース指定の修正（resource:　→　model:）

```app\views\users\registrations\edit.html.erb
#修正前
<%= render "users/shared/error_messages", resource: resource %>
#修正後
<%= render "users/shared/error_messages", model: resource %>
```

####参考情報
[【Rails】form_with/form_forについて【入門】](https://qiita.com/snskOgata/items/44d32a06045e6a52d11c)
[【Rails 5】(新) form_with と (旧) form_tag, form_for の違い](https://qiita.com/hmmrjn/items/24f3b8eade206ace17e2)
[【Rails】deviseのビューのform_forをform_withに置き換える](https://qiita.com/wonder_meet/items/fac07af1edcd79ad102a)
###■ビューのレイアウトがエラー発生項目だけ崩れる
####状況
ユーザ情報更新画面には名前・emailアドレス・パスワードなどの入力フォームがある。そして、パスワードを要件を満たさずに設定しようとすると、ビューにエラーメッセージ自体は正常に表示される。
しかし、パスワード欄だけ入力フォームのレイアウトが崩れる。
####原因
ビューのエラーメッセージ箇所に、クラス「field_with_errors」のdivタグが自動挿入されている。
####対処
クラス「field_with_errors」へのスタイル適用

CSSでクラス「field_with_errors」を定義すればよい。
以下はSCSSを利用している場合の対処例。

```scss:app\assets\stylesheets\application.scss
	.field_with_errors {
	  display: contents;
	}
```

####参考情報
[Railsのエラーメッセージでフォームのレイアウトが崩れる](https://zenn.dev/aosan/scraps/2f65d7dc30fc47)
WSL2でUbutut仮想環境をサクサクつくる

Windowsでubnutu環境を立ててvscodeでコーディングしたいだけなのにdockerの記事ばかり出てくるので、Ubuntu開発環境構築をメモしておく
この方法だと何個も仮想マシンをサクサク入れられる
# WSL2のインストール
```powershell:PowerShell
wsl --install
```
最新のwindowsならこれだけ
この辺にのってる
https://docs.microsoft.com/ja-jp/windows/wsl/install
https://docs.microsoft.com/ja-jp/windows/wsl/install-manual

# Ubuntuイメージのダウンロード
wslにはrootfsイメージが必要なので、以下のサイトから"*wsl.rootfs.tar.gz"をダウンロードする
https://cloud-images.ubuntu.com/hirsute/current/
(21.04以外を使いたい場合は "ubuntu rootfs tar"　とかでググればでてくる)
*Microsoft公式からダウンロードした.appxの一部を使う方法もあるらしい
http://www.y2sunlight.com/ground/doku.php?id=wsl2:ubuntu
*コンテナからイメージを作成するのがMicrosoftの公式に乗ってるが面倒くさい
https://docs.microsoft.com/ja-jp/windows/wsl/use-custom-distro


# 仮想マシンのインポート
rootfsが準備できたらコマンドでインポートする
`wsl --import <ディストリビューション名> <ディストリビューションを格納するフォルダー> <rootfsのパス>`

```powershell:PowerShell
wsl --import ubuntu21.04-dev .\Desktop\wsl_distro\ubuntu20_04\ .\Downloads\hirsute-server-cloudimg-amd64-wsl.rootfs.tar.gz
```

`wsl -l -v` でインポートしたディストリビューション名があることを確認

```powershell:PowerShell
wsl -l -v
 NAME                   STATE           VERSION
* ubuntu21.04-dev        Stopped         2
```

`wsl -d <ディストリビューション名>`で起動してubuntuに入れることを確認

```powershell:PowerShell
wsl -d ubuntu21.04-dev

#出力
root@{device-name}:/mnt/c/Users/{windows-user-name}#
```


# 管理者(root)のパスワード設定
ubuntuに入ってrootのパスワードを設定する

```bash:bash
passwd
```

# 管理者(root)のパスワード設定
この方法で仮想マシンをつくるとroot ユーザでログインすることになるので一般ユーザーを作成してデフォルトユーザーとデフォルトディレクトリを一般ユーザーに変更する。(必要ない人はrootのままでOK)

```bash:bash
useradd -m -s $(which bash) new-user-name

passwd new-user-name

usermod -G sudo new-user-name

echo 'cd ~' >> /home/new-user-name/.bashrc

cat << EOF > /etc/wsl.conf
[user]
default=user-name
[interop]
appendWindowsPath = false
EOF

exit
```

一旦仮想マシンを落とす

```powershell:PowerShell
wsl -t ubuntu21.04-dev
```

仮想マシンにログインして一般ユーザーになっていることを確認

```powershell:PowerShell
wsl -d ubuntu21.04-dev

#出力
new-user-name@{device-name}:$
```

# vscodeからUbuntuにアクセス
Remote - WSLのExtensionを入れるだけ
VSコード左下角の><マークを押して New WSL Windows using distro...でディストリビューション名を選択する

# 仮想マシンの削除

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

```powershell:PowerShell
>  wsl --unregister ubuntu21.04-dev
```
これだけ


サクサク作ってサクサク削除しよう

# 参考
https://devlights.hatenablog.com/entry/2021/05/29/070000
http://www.y2sunlight.com/ground/doku.php?id=wsl2:ubuntu
【無料の動画素材】ゲーム・アプリ開発におすすめの動画素材ダウンロードサイト9選！

ゲーム開発、アプリ制作におすすめの、動画の素材サイト【無料】をまとめてみました。

https://kaedeee.com/app-famous-movies-download-site

それぞれの短所・長所も追加でまとめて行きます。

##Pexels

https://www.pexels.com/videos/

![スクリーンショット 2021-11-17 20.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/f305bae5-3326-1c35-c3e6-64d18803d653.png)


**長所**
これだけでいい、ちょうどいい。

**短所**
長めの動画はない。


##IgniteMotion

https://www.ignitemotion.com

 ![スクリーンショット 2021-11-17 20.32.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/cc54fd8e-61cc-7a3b-dd25-7e483f5645a6.png)



**長所**
厨二病な動画、男のロマンな動画が集まっている。

**短所**
量はそんなにない。

##OPENFOOTAGE .NET

https://www.openfootage.net

![スクリーンショット 2021-11-17 20.33.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/77a329ca-cd15-c0bc-bd7c-a3bda4fc0c11.png)


**長所**
SFチックな動画はここ。
宇宙人系の動画が多い。

**短所**
ニッチな使い道。

##COVERR

https://coverr.co

![スクリーンショット 2021-11-17 20.33.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/3f9fca09-d6f0-bbdc-6351-813c5db607e8.png)


**長所**
外国人のおしゃれな日常。という感じ。

**短所**
少しサイトが重い。


##VIDEVO

https://www.videvo.net

![スクリーンショット 2021-11-17 20.33.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/b638d3a6-7fe5-a10c-974e-fde83fe7520a.png)


**長所**
抽象デザインの動画がある。
カウントダウンの動画がある。

**短所**
制作物が、圧倒的クオリティの動画に負けそう。


##After Effects Style

https://ae-style.net/materials/

![スクリーンショット 2021-11-17 20.33.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/e680d4f9-31e0-4aac-1ae6-e094d2565921.png)


**長所**
抽象デザインの動画が豊富
日本語対応。

**短所**
素材は多くない。

##無料映像素材　フリー素材館

http://www.namaewallpaper.com/movie/index.html

![スクリーンショット 2021-11-17 20.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/a636a0d0-8e94-3249-7116-be717320b5d2.png)


**長所**
日本語対応
日本の景色といえば、な動画サイト。

**短所**
モダンな動画はない（主観ですが）


##MotionElements

https://www.motionelements.com/ja/free/stock-footage

![スクリーンショット 2021-11-17 20.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/13d1124c-846a-f2d2-bf89-90334bebc045.png)


**長所**
抽象デザインの動画がかなり豊富。

**短所**
検索機能が少し弱い。。弱くない。。？

##shutterstock

https://dareful.com

![スクリーンショット 2021-11-17 20.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/505b4436-5ff1-451c-0344-ef438b2dbe71.png)


**長所**
海外の景色系の動画が豊富。
４Kあり。

**短所**
サイトが少し重たい。



##終わり
9つのおすすめ動画素材ダウンロードサイトをご紹介しました。
タイピングで、手がバッチェ疲れたんよ〜。

https://kaedeee.com/app-famous-movies-download-site/
種類の継承

　CKAN種類を継承してdata.go.jp用に種類を作成する。

```プロデル
日本政府データ取得器とは
	CKANを継承する。
	はじめの手順
		ベースURIは，「https://www.data.go.jp/data/」。
	終わり
終わり
```

　`［種類］を継承する`で継承できる。はじめの手順内で`ベースURI`の値を設定しているが，

```プロデル
日本政府データ取得器とは
	CKANを継承する。
	ベースURIは，「https://www.data.go.jp/data/」。
終わり
```

とするとうまくいかない。

　次に，XLSX形式のデータセットを検索する手順を種類内に用意した。

```プロデル
自分がエクセル形式のデータセットを［数］個，検索する手順
	自分が｛q=「res_format:XLSX」，rows=数｝でパッケージを検索する。
	それを返す。
終わり
```

　更に，文字列でデータセットを検索する手順も用意した。

```プロデル
自分が［クエリ］という名前のデータセットを［数］個，検索する手順
	自分が｛q＝「title:［クエリ］」，rows＝数｝でパッケージを検索する。
	それを返す。
終わり
```

　プロデルの手順において引数は助詞を伴って用意するのが自然な書き方であるが，数値を受けとりたい場合に良い助詞がなく困っていた。ドキュメントを見てみると，一部の手順で「，」を入れることでなんとかなっているようなので試したところ，上記で上手く動いてくれた。

　以下のプログラムを実行した。

```プロデル
あという日本政府データ取得器を作る。
あが「全国観光入込客統計のとりまとめ状況」という名前のデータセットを5個，検索する。
それを報告せよ。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150160/b858df03-0c2a-d413-1582-e2792a232f41.png)

　きちんと動いている。
湿度が高いとコロナの感染が弱まるって聞いた気がするけど本当か検証してみた

## 定義

2020年1月から12月までの東京の月の平均湿度と、
同じ期間の東京のコロナの新規感染者数の月の平均数で相関係数を出し、0.5以上あったら関係していることとする

## 利用したデータ

### 湿度データは気象庁から

https://www.data.jma.go.jp/gmd/risk/obsdl/index.php

[![Image from Gyazo](https://i.gyazo.com/275a099c90cfe12c0bcab95c79f2d40f.png)](https://gyazo.com/275a099c90cfe12c0bcab95c79f2d40f)

地域は東京

[![Image from Gyazo](https://i.gyazo.com/a8967bce64edc54344f41baee9c20d00.png)](https://gyazo.com/a8967bce64edc54344f41baee9c20d00)

データは湿度のみで、月別に

[![Image from Gyazo](https://i.gyazo.com/971c22a4e568f853b522431ac36fc7fc.png)](https://gyazo.com/971c22a4e568f853b522431ac36fc7fc)

期間は2020年のみ

### 東京のコロナ感染者数のデータ

https://github.com/tokyo-metropolitan-gov/covid19/blob/development/data/data.json

## ソースコード

```python
import numpy
import json
import requests
import datetime

# 気象情報の読み込み
json_open = open("output.json")
weatherData = json.load(json_open)
# print(weatherData)

# コロナ情報の読み込み
response = requests.get("https://raw.githubusercontent.com/tokyo-metropolitan-gov/covid19/development/data/data.json")
covidData = response.json()
covidDateData = covidData["contacts"]["data"]
# print(covidData["contacts"]["data"][0])

# 湿度だけのデータにする
humidityMonth = []
for wd in weatherData:
  humidityMonth.append(int(wd["平均湿度(％)"]))
# print(humidityMonth)

# コロナ情報を2020年だけ月別に集計
covidMonthTotal = [0,0,0,0,0,0,0,0,0,0,0,0]
for d in covidDateData:
  dt = datetime.datetime.strptime(d["date"], '%Y-%m-%d')
  if dt.year == 2020:
    covidMonthTotal[dt.month-1] += d["小計"]
# print(covidMonthTotal)

# データを用意
x = numpy.array(humidityMonth)
y = numpy.array(covidMonthTotal)

# 相関行列を計算
coef = numpy.corrcoef(x, y)

# 相関行列を表示
print("湿度とコロナ感染者数の相関係数")
print(coef[1][0])
```

結果は、`0.3891040023369774 `

## 考察

（コメントをいただいてから考察を追記しています。いただいたコメントは大変参考になりましたし、自分も感じていたことのため、これらをまとめるような形になりました。また、的外れなまとめになってしまったらすみません。コメントいただいた方々ありがとうございます！）

* 前提として今回の場合、相関係数が0.5以上という基準は低すぎる
    * コロナ感染者数は様々な要因があるため
    * 参考：https://qiita.com/StrawBerryMoon/items/0fd0d48df64c8869cd9a
* 月別平均値では大雑把すぎるし、データが少ない
* コロナ感染は時差があるのではないか
    * 例えば、湿度が高い時期の2週間後と比べる
* 東京以外のエリアも調査し、コロナ感染者数に関連する要因をできるだけ少なくする　
    * 緊急事態宣言が一番の要因だと感じるし
【Go】自動生成されたdocument idを取得したい【Firestore】

Goにて、Firestoreのデータをクエリで引っ張ってくるときに、document idを取ってくる方法がなかなか見つからなかったので、自分の備忘録です。

#結論
iter.Next()した結果は「DocumentSnapshot」になる。
doc.Ref.ID　でdocument idを取ってこれる。

``` go
iter := client.Collection("activities").Where("Date", "==", v).Documents(ctx)

var result []interface{}
for {
	doc, err := iter.Next()
	if err == iterator.Done {
		break
	}
	if err != nil {
		fmt.Fprint(w, err)
		return
	}
	fmt.Println(doc.Ref.ID)
	m := doc.Data()
	m["id"] = doc.Ref.ID
	result = append(result, m)
}
```

#参考
https://pkg.go.dev/cloud.google.com/go/firestore#DocumentSnapshot
https://pkg.go.dev/cloud.google.com/go/firestore#DocumentRef
【無料イラスト】ゲーム・アプリ開発におすすめのイラストダウンロードサイト4選！

アプリ制作におすすめの、イラストの素材サイト【無料】をまとめてみました。

https://kaedeee.com/app-famous-illustrate-download-site/


それぞれの短所・長所も追加でまとめて行きます。


##いらすとや

https://www.irasutoya.com

![スクリーンショット 2021-11-17 20.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/17270645-ee92-cbe2-2a8e-1e2807a19a4c.png)



**長所**
みんな使ってる。
豊富すぎる量。

**短所**
既視感はある。

##イラストレイン

https://illustrain.com

![スクリーンショット 2021-11-17 20.12.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/9e0e5a29-3f89-109b-28fd-0c9c83cd2693.png)


**長所**
子供向けならお任せ。

**短所**
強いていうならデザインが一辺倒

##PIYOTASO

https://hiyokoyarou.com

![スクリーンショット 2021-11-17 20.11.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/6ef8d49a-5e75-8af3-c489-7f9f13f7b89c.png)



**長所**
かわいい
ひよこ系なら大体出てくる。

**短所**
ひよこしかない（当たり前）


##ニコニ・コモンズ

https://commons.nicovideo.jp/materials/

![スクリーンショット 2021-11-17 20.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/ff4c2eb3-e0e1-34f1-6861-4a134652f164.png)




**長所**
武器、防具のイラストがある

**短所**
作品によって使用範囲がまちまち（営利的目的はNoなど）


##終わり
2つのおすすめ写真素材ダウンロードサイトをご紹介しました。
こんな便利なサイト作った開発者、誇らしくないの？

https://kaedeee.com/app-famous-illustrate-download-site/
Kotlinのエラー:java.lang.NoClassDefFoundError: Could not initialize class org.jetbrains.kotlin.com.intellij.pom.java.LanguageLevel

“Kotlin サーバーサイドプログラミング実践開発“ 著者:竹端 尚人にて
第2部のアプリケーション作成でSpring Initializrをダウンロードしてビルドしただけなのにエラーが出たのでその対処


<strong>gradleのキャッシュを削除<strong>

```
$ rm -rf $HOME/.gradle/caches/
```


以上。


原因はJDL15で以前いじっていたことがあったからそれが原因みたい。

一応、不要なJDKは削除しておいたほうがいいかも

インストールされているJDLの削除方法

```
//現状インストールされているJDKを一覧で取得
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    11.0.13, x86_64:    "Amazon Corretto 11"    /Users/nash/Library/Java/JavaVirtualMachines/corretto-11.0.13/Contents/Home
    11.0.12.1, x86_64:  "Amazon Corretto 11"    /Users/nash/Library/Java/JavaVirtualMachines/corretto-11.0.12/Contents/Home

/Users/nash/Library/Java/JavaVirtualMachines/corretto-11.0.13/Contents/Home

```
```
// corretto-11.0.12を削除する場合は下記のように書く
$ sudo rm -rf /Users/nash/Library/Java/JavaVirtualMachines/corretto-11.0.12/
```