OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Linux VMでNGINXをとりあえず立ち上げる

#概要
AzureでWebサーバを立ち上げたいときは、一通り揃っているApp Serviceを使いますが、ここではApp Serviceにあるもの以外の機能を使いたい人のために、Linux VMを使ったWebサーバの立て方を書いていきます。

**(※セキュリティ面に関しては、利便性しか考えていないので，実際の業務などでは対策を施してください。
この記事は、「あくまでも練習で」程度で書いているので、本番環境に使用して損害などが出ても知りません。)**

#今回作った環境
- Azureのサービス：Azure Virtual Machines
- OS： Debian 9.9
- Webサーバ： NGINX 1.14.2-2+deb10u1

#では、始めましょう！
##VMを作る
1. Azureに[ログイン](http://portal.azure.com)し，ダッシュボードを開きます。
2. 画面左側にある「+リソースの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/af900e80-b5e8-67b5-3463-96ad1bef565b.png)

3. 出てきた一覧から，「Virtual machine」を探して「作成」をクリックします。
4. 各設定は以下の通り変更しましょう
 - イメージ：Debian 9 "Stretch" with～
 - 認証の種類：パスワード
 - ユーザ名：お好きに
 - パスワード：お好きに
 - パブリック受信ポート：選択したポートを許可する
 - 受信ポートを選択：HTTP(80)とSSH(22)にチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/cc7d94fd-2126-a076-ac16-50e0b961f48f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/f2e21492-9347-bb29-7ee7-21f6d5c9502b.png)

あとの項目はご自分の好きなように設定してください。
5. すべての設定が終わったら、最後のページの「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/a482e421-6da7-0668-35d2-5f104528f0f7.png)
6. 自動的にデプロイが始まるので、コーヒーでも飲んでください。
7. 「デプロイが完了しました」と表示されたら「リソースへ移動」をクリック。
8. お疲れ様でした。VMの完成です。

##SSHでVMにつなぐ
無事，VMがデプロイ出来たら、次はSSHを使用してVMを操作しましょう。
このステップをやる前に，SSHクライアントを準備しておいてくださいね。
ない場合は[TeraTerm](https://ja.osdn.net/projects/ttssh2/)や[PuTTY](https://www.putty.org/)をダウンロードしておいてください。

1. 前回の「リソースへ移動」をクリックした後、以下のような画面になっていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/63c70707-27d5-c06c-3b73-075aef37e6c8.png)

2. 上の図の赤いところに「パブリックIPアドレス」が書いてあるので，これをコピーします。
3. SSHクライアント(ここではTeraTermを使います。)を開き...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/3b55600b-ecb6-08cc-ac8a-ce8dc9d2abc1.png)
「ホスト」の所に先ほどコピーしたパブリックIPアドレスをペーストします。

4. 「OK」をクリックすると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/75ec62ba-9216-aa9b-adcf-73467a244f9d.png)
認証画面が出てくるので，「ユーザ名」と「パスフレーズ」に，先ほどAzureで決めたものを入力します。

5. 無事に認証が通ると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/9cdb421e-805e-4d8d-6037-11d838171fbb.png)
こんなかんじになると思います。

##NGINXをインストールしていこう
さて、それではWebサーバのNGINX(えんじんえっくす)をインストールしていきましょう。

1. まずは `sudo apt-get update` を実行します
2. 次に、`sudo apt-get install nginx` を実行して、NGINXをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/7a0ab0bc-fc08-7910-8d95-f0d869251d4e.png)
このように「Do you want to continue? [Y/n]」と聞かれたら `Y` を入力してEnterキーを押すと、
自動的にインストール作業が進みます。

**お疲れさまでした。**ここまでの手順でLinux VMにNGINXをインストールすることができたと思います。

##設定をしよう
NGINX自体の設定ファイルは`/etc/nginx/nginx.conf`なので、煮るなり焼くなりコロ助なり。
各種設定などは、ほかのサイトや文献を参考にしてみてください。

---
以上になります。よいNGINXライフを！
EC2 Instance Connect とは何なのか

通常のプロジェクトにおいては踏み台サーバを用意するのが一般的だと思います。
この踏み台サーバにおいて面倒なのは鍵の扱いです。多くの場合、公開鍵認証を用いると思いますが、ユーザを追加する都度、当該ユーザの公開鍵を踏み台サーバに登録するのは面倒です。同様に、ユーザがプロジェクトを離任したとき、ユーザの鍵を削除するのもまた面倒でしょう。
 
公開鍵認証以外の選択肢としては証明書による認証も可能です。
証明書による認証であれば、いつまでログインさせることを許容するかという期限設定も可能になるので柔軟性は増します。一方で、CA管理という別の煩雑さを招くことになります。

- https://support.conoha.jp/v/openssh/
 
AWSにおいては、そもそも鍵を管理しないようにすればいいのでは？という、EC2 Instance Connect という機能があります。今日は簡単にその機能についてまとめてみます。
 
# EC2 Instance Connect とは
 
EC2 Instance Connect (EIC) は、一言でいえばユーザの鍵をサーバ側で一時的にしか保存しないことにより、鍵管理なんかなくしてしまおうぜ、という機能になります。
認証に使用する公開鍵を `SendSSHPublicKey` というAPIを呼び出してサーバに登録するのですが、サーバはこの鍵を 60 秒だけ instance metdata に保存します(※)。逆にいうと、60秒経過するとこの鍵の情報は揮発してしまうので、それ以上のログインはできなくなります。
揮発する以上、鍵情報はサーバ側（踏み台等）で管理しなくて済みます。
 
※内部的には、sshd の `AuthorizedKeysCommand` を指定することで、metadata から公開鍵を取得するように変更しているようです。
 
# EICのミソ
 
このEICのミソは何かというと、`SendSSHPublicKey` というAPIを経由させることだろうと思います。必ずAPIを経由するので、IAMでこのAPIを呼び出せるユーザがだれか、という観点で権限管理が可能です。また、このAPIが呼び出されたことをトリガにすることで、CloudTrail にもログを残せます。
sshd レベルで権限を管理していたものが IAM での管理に一元化できますし、同様に sshd レベルでログイン履歴を残していたものが、CloudTrail に一元化できます。
 
# 面倒くさいもの
 
便利そうではあるのですが、公開鍵をサーバへ登録するのは割とだるくて、[EC2 Instance Connect を使用して接続する - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html) から引用すると以下のようなコマンドを都度実行しなければなりません。ssh ログインに手間取って60秒が経過してしまうとやり直しになってしまいます。
 
```tcsh
$ aws ec2-instance-connect send-ssh-public-key --region us-west-2 --instance-id i-001234a4bf70dec41EXAMPLE --availability-zone us-west-2b --instance-os-user ec2-user --ssh-public-key file://my_rsa_key.pub
```
 
このあたりは非常に面倒なので、AWS 側で
 
1. 鍵ペアの生成
2. 公開鍵のサーバへの登録
3. 対象サーバへログイン
 
という動作を一度に行ってくれる `mssh` が用意されていますし、sftp 用には `msftp` もあるようです。
詳細はこちらから。
 
- https://github.com/aws/aws-ec2-instance-connect-cli
非JSONの文字列が含まれるファイルに対してjqを使いたい

jq は CLI で使用できる JSON processor でみなさんも日々お使いのことと存じます。

- https://stedolan.github.io/jq/

# 問題

jq は標準入力に対して様々なフィルタや加工を行えるわけですが、基本的にはその入力フォーマットが JSON になっていることがベースになります。
このため、以下のように JSON の形ではない行が混ざると、問題になります。

```json
{"level":"info","msg":"hello world","time":"2019-09-01T07:01:28.99333+09:00"}
hoge
{"level":"info","msg":"hello world","time":"2019-09-01T06:58:28.99333+09:00"}
fuga
{"level":"info","msg":"hello world","time":"2019-09-01T07:03:28.99333+09:00"}
```

例えば上記のファイルを jq に通すと、エラーになります。

```tcsh
$ cat log.json | jq -c '.'
{"level":"info","msg":"hello world","time":"2019-09-01T07:01:28.99333+09:00"}
parse error: Invalid numeric literal at line 3, column 0
```

最近は標準出力に対して様々なものが混ざってくるので、jq で処理できる行だけを処理し、処理できない行でエラーを起こしたくない。こういうときにどうすれば良いのかという話です。

# 解法

上記のようなケースにおいては、ぼくは以下のように `jq -R 'fromjson?'` 一度通すようにしています。

```bash

$ cat log.json | jq -cR 'fromjson?'
{"level":"info","msg":"hello world","time":"2019-09-01T07:01:28.99333+09:00"}
{"level":"info","msg":"hello world","time":"2019-09-01T06:58:28.99333+09:00"}
{"level":"info","msg":"hello world","time":"2019-09-01T07:03:28.99333+09:00"}
```

あとは後段に、jq を含む任意のコマンドをつなげれば良いですね。

# 解説

まず、`-R` (`--raw-input`) を使うことで、input を直接 JSON として parse しないようにし、文字列がそのまま jq のフィルタに渡るようにします。こうすることで、`jq` の入力処理でエラーになりません。
しかし、フィルタ部に渡るのは文字列ですから、これを JSON 化しなければなりません。これは `fromjson` で可能です。しかし、`fromjson` だけだと、JSON でない文字列に対してエラーが発生してしまいます。

```tcsh
$ cat log.json | jq -cR 'fromjson'
{"level":"info","msg":"hello world","time":"2019-09-01T07:01:28.99333+09:00"}
jq: error (at <stdin>:2): Invalid numeric literal at EOF at line 1, column 4 (while parsing 'hoge')
{"level":"info","msg":"hello world","time":"2019-09-01T06:58:28.99333+09:00"}
jq: error (at <stdin>:4): Invalid literal at EOF at line 1, column 4 (while parsing 'fuga')
{"level":"info","msg":"hello world","time":"2019-09-01T07:03:28.99333+09:00"}
```

ここで `fromjson` の最後に `?` を加えます。これは、jq におけるエラー抑制の省略形ですね。

```tcsh
$ cat log.json | jq -cR 'fromjson?'
{"level":"info","msg":"hello world","time":"2019-09-01T07:01:28.99333+09:00"}
{"level":"info","msg":"hello world","time":"2019-09-01T06:58:28.99333+09:00"}
{"level":"info","msg":"hello world","time":"2019-09-01T07:03:28.99333+09:00"}
```

省略しなければ以下のような形でしょうか。

```tcsh
$ cat log.json | jq -cR 'try fromjson?'
{"level":"info","msg":"hello world","time":"2019-09-01T07:01:28.99333+09:00"}
{"level":"info","msg":"hello world","time":"2019-09-01T06:58:28.99333+09:00"}
{"level":"info","msg":"hello world","time":"2019-09-01T07:03:28.99333+09:00"}
```
Go言語でテキストファイルを一行ずつ読み込む

久しぶりに [A Tour of Go](https://go-tour-jp.appspot.com/list) をやって Go を復習した。大量のテキストデータの処理に Go 言語が使えないかと思ったからだ。

テキストファイルを一行ずつ読み込むことは、テキスト処理の基本中の基本である。千里の道も一歩から、である。

この記事を書くにあたって、[この記事](https://qiita.com/kitoko552/items/d7178915a4792d1e3e85)を全面的に参考にさせていただいた。深謝。
[`bufio.Scanner`](https://golang.org/pkg/bufio/#Scanner) を使うのがコツらしい。

行指向でなくてよいなら、[この記事](https://qiita.com/Kashiwara/items/9a8365ea800e6f39713f)も参考になる。

```text:test.txt
これはテストです。
よろしくね。
hello world!
```


```golang:read_text_file.go

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	filename := "test.txt"

	fp, err := os.Open(filename)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer fp.Close()

	scanner := bufio.NewScanner(fp)

	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}

	if err = scanner.Err(); err != nil {
		fmt.Println(err)
		return
	}
}
```
【超級初心者のための】画面の操作方法【Unreal Engine 4】

### コンテンツブラウザタブ
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/8656d663-1fd0-2eaf-66e1-4449ff5fe98e.png)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/9b6a0234-4c10-5f15-afa1-d761929ca6b4.png)
**便利機能**
フィルタ横のボタンを押すと、フォルダ階層が表示される

# カメラ視点の移動方法
**視点回転：**マウス右クリックしながら移動
**視点の前後左右移動：**マウス右クリックしながらWASD
**視点の上下左右移動：**マウス中ボタンを押しながら移動
※中ボタンでの移動を上下左右逆に移動したい場合は[編集]→[エディタの環境設定]→左メニューから[ビューポート]→[Invert Middle Mouse Pan]にチェックを入れる

# オブジェクトの選択方法
**オブジェクトの選択：**マウス左クリック

# ショートカット
- **選択オブジェクトに対して**
    - **中心に表示（選択対象にズーム）：**Fキー
    - **移動：**Wキー
    - **回転：**Eキー
    - **拡大縮小**：Rキー
    - **複製：**Altキーを押しながらオブジェクトの矢印マークを選択しながらドラッグ
    - **削除：**Delキー
    - **ゲームの開始：**Alt+Pキー
    - **ゲームの終了：**Escキー

# ブループリント画面での操作方法
ブループリント画面でのイベント内容については[こちら](https://qiita.com/KINGREGION/items/6936ea513743f4085ec7 "ブループリント画面でのイベント内容")

### イベントグラフタブ
**選択：**マウス左クリック
**範囲選択：**マウス左クリックしながら移動
**画面の移動：**マウス右クリックしながら移動
**コンポーネント追加：**マウス右クリック（もしくはコンポーネントの矢印をマウス左クリックから引っ張る）
**全選択：**Ctrl+Aキー
**コンパイル：**F7キー
**保存：**Ctrl+Sキー

- **選択オブジェクトに対して**
    - **削除：**Delキー
    - **複製：**Ctrl+Wキー

### 変数タブ
**GetもしくはSetの作成：**イベントグラフ画面にD&D後に選択
**Getコンポーネントの作成：**Ctrlを押しながらイベントグラフ画面にD&D
**Setコンポーネントの作成：**Altを押しながらイベントグラフ画面にD&D
[Docker知識不要] Ruby on RailsのAPI開発環境をDocker上に作る方法

こんにちは、マイクロビジネス研究家の田中です！
2019年9月20日時点動作することを確認しています！

この記事を読むと下記の事ができるようになります。

- Docker上でRuby on RailsのAPI開発環境を作れる。

下記のことが事前に完了していることが前提です。

- Dockerがインストールされている

# インストールされる各アプリのバージョン

Ruby   2.6.1
Rails  5.2.3
nodejs v10.16.3

## フォルダ構成

- 任意フォルダ
    - src
        - Gemfile
        - Gemfile.lock
    - Dockerfile
    - docker-compose.yml

**Gemfile**

```
source 'https://rubygems.org'
gem 'rails', '~> 5.2.3'
```

**Gemfile.lock**

空ファイル

**Dockerfile**

```
FROM ruby:2.6.1
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN mkdir /myapp
WORKDIR /myapp
ADD src/Gemfile /myapp/Gemfile
ADD src/Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

**docker-complose.yml**

```
version: '2'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: /bin/sh -c "rm -f /myapp/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"      
    volumes:
      - ./src:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

## コマンド

```
docker-compose run web rails new .  --api --force --database=postgresql
```

```
docker-compose build
```

config/database.ymlの編集

```
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: db
  username: postgres
  password:
```

データベースの作成

```
docker-compose run web rake db:create
```

Dockerの起動

```
docker-compose up
```

http://localhost:3000/ にアクセスして下記のページが表示されれば成功

![RubyOnRails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282387/03fb3ab2-850f-987e-efc7-14c3204d8463.png)

## 注意点

Gemfileを更新した場合は、下記のコマンドを実行してイメージを作り直してください。

```
docker-compose build
```

理由としては、docker-compose run web bundle installしても、既存のコンテナーに対して実行されるため、docker-compose upすると新しいコンテナーを生成してしまうため、リセットされてしまいます。

みなさんのお役に立てたら、是非この記事にいいねをしてください。
今後の記事作成のモチベーションに繋がります！
ShellScript 変数内 の 文字列 を 置換

# 目的

- 変数に格納された文字列の中からマッチした文字列を任意文字列に置換する方法を知る。

# 書き方の例

- 変数には任意の文字列が格納されているものとする。
- 下記にShellScriptの処理を記載する。

``` shell
$ echo ${変数//置換したい文字/置換後の文字}
```

# より具体的な例

- 変数`string`には文字列「aaabbbcccddd」が格納される。
- 文字「a」を、文字「e」に置換する。
- 下記にShellScriptの処理を記載する。

``` shell
# 変数stringに文字列aaabbbcccdddを格納
$ string="aaabbbcccddd"

# 変数stringに格納された文字列のaをeに置換し、結果を変数stringに格納
$ string=`echo ${string//a/e}`

# 変数stringを出力
$ echo ${string}
>eeebbbcccddd
```
GitHubの２段階認証でパスワードでログインできなくなった時の対処法

GitHubの設定(Settings)

「Personal Settings」の一番下の「Developer settings」

<img width="231" alt="スクリーンショット 2019-09-22 18.43.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64331/77f601e4-1aee-3aa6-4c63-cd9db95f1c4a.png">

「Personal access tokens」をクリックし。

<img width="231" alt="スクリーンショット 2019-09-22 18.43.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64331/29c84efb-a6ea-bdbf-5efa-31625384958b.png">


Generate new tokenで必要な権限のtokenが作れる

<img width="912" alt="スクリーンショット 2019-09-22 19.03.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64331/fe3180fc-9f24-b3ec-2343-e864fbc80dc1.png">

これで作ったtokenでパスワード入力
Ubuntu 16.04 or 18.04 で gvfs で samba(cifs) をコマンドラインでユーザ権限でマウントする

## 背景

gnome, nautilus の GUI 環境の入った Ubuntu 16.04 or 18.04 があり, リモートで運用しているなどで ssh でログインしている.
samba(CIFS) 共有ディスク領域をコマンドラインでマウントしたい.
(GUI からであれば Nautilus -> `Other Locations` でマウントできる)

## 方法

`gvfs-mount`(16.04) or `gio`(18.04)を使います.

apt で `samba-vfs-modules` あたりを入れておきます. その他不足ぶんがあれば適宜 apt で入れておきます.

あとは smb(cifs)のアドレスを指定するだけです.

```
$ gvfs-mount smb://192.168.100.100/share
```

ユーザ名, WORKGROUP, password を聞いてきますので入力します.

うまくいけば

`/run/user/1000/gvfs/smb-share:server=192.168.100.100,share=share`

にマウントできています! 1000 は user id です.

ホームディレクトリなどに適当にここへの symlink を貼るといいでしょう

## Error mounting location: volume doesn't implement mount と出るとき

samba のモジュールが足りないのではなく,

https://ubuntuforums.org/showthread.php?t=1390955

セキュリティか TTY 関連のためか, d-bus(プロセス間通信?) の設定を行う必要があります.

```
$ export $(dbus-launch)
```

としてから gvfs-mount するか,  

```
$ dbus-launch bash
```

として新しく shell を立ち上げてから gvfs-mount します.
ModuleNotFoundError: No module named 'pip.req' が出た時の対処方法

## 背景
setup.py で下記の記述をしている場合、 pip10 以降ではエラーが発生する。
この時の対象方法を紹介。
※自前ライブラリのように setup.py を修正できる場合に限ります。

```python
from pip._internal.req import parse_requirements
```

## 対処方法

```python
try: # for pip >= 10
    from pip._internal.req import parse_requirements
except ImportError: # for pip <= 9.0.3
    from pip.req import parse_requirements
```

上記のコードに置き換える。

## 参考 URL

- [No module named pip.req](https://stackoverflow.com/questions/25192794/no-module-named-pip-req)
Herokuの有料プランを解約して退会する方法

色々あってHerokuの有料プランを解約して退会することに。


そこで備忘録として

- 有料プランの解約方法
- Herokuからの退会方法

の2つをまとめてみました。

 

Herokuは英語で書かれているため、もしかしたら「解約や退会の方法が分からない」という人もいるかもしれないので、良かったら参考にしてみてください。

   

##ステップ１：Herokuにデプロイしたアプリを削除する方法
まずはデプロイしているアプリを削除ましょう。

 

###1：ログインする
まずはログインします。


 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/04ca1ffb-495a-c87d-0f5f-6f72dd580eac.png)



 

###2：アプリを選択
ログインすると以下のような画面になるので、削除したいアプリを選んでください。
今回は赤丸で囲ったアプリ名を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/073d8f31-9498-bb73-7aa0-866b462d6f1c.png)

  

###３：Settingsを選択
アプリを選択すると以下のような画面が現れるので、「Settings」を選択します。

 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/3a44aae6-fbc7-d7eb-8ce6-a89adec7827b.png)



###４：Delete Appを選択
Settingsを選択すると、下の方に「Delete app…」というボタンがあるので、それを押します。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/05eb83e7-f257-ba34-0b1c-a3d5b3d6224a.png)



ちなみに Delete Appの下に書かれている「Deleting your app and its add-ons is irreversible.」とは、「アプリとそのアドオンを消すと元に戻りません」という意味です。

 

「Delete app…」を押すと以下のような画面が出てくるので、アプリ名を入力してDelete appをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/ab521a17-60c7-84b1-2add-d7a8468ac6a1.png)


以下のような画面が出てきたら、アプリの削除に成功です。

アプリを消した段階で、有料コースは解約となります。
 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/aa7c0510-fd40-849a-76ed-b26fd4db4c89.png)


 

##Herokuアカウントを削除する方法
アプリを削除し終わったら、Herokuアカウントを削除します。

アカウントを残しておく場合は、ここから先はやらなくてOK。

 

###1：Account settingsを選択
まずは右上の方にある赤丸部分をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/6b746683-7856-5950-ebd9-c802d70e9c75.png)


赤丸をクリックすると以下のような画面が出てくるので、Account settingsをクリックします。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/93b4b442-147b-a148-6f84-09faa6c691b7.png)
 

 
###2:Close this accountをクリック

Account settingsをクリックしたら下の方に、「Close this account」というボタンがあるのでそれをクリック。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/384897cf-af51-4c4b-40e3-28a0b724d269.png)


そうすると以下のような画面になるので、ログインパスワードを入力してClose this accountを押すとHerokuのアカウントを削除できます。

 

入力フォームの上に書いてある英語は、「アカウントを削除すると元に戻りません。永久にこのアカウントを閉じたいならHerokuのパスワードを入力してください」という意味です。

 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/7f90f435-ca39-49d6-2dfd-c742c88f9255.png)


 

ちなみに、まだ払い終わっていない料金があると、Close Accountを押しても以下のような画面が現れてしまいます。

 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/4a30f5be-7e8f-0d24-a996-16d88e943e4e.png)


 

なので、クレジットカードから最後の料金が引き落とされたのを確認した上でHerokuアカウントを削除してください。


##まとめ
日本語版のHerokuみたいなサービスはないのか
[Linux] Linuxを電源ONしてから起動するまでの処理を調べてみた

社内LTで使ったスライド

https://docs.google.com/presentation/d/e/2PACX-1vRjxyhDlDOTpkQwEbgRVVfIc2OCDY0DqA2hH4_uZ7Eu3gpvB5svPf5TH-BHA_EmWmFa7wvQXjougMBK/pub?start=false&loop=false&delayms=3000
ActiveView の link_to_if をとにかく使う方法

link_to までは分かってる人向け。

# `link_to_if` とは

ActiveView において、条件によってリンクにするかしないか分ける方法。

たとえば、 `link_to_if` を使わない場合

```erb
<% if user.active? %>
  <%= link_to user.name, user_path(user) %>
<% else %>
  <%= user.name %>
<% end %>
```

となるようなところを、

```erb
<%= link_to_if user.active?, user.name, user_path(user) %>
```

のように一発で書ける。

使う制約としては、条件が `true` だろうが `false` だろうが同じ文字列を表示したい（上記の例の場合には `user.name` ）ということがありそう

ここで実装されている https://github.com/rails/rails/blob/v6.0.0/actionview/lib/action_view/helpers/url_helper.rb#L432-L442

# `link_to_if ... xxxx_path` を使えないケース
たとえば `user` があるとき( `nil` じゃないとき)だけリンクを置きたいというときに、

```erb
<%= link_to_if user, user&.name, user_path(user) %>
```
と書くことはできない。なぜかというと `link_to_if`　の引数である `user_path` が (`link_to_if` の条件よりも)先に評価されるので、 

```
No route matches {:action=>"show", :controller=>"users", :id=>nil} missing required keys: [:id]
```
などの例外が出る

これをどうしても `link_to_if` で実現させるには

```erb
<%= link_to_if user, user&.name, controller: :users, action: :show, id: user&.id %>
```

とすればよい。（普通に考えれば `xxxx_path` のほうが綺麗だし、無理に使う必要はないと思います）

`link_to_if` の第三引数は、最終的に `ActionDispatch::Routing::UrlFor` の `full_url_for` で URL 化されます。 `Hash` のときは `url_for` 、既に `String` のときはそのまま返るといった `case` 文があります。

```ruby
      def full_url_for(options = nil) # :nodoc:
        case options
        when nil
          _routes.url_for(url_options.symbolize_keys)
        when Hash, ActionController::Parameters
          route_name = options.delete :use_route
          merged_url_options = options.to_h.symbolize_keys.reverse_merge!(url_options)
          _routes.url_for(merged_url_options, route_name)
        when String
          options
```
https://github.com/rails/rails/blob/v6.0.0/actionpack/lib/action_dispatch/routing/url_for.rb#L173-L182
【Swift】NVActivityIndicatorViewを使ってUIブロッカーを作る


ローディングアニメーションで有名なOSSライブラリの[NVActivityIndicatorView](
https://github.com/ninjaprox/NVActivityIndicatorView)をUIブロッカーとして用いる方法です。
簡単に実装することができ、通信処理の間などユーザー操作を受け付けたくない時に便利に使うことができます。
公式のREADMEにも載っていますが備忘録的に。

## ライブラリ導入
CocoaPodsを使用
Podfileに`pod 'NVActivityIndicatorView'`を追加して`pod install`

## UIブロッカーの使い方
1. ActivityDataのインスタンスを作っておく  
`let activitData = ActivityData()`
2. NVActivityIndicatorPresenterを用いてアニメーション開始  
`NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData)
`
3. 終わりたい場所でアニメーション終了  
`NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData)`

また、`setMessage()`を使うことで表示文を変更することができます。

## 実装
例として、firestoreからデータを取得し、画面表示を更新する動作を考えます。
更新が終了するまではUIブロッカーを表示して画面操作を行えないようにしておきます。
※コピペでは動きません。

```Swift:ViewController.Swift
import UIKit
import Firebase
import NVActivityIndicatorView

final class ViewController: UIViewController {
    
    let activityData = ActivityData(size: nil,
                                    message: nil,
                                    messageFont: nil,
                                    messageSpacing: nil,
                                    type: .ballSpinFadeLoader,
                                    color: .white,
                                    padding: 0, 
                                    displayTimeThreshold: nil,
                                    minimumDisplayTime: nil,
                                    backgroundColor: UIColor(red: 204/255, green: 204/255, blue: 204/255, alpha: 0.8),
                                    textColor: .white)

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchData()
    }
    
    func fetchData() {
        let db = Firestore.firestore()
        let docRef = db.collection("hoge").document("huga")

        NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData)
        NVActivityIndicatorPresenter.sharedInstance.setMessage("データ取得中")

        docRef.getDocument { (document, error) in
            if let document = document, document.exists {
                NVActivityIndicatorPresenter.sharedInstance.setMessage("データ取得完了")
            } else {
                NVActivityIndicatorPresenter.sharedInstance.setMessage("データ取得失敗")
                NVActivityIndicatorPresenter.sharedInstance.stopAnimating()
                return
            }
        } 
    }    
}
```

適当に実行するとこんな感じの画面になります。
オレンジのラベルは比較として元の画面に置いているもので、見た目的にも操作できなくなっているのが分かると思います。
<img width="375" alt="実行結果" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224808/4818bf2d-36ae-c423-fc6b-a2ff31f1eb48.png">


## まとめ
インジゲーターのアニメーションも種類豊富かつどれもリッチな見た目で使いやすい。
ActivityDataでは文字色は背景色以外にもフォントや最小表示時間なども指定できるので、色々な使い方ができそうです。

以上、簡単なUIブロッカーの作り方でした。
何かのタイミングで参考になる方がいれば幸いです。
Unsubscribeしないこだれだ

## 概要
Angular, RxJSを使う人であれば**「必ずunsubscribeする」**は何度も聞いたことがあると思います。[以前書いた記事](https://qiita.com/rena_m/items/25b0db2bfe77344612b5)でも触れたように、この理由は「コンポーネントが破棄されてもSubscriptionだけが残り続けてしまうため」です。私も頭ではわかっていつつも実際にこれでハマった例をみたことがなかったのですが、ちょうど少し前にそういうケースに出くわしたのでデモを作ってみました。まだ使い始めでピンと来ない人などの理解の手助けになれば嬉しいです。

## デモ
肝心の[デモはこちらです。](https://unsubscribe-ghost.netlify.com/)
簡単にシステムを説明します。左のボタンでどのおばけを出すか切り替えることができます。activeになったおばけは「おばけを出す」ボタンのクリックイベントをsubscribeするようになります。一度activeを切り替えるたびに、subscribeしていたコンポーネントのインスタンスは破棄されます。
このおばけのなかに、unsubscribeを忘れているおばけがいるのでデモを操作してどれか当ててみてください:ghost: 簡単なので書くまでもないかもしれませんが、次の解説欄に答えを載せます。

## デモの解説
前述の通り、activeを切り替えるたびに、subscribeしていたコンポーネントのインスタンスは破棄されます。ですが、`ngOnDestroy`で正しくunsubscribeされていない場合はコンポーネントが破棄されてもsubscribeしているsubscriptionは破棄されません。そのため、別のおばけにactiveを切り替えても、「おばけを送る」ボタンを押した時に前のおばけも一緒に出てくるようになるのです。参考までに、[今回のコードはこちらです。](https://github.com/renamoo/unsubscribe-ghost)
それでは、デモの動きをまとめて答えを見てみましょう。
 - 1つめの:ghost:を選ぶ
 - 2つめの:ghost:を選ぶ
 - 「おばけを送る」
 - 1つめと２つめの:ghost:が出る
：よって１つめのおばけはunsubscribeしわすれています。
 - 3つめの:ghost:を選ぶ
 - 「おばけを送る」
 - 1つめと2つめと3つめの:ghost:が出る
：よって２つめのおばけはunsubscribeしわすれています。
 - 再度１つ目のおばけを選ぶ
 - 1つめのおばけx2、2つめのおばけが出ます
：よって３つめのおばけはunsubscribeされています。

## 何が怖いのか
適当にactiveを切り替えてボタンを押すとわかると思いますが、後始末されてない場合、**一度のイベント発火でのsubscribe処理がactiveを切り替えるたびにわさわさと増えていきます。** これがもし、おばけを出すのではなくバックエンドからデータを取得する処理だったらどうでしょうか。**操作をするたびにどんどんリクエストが増え、画面が重くなっていきます。恐ろしいですね…:ghost:**

## おまけ：こういう時は後始末忘れかも
上記で述べたとおり、1つのイベントに対して１回しか走るはずのない処理（上記例で言えば、バックエンドへのリクエスト）がたくさん同時に起きている場合、後始末忘れが予測されます。
そのほかに、**「subscribe処理が思うような挙動をしない」**場合もこのケースがありえます。すでに述べたように、subscriptionは残っていてもコンポーネント自体は破棄されているので、例えばsubscribeの中でコンポーネントの変数を更新していても更新されないのです。`console.log`で確認して絶対にここにイベントは届いているのに、ビューに反映されない！ということがあれば、これも後始末忘れの可能性があります。

## まとめ
特にエラーの出るような種類のものではないため、みんなで気をつけていくのが大事ですね:dog2:
選択解除可能なラジオボタン

1個しか選択させたくないけど、0個の選択肢も許容させたい
ってことで選択解除可能なラジオボタンをjQueryで実装しました。

### コード

```html:HTML
<div class="btn-group btn-group-toggle" data-toggle="buttons">
  <label class="btn btn-primary active">
    <input type="radio" name="options" id="radio1" checked>1
  </label>
  <label class="btn btn-primary">
    <input type="radio" name="options" id="radio2" checked>2
  </label>
  <label class="btn btn-primary">
    <input type="radio" name="options" id="radio3" checked>3
  </label>
</div>
```

```javascript:jQuery
$(".btn").click(function() {
  if ($(this).hasClass('active')) {
    event.stopImmediatePropagation();
    event.preventDefault();
    $(this).removeClass('active');
    $('input:radio', this).prop('checked', false);
  }
});
```


### 説明
`event.preventDefault()`でラジオボタンのデフォルトの動きを妨げます。
だけど、Bootstrapを入れているとbutton.jsが起動してしまうのでそっちも止めるために`event.stopImmediatePropagation()`で伝播させないようにします。



### 参考
https://qiita.com/tochiji/items/4e9e64cabc0a1cd7a1ae
Blender2.8 + Armory3Dのチュートリアルだけではわからなかったこと

# まずはじめにBlenderとArmory3Dとは

Blenderは言わずと知れた3DCGソフトウェア。無料で使える。2.8でかなりの変更点があった。Armory3DはBlender2.8系列でaddonとして動作するゲームエンジンである。

# インストール

非公式なQiita記事は無視して常に公式情報を見てください。

https://www.blender.org/
https://armory3d.org/

なお、以下の記述におけるarmoryのバージョンは2019-09である。

# チュートリアルについて

はい、ここがArmory3Dの最大の問題点である。はっきり言ってあれ読んだだけで何か作れるとは思えない。
実際に実験しつつ探索した結果を以下に残すものである。

公式のチュートリアルにTank Tutorialというものがある。

https://armory3d.org/manual/#/getting_started/tanks

このチュートリアルではキーボードやゲームパッド入力を受け取り、戦車の移動や弾丸の発射を制御する方法についてnode treeで記述することになる。

## nodeに記述した内容が反映されない？

TankTreeについて解説しているあたりの記述であるが、ここではキーボードやゲームパッド入力を用いたeventの発行を別のtreeで行い、こちらでeventを受け取って戦車の挙動を記述することになる。

ここでチュートリアルのとおりにやったところ、TankTreeの中に記述した最初の一個目の挙動しか正常に動作しないことが判明した。複数の挙動、すなわち左旋回と右旋回と前進と後退を一個のTreeに書くとその全てが生成されたスクリプトの中に含まれず、左旋回しかないことまで確認した。

これを回避するため、わざわざtreeを分けて一個ずつ挙動を記述するようにしたところ所望の動作になった。

ちなみに、RunのとなりにCleanというボタンがあり、これを押すと生成されたスクリプトを全消しできる。

で、ここで色々試してみた結果、ひょっとしたらこのnode treeはnodeがつながっている一個のtreeだけが有効になっていて、つながっていない独立したtreeが複数は有効にならないのではないか？という仮説を立ててみたが、入力を受け取る方ではチュートリアルの画像を見ても複数の独立したtreeで受け取っているようだし実際手元で試しても動いている。結局問題の原因は特定できていない。

## そもそもnodeでやってるときはデバッグどうすればいいの？

全然わからん。

これは本気でどうなってるのか知りたい。前述の問題のデバッグにしても実験的に得るよりはきちんとeventが飛んでて受け取り側が受け取ったかどうか、そこさえ調べられるなら直ちに解決する問題である。

## Haxeのチュートリアルはどこ？

そんなことよりコードを書かせろとみんな思うはずだ。具体的にはHaxeでコードが書けるのだからそのチュートリアルを書いてくれと。

だがここにちょっと書いてあるだけである。いやわかんないよこれだけじゃ。

https://armory3d.org/manual/#/getting_started/playground

一応以下のプロジェクトがサンプルではある。ただし解説は一切ない。

https://github.com/armory3d/armory_tutorials/tree/master/tanks_script

わかったことの要約だけ記す(全部書こうとすると別記事になってしまいそうなので)と、

- `notifyOnUpdate`という関数でupdateごとに走る内容を決めることができる。
- objectという変数で自分が割り当てられているオブジェクトにアクセスできる。
- キーボードの状態を取得するには`iron.system.Input.getKeyboard();`
- 同様にゲームパッドの状態を取得するには`iron.system.Input.getGamepad(0);`
- `object.getTrait(TankTrait);`という関数で、自分に割り当てられているTankTraitにアクセスできる。

## Haxeでコードを書こうと思ったらエディタが開かない

さっきのgetting startedのところでKodeがひらきますよ、と書いてあるが、実際には開かない。
preferenceの下、addonのRender:ArmoryのShow Advancedを開いてみると、Code EditorがVS CodeとなっていてVS Code Pathが空になっている。
つまり、自分で別途入れておけということではないだろうか？
なお、Win10だとここにvscodeのパスを通しても結局ウィザードが開く。
[WIP] TLから575を抽出してみた

https://qiita.com/_ha1f/items/56e02c3a5e840c464d87 を元に、シェルスクリプトでできそうだったのでやってみました。

とりあえずjumanとやらのオテマエをワンライナーで確認してみる。

```shell-session
$ echo 'もう不要車載CDプレーヤー' | zeneisu | juman | grep -v '^@' | grep -v EOS | while read -r l; do printf '%s ' "$(echo "${l}" | cut -d ' ' -f 1)"; c=$(echo "${l}" | cut -d ' ' -f 2 | tr -d 'ぁゃぃ'  | wc -m); c=$((c-1)); echo "${c}"; done
もう 2
不要 3
車載 3
ＣＤ 4
プレーヤー 5
```

- 長音符 → 1音
- 拗音符 → 0音
- 撥音符 → 1音

のように処理すると575の音の数になることがわかってきた。
セレスさんのインターンに参加してきました

#株式会社セレスさんの3daysインターンに参加してきました
## 3日間の流れ
- 1日目
    - アイデアソン
    - いつ、どこで、誰が、何をした？ゲーム
    - ↑をもとにブレインストーミング
    - 役割分担
- 2日目
    - ずっと開発！
- 3日目
    - 開発
    - プレゼン
    - 懇親会 

## 自分たちの結果
### 1日目
いつ、どこで、誰が、何をしたゲームの結果…
___今夜、自室で、Zozoの○澤さんと、催眠術を覚える___になりました…笑
さぁここからどう広げましょう…
ブレインストーミングで催眠術→一発芸→合コンみたいな流れになり、「催眠状態で合コンに行けるサービス」を作ることに…（○澤さんのところまでどこいったし…笑）
そして役割分担は皆さんの経験を聞いた感じで私はバックエンドとDBを担当することになりました（発表の時見たら私がPMになってました笑）
### 2日目 
開発を始め…ようと思ったのですが、なんせ初めてなので作業量の見積もりがつかない…
そして、机上の進捗だけが進み、昼くらいまではgitとそれで実質進捗0でした。
（当時私達は進捗をだしてるつもりになってました）
そんな私達に、昼ご飯の後メンターさんから神のお告げ（？）が…
___「机上の計画ばっかりが進んでるように見えるよ」___と<br>
この一言で私達は本当にコードを書き始めたのでした
今書いてて「コードほとんど書かないで進捗とかww」とか思いますがその時は気づきませんでした…
そしてコンフリクトを大量におこしているコードの存在に気づかぬままその日の作業を終えたのでした…
技術的にはSlim Frameworkでバックエンド（この日はルーティングのみ）を書き、DBのテーブルを作成しつつ、みんなの進捗を管理して（？）おりました
### 3日目
さて、朝会社に着きましてgithubを開くと、何ということでしょう、dev（HEAD）が個人ブランチ（HEAD）に置き換わっているではありませんか！朝から修正作業です…
そんなかんなでバックエンドを1時間半後くらいから書き始めました。
某社のインターン課題でバックエンドを書いていたのもあり、「ロジックはわかるけどSlimの書き方がわからん」みたいな感じだったので、割とサクサク進められました。
DBからデータを読み出す処理をすべて書いたところでタイムアップ
実はチャットはできてないと発表しましたが、後フロントを書けば一応チャットという名の掲示板は完成するはずでした…

成果物:[エンタメ合コン](https://goukon.f5.si)

## 感想
個人的にチーム開発が初めてだったので、開発の進め方やgitをコンフリクトさせまくる経験ができてよかったです。
フルスタックっぽいような感じで勉強してきてたので、どの領域でもコードを書いたりできたのがよかったです。
セレスの皆さんありがとうございました！
動的計画法 (Dynamic Programming：DP) 学習メモ　～by Python～　Part 2　---EDPC_Aに挑戦

# はじめに
動的計画法について学んだことを初心者視点でなるべく簡潔にまとめる
”[Educational DP contest/DPまとめコンテスト（EDPC）](https://atcoder.jp/contests/dp/)”の問題を解くことを目標に進めていく
前回は簡単な問題で動的計画法を学んだ（[動的計画法 (Dynamic Programming：DP) 学習メモ　～by Python～　Part 1](https://qiita.com/Nary_/items/60be9361d787275d1dee)）
今回はEDPCのA問題を解いていく

※※※　参考にさせていただいた記事
[動的計画法超入門！ Educational DP Contest の A ～ E 問題の解説と類題集
](https://qiita.com/drken/items/dc53c683d6de8aeacf5a)[典型的な DP (動的計画法) のパターンを整理 Part 1 ～ ナップサック DP 編 ～](https://qiita.com/drken/items/a5e6fe22863b7992efdb)

# EDPC_A問題
[EDPC_A-Frog1](https://atcoder.jp/contests/dp/tasks/dp_a)
<img width="473" alt="EDPC_A.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500055/7559e434-a356-d427-1e9a-676b7d0dc592.png">
***

①各足場に向かうために最適な行動をした場合に消費するコストを保存するリストを作成

```
dp = [0]*5
```
***
②1段目にいる場合は何も行動していないので当然コストは0

```
dp[0] = 0
```
***
③2段目 (高さ=h[1]) に移動する場合は1段目 (高さ=h[0]) からくるしかない。コストはh[1]-h[0]の絶対値

```
dp[1] = abs(h[1]-h[0])
```

***
④3段目 (高さ=h[2]) に移動する場合は
　1⃣　1段目(コスト=dp[0])　→　3段目
　　もしくは
　2⃣　2段目(コスト=dp[1])　→　3段目
の2通り。この二つの行動のコストを比較する。

1⃣の場合は1段目にいる場合の最小コスト dp[0] に h[2]-h[0] の絶対値を加えた数である
つまり、dp[0] + abs(h[2] - h[0])
2⃣の場合は2段目にいる場合の最小コスト dp[1]（②で計算した） に h[2]-h[1] の絶対値を加えた数である
つまり、dp[1] + abs(h[2] - h[1])

```
dp[2] = min(dp[0] + abs(h[2] - h[0]),dp[1] + abs(h[2] - h[1]))
```

⑤4段目 (高さ=h[3]) に移動する場合は
　1⃣　2段目(コスト=dp[1])　→　4段目
　2⃣　3段目(コスト=dp[2])　→　4段目
の2通り。

1⃣の場合は、dp[1] + abs(h[3] - h[1])
2⃣の場合は、dp[2] + abs(h[3] - h[2])

```
dp[3] = min(dp[1] + abs(h[3] - h[1]),dp[2] + abs(h[3] - h[2]))
```
***
⑥5段目 (高さ=h[4]) に移動する場合は
　1⃣　3段目(コスト=dp[2])　→　5段目
　2⃣　4段目(コスト=dp[3])　→　5段目
の2通り。

1⃣の場合は、dp[2] + abs(h[4] - h[2])
2⃣の場合は、dp[3] + abs(h[4] - h[3])

```
dp[4] = min(dp[2] + abs(h[4] - h[2]),dp[3] + abs(h[4] - h[3]))
```
***

以上を続けていく
列記してみる

```
dp = [0]*5
dp[0] = 0
dp[1] = abs(h[1]-h[0])
dp[2] = min(dp[0] + abs(h[2] - h[0]),dp[1] + abs(h[2] - h[1]))
dp[3] = min(dp[1] + abs(h[3] - h[1]),dp[2] + abs(h[3] - h[2]))
dp[4] = min(dp[2] + abs(h[4] - h[2]),dp[3] + abs(h[4] - h[3]))
```
for文に変えていく

```
dp = [0]*n
dp[0] = 0
dp[1] = abs(h[1]-h[0])
for i in range(1,n-1):
    dp[i+1] = min(dp[i-1] + abs(h[i+1] - h[i-1]),dp[i] + abs(h[i+1] - h[i]))
```
for文のrangeは　dp[n-1]　まで求めたいため、range(1,n-1)　→　例：n=5の場合は[1,2,3]
***
あとはリストの最後を出力すれば完成
EDPC_A解決
***

#おわりに
B問題も同様の考え方で解けるが、解説能力の不足により簡単に以下にまとめる

移動元 i 　　範囲……(j-K)~(j-1)
移動先 j　　 範囲……1~n

移動先 j に対して、移動元は K 個分あるのだが、Kがjを超えてしまうと存在しない移動元 i が発生してしまう
そのため、存在しえない移動元 i を除く必要があるため、範囲の制限を加える必要がある
iの範囲は(max(0,j-K),j)

```
dp = [0] + [float('inf')]*(n-1)
for j in range(1,n):
    for i in range(max(0,j-K),j):
        dp[j] = min(dp[j],dp[i] + abs(h[j]-h[i]))
```
CentOS7.7へのyumアップデート失敗

# はじめに
CentOS7.7へのアップデート時、```Transaction check error```となりPython関係でコケました。
原因と解決法の覚書です。

#原因と対処
###原因
```
パッケージ python36 は python3 によって不要になりました。
代わりに python3-3.6.8-10.el7.x86_64 のインストールを試みています。
```
###対処
```
$ sudo yum remove python36
$ sudo yum update
```
単純に手動でpython36を削除して```yum update```を行えばOKでした。
無事、アップデート完了です。

```
$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

$ python3 --version
Python 3.6.8
```
Gitでもろもろやり直したいと思った時の対処法

## はじめに

Gitは、リポジトリでファイルを管理するため、そのリポジトリにファイルをもってくるための「登録(add)」と「コミット(commit)」、最後にリモート上にあるリポジトリに「アップロード(push)」する等の操作があるのですが、間違えて処理してしまったり、自分が思ってた結果にならなかったりして、処理をやり直すことがよくあります。そんな時にいつもどうやって処理したらいいか忘れがちなので、各状況に応じた対処法を備忘録として残しておきます。

## ファイルの編集をやり直したい　〜git add .実行前〜

```
$ git checkout .　  #ファイル編集の取り消し　【注】新規追加ファイルは削除されない
$ git clean -df .   #新規追加ファイルの取り消し
```

## git add .をやり直したい　〜git commit 実行前〜

```
$ git reset HEAD .  
```
addの取り消しのみとなるため、ファイル編集も行う場合は上記の「ファイルの編集をやり直したい」を実行する。

## commit をやり直したい 

```
$ git reset --hard(soft) HEAD^  #最新のコミットの取り消し
```
| コマンド　　　       | 意味　　　　　　　                 　　　　　              　    |
|:-----------------|:------------------------------------------------------------|
| --hard           | コミットを取り消し、ワークディレクトリの内容も書き換える  　             　   | 
| --soft           | ワークディレクトリの内容はそのまま、コミットだけを取り消す                   |
| HEAD^            | 直前のコミット                                                  |
| HEAD~{n}         | n個前のコミット　HEAD^^^とHEAD~3とHEAD~~~とHEAD~{3}と@^^^は同じ意味  |


```
git commit --amand
```
直前のコミットメッセージを変更する。

## push をやり直したい

```
$ git revert [commit ID]
$ git push
```
・[commit ID]は`git log`で確認
　『commit b170aafd30b30230a4df3597e11a0195094d84b6』こんな感じのコミット以下の値を貼り付ける。
・指定したコミット時点の状態にまで戻し、コミットを行うが、`reset`と違って履歴は消えない。
Dockerが生成したBridgeインターフェースbr-xxxを削除

# TL;DR

LinuxでDockerを使っているとbr-xxxのインターフェースが大量に生まれる。

これらが邪魔なので削除する。

# ブリッジ一覧の取得

```shell
$ brctl show | grep br-

br-0e4b4d2adaa0		8000.024252c5aa0b	no		
br-101051c36d70		8000.0242172f7838	no		
br-473a9f7308cd		8000.02428b7b217c	no		
br-5bab46a8c16a		8000.0242cc13e4a4	no		
br-6018e1f7448f		8000.02423aa497f4	no		
br-b01cd99cb441		8000.0242800a155f	no		
br-b7aa45dc4cdb		8000.02428405b708	no		
br-be3258c63aee		8000.02429a8048ce	no		
br-c404e8f8714d		8000.0242c94f6033	no		
br-c51318800cc0		8000.02423ab8d0cf	no		
br-e76bba7d2af3		8000.02425f60e107	no		
br-ee033a5f8b20		8000.024212da4389	no		
br-fe46dd570f1b		8000.02428ba86c49	no		
```

# ブリッジを個別に削除

```shell
sudo ip link set dev br-0e4b4d2adaa0 down
sudo brctl delbr br-0e4b4d2adaa0
```

# ブリッジを全て削除

```shell
for b in `brctl show | grep br- | awk '{print $1}'`  
do
  sudo ip link set dev $b down
  sleep 1
  sudo brctl delbr $b
  echo "+++ Deleted $b +++"
done
```

実行結果:

```
+++ Deleted br-101051c36d70 +++
+++ Deleted br-473a9f7308cd +++
+++ Deleted br-5bab46a8c16a +++
+++ Deleted br-6018e1f7448f +++
+++ Deleted br-b01cd99cb441 +++
+++ Deleted br-b7aa45dc4cdb +++
+++ Deleted br-be3258c63aee +++
+++ Deleted br-c404e8f8714d +++
+++ Deleted br-c51318800cc0 +++
+++ Deleted br-e76bba7d2af3 +++
+++ Deleted br-ee033a5f8b20 +++
+++ Deleted br-fe46dd570f1b +++
```

毎回やるのが面倒なら .zshrc や .bashrc に書いておくのが良さそう。
[備忘録]rbenvを使ったRubyのインストールについて

#環境
macOS Mojave 10.14.6
Homebrew 2.1.11
rbenv 1.1.2

#rbenvのインストール
以下のコマンドでrbenvをインストールする。

```
$ brew install rbenv
```

rbenvと一緒にautoconf、openssl@1.1、pkg-config、ruby-buildがインストールされる。
以前は、rbenvでインストールを行った後にrehashコマンドを実行する必要があり、それを省略するためにはrbenv-gem-rehashをインストールする必要があったようだが、rbenvに標準搭載され非推奨となっている。

以下のコマンドでrbenvのパスを通す。

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
```

#Rubyのインストール

以下のコマンドでインストール可能なrubyのバージョンを確認する。

```
$ rbenv install -l
Available versions:
  1.8.5-p52
  1.8.5-p113
  (中略)
  2.6.4
  2.7.0-dev
  2.7.0-preview1
  (省略)
```

以下のコマンドでRubyをインストールする。

```
$ rbenv install 2.6.4
```

以下コマンドで使用するRubyのバージョンを切り替える。

```
$ rbenv global 2.6.4
```

以下のコマンドで使用するrubyのバージョンを確認する。

```
$ rbenv versions
  system
* 2.6.4 (set by /Users/[user_name]/.rbenv/version)
```

使用するバージョンには*が付いている。


rbenvでインストールされたrubyのgemsディレクトリを異なるバージョン間で共有する為に、rbenv-communal-gemsをインストールし、実行する。

```
$ brew install rbenv-communal-gems
$ rbenv communize --all
```

rbenv-communal-gems を使うと環境変数 GEM_HOME が無視されるようになるため注意。

参考
[Homebrewのインストールとrbenvのインストールまで Mac編 - Qiita](https://qiita.com/is-lab/items/e0443b79da117ed48294)
[rbenv でインストールした複数の Ruby の gems ディレクトリを共有化する - Qiita](https://qiita.com/uasi/items/4ab424fd0d9319c26297)
[rbenv-communal-gems を使うと GEM_HOME が無視される - Qiita](https://qiita.com/uasi/items/86d9751e541d469140da)
デスクトップ版Outlookで共有メールボックスを見る方法

デスクトップ版Outlookでは、セキュリティグループ単位で共有メールボックスの権限が与えられている場合、共有メールボックスをクライアント内で見えるように設定しなければ見えません。
反対に、個人単位で指定されていると勝手に反映されるので、全て個人にすれば良いじゃないかという話ですが、部署異動等あった際に管理が面倒ですよね。

▼この前少し困ったので、個人的なメモで、Outlookで共有メールボックスを見る方法▼

１．ファイルタブ＞情報＞アカウント設定 へ移動する
２．データファイルタブより自分のメールアドレスを選択する
３．画像の真ん中あたりの画面・詳細設定の画面から追加ボタンをクリック
４．共有メールボックスのメールアドレスを入力
５．OKを押してOutlookの受信トレイなどの画面に戻る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175699/f228f861-a988-756d-dd49-bc2a4f4b29c4.png)
Hugo(テーマ：Ananke)+Github+Netlifyでサイトを公開したらMETA NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"になった話

Hugo+Github+Netlify初心者です。

ちょっとHugo、Github、Netlifyあたりを勉強したいと思いサイトを作成して公開してみると、サイトのMETA NAME="ROBOTS"が"**NOINDEX,NOFOLLOW**"になってしまった話です。

##結論

Netlifyの[Settings]➔[Build & deploy]➔[Build settings]のBuild commandを

```変更前のBuildcommand.
hugo
```
から

```変更後のBuildcommand.
HUGO_ENV="production" hugo
```
に変更すると

META NAME="ROBOTS"を"**INDEX, FOLLOW**"にすることができました。
（この方法で良いのか？です、詳しい人ご教授くださいm(_ _)m）

追記
コメントにてpeaceirisさんに教えて頂きました。
> Hugo ではなく ananke theme 固有の振る舞いですね。

ありがとうございます。
また解決策も教えて頂きました。詳しくは下のコメント欄で確認ください。


###Hugoの環境

バージョン　Hugo 0.58.1
(そういえば、公開するとバージョンがHugo 0.54になるこれはどうして？)

```config.toml
baseURL = "https://kengrasshopper.com/"
languageCode = "ja-JP"
title = "KenGrasshopper Site"
theme = "ananke"

MetaDataFormat = "yaml"
# DefaultContentLanguage = "en"
SectionPagesMenu = "main"
Paginate = 3 # this is set low for demonstrating with dummy content. Set to a higher number
googleAnalytics = ""
enableRobotsTXT = true

[sitemap]
  changefreq = "monthly"
  priority = 0.5
  filename = "sitemap.xml"

[params]
  favicon = ""
  description = ""
  facebook = ""
  twitter = "https://twitter.com/kengrasshopper"
  instagram = ""
  youtube = ""
  github = ""
  gitlab = ""
  linkedin = ""
  mastodon = ""
  # choose a background color from any on this page: http://tachyons.io/docs/themes/skins/ and preface it with "bg-"
  background_color_class = "bg-black"
  # featured_image = "/images/gohugo-default-sample-hero-image.jpg"
  featured_image = "/images/hugo-bk-cat.jpg"
  recent_posts_number = 2

```

```my-first-post.md
---
title: "My First Post"
date: 2019-09-08T20:32:43+09:00
---
# このサイトについて
このサイトはKengrasshopper（[＠kengrasshoppe](https://twitter.com/kengrasshopper))が運営するサイトです。

主にプログラミング、電子工作などの情報をマイペースにゆる〜く発信します。
```

Hugoのテストは公式サイトのQuick Startを参考した。日本語で記事を書いているくださっているサイトもいろいろ参考にしました。みなさまありがとうございます。

###Githubの環境

・Privateを利用している。

・利用PCはマックでコマンドラインからgit push -u origin masterをするとNetlifyに自動で公開されるようにしている。

###Netlifyの環境

・Starterプランを利用。無料で使えるなんてありがたい。

・独自ドメインを設定しています。


```Deploycontexts.
[Production branch] master
[Deploy previews] Automatically build deploy previews for all pullrequests
[Branch deploys] Deploy only the production branch 
```
ちなみにサイトは
https://www.kengrasshopper.com/

##今回の流れをダラダラ書きます。

スタートは***サイトにGoogleAnalyticsを設定して、公開されたサイトのソースを確認すると反映されていなかったため。***でした。

####以下問題解決の流れ
1. はじめはHugoでのGoogleAnalyticsの設定方法が間違っているかと思っていたけど、いろいろ確認していくと、GitHubではGoogleAnalyticsが展開されていることを見つける。

2. Netlifyで公開されているサイトを見るとMETA NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"になっていることに気づく。

3. Hugoではテスト中はどうも"NOINDEXらしい、Netlifyで展開時に上手くいっていない感じ、テストとして認識されている？。

4. そういえば、GoogleAnalytics設定するときに調べていたら、HUGO_ENV="production" hugoってしないとGoogleAnalytics設定の反映しないぞって記事を読んでいたことに気づく、GitHubにpushする前になんかようわからんけどしていた。

5. Netlifyでもすればいいんじゃないって感じです。（なんともアバウトだ。。。）実際今回の方法でよかったのか。。。

##まとめ

Hugo+Github+Netlify初心者なので切り分けるのに半日かかりました(T_T)

Hugo+Github+Netlifyツールの根本的なことを理解しているともっと発見が早かったと思います。

ここはこうした方が良いってことなどありましたら、ご教授ください。
「rails s」で「sqlite3/sqlite3_native」が出た時の対処法


##開発環境

```
windows10
ruby 2.5
rails 6.0
```

##エラー内容
rails new の後、サーバを立ち上げたらエラー発生。


```
$ rails new hello_app
$ bundle install
$ rails s

>>`require': cannot load such file -- sqlite3/sqlite3_native (LoadError)
```

##解決策
・sqlite3.dllをPathがとおったディレクトリに配置
・sqlite3_native.soファイルを生成
・sqlite3_native.soファイルを配置

##対処法
[こちらから](https://www.sqlite.org/download.html)以下のファイルをダウンロードする。

![2019-09-22 (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169545/1d928cf9-5be0-deb9-e081-a279daedd4ab.jpeg)
![2019-09-22 (3)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169545/c4e180cc-729a-d727-f41e-ebac26923697.jpeg)

それぞれ解凍します。

sqlite3.hが格納されているファイルをCドライブの直下に置きます。
sqlite3.dllをコピーして、Rubyのbinディレクトリ配下に配置します。
自分の場合は、C:\Ruby25-x64\bin　でした。
そして以下のコマンドを実行します。

```
$ gem install sqlite3 --platform=ruby -- --with-sqlite3-include=C:\sqlite-amalgamation-3290000\sqlite-amalgamation-3290000 --with-sqlite3-lib=C:/Ruby25-x64/bin


>>Temporarily enhancing PATH for MSYS/MINGW...
  Installing required msys2 packages: mingw-w64-x86_64-sqlite3
・・（省略）
This could take a while...
  Successfully installed sqlite3-1.4.1
  Parsing documentation for sqlite3-1.4.1
  Installing ri documentation for sqlite3-1.4.1
  Done installing documentation for sqlite3 after 1 seconds
  1 gem installed

```
この際、--with-sqlite3-includeにはsqlite3.hを格納した絶対パスを指定し、--with-sqlite3-libにはsqlite3.dllを格納した絶対パスを指定します。
そしたら、sqlite3がインストールされると思います。
さらにこの時に、C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\sqlite3-1.3.13\lib\sqlite3\sqlite3_native.soが生成されます。

![2019-09-22 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169545/db80b682-abb1-37cf-41f7-d49b622bbd8a.png)
sqlite3_native.soをコピーして、C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\sqlite3-1.3.13-x64-mingw32\lib\sqlite3を開いてください。
2.4まであると思うので2.5を作り先ほどのsqlite3_native.soを置いてください。
![2019-09-22 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169545/eae9bc7b-ed7d-45a9-bd69-cff62562fd17.png)
これで、rails sで上手くいくと思います。

##追記

###別のエラーに対しても上記の対応で解決できました。
`rails s`を実行した際に、以下のエラーが発生。

```
Could not find sqlite3-1.4.1 in any of the sources
Run `bundle install` to install missing gems.
```

`gem install`を実行した際に以下のエラーが発生。

```
Gem files will remain installed in C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.2 for inspection.
Results logged to C:/Ruby26-x64/lib/ruby/gems/2.6.0/extensions/x64-mingw32/2.6.0/sqlite3-1.4.2/gem_make.out
```

##参考
[【Railsアプリ構築】rails new コマンド実行時、SQLite3のビルドに失敗する](https://qiita.com/RyoItEngineer/items/a75f006d04b988a22a5b)
[Windows10で「rails server」コマンドを実行したときに「cannot load such file -- sqlite3/sqlite3_native」とエラーが出ることへの対処](https://qiita.com/shuhey/items/8cd28aed5906fb5fa6ec)
間違いがありましたら、編集リクエストをお願い致します。
Ruby on Railsチュートリアルでつまづいたところ


＊　rails 6.0.0 での出来事　＊

Ruby on Railsチュートリアル
https://railstutorial.jp

「2.3.5 アプリケーションをデプロイする」でデプロイ失敗
<code>heroku open</code>
すると、503＾q＾
<code>heroku logs --tail</code>
であとよろしく。的な。

下記サイトを参考にさせていただき
https://qiita.com/m-itoidcf/items/77d064147a32169b5449


そういう時は
<code>heroku run rails console | grep Error</code>
がいいらしい。

自分の場合は
<code>/app/app/models/user.rb:3:in `<class:User>': uninitialized constant User (call 'User.connection' to establish a connection)::FILL_IN (NameError)</code>
ということらしい。

・・・どういうことか分からないが<code>user.rb</code>の３行目がおかしい。
のであれば、そこをバッサリ消去！（ついでに同じ内容の４行目も消去）　

結果：エラーなくなりました。
Elasticsearch7系をdocker-composeで立ち上げてexited with code 78に出会った時の対応

# なにこれ

Elasticsearch7.3.2をdocker-composeで立ち上げる時に以下エラーが出ていたので対応方法をメモを残します。

```
elasticsearch_1  | {"type": "server", "timestamp": "2019-09-22T03:27:53,917+0000", "level": "INFO", "component": "o.e.x.m.p.NativeController", "cluster.name": "docker-cluster", "node.name": "37092a04af2c",  "message": "Native controller process has stopped - no new native processes can be started"  }
local_elasticsearch_1 exited with code 78
```

# 当初のDockerfileとdocker-compose.yml
エラーが出ていた時のファイルも置いておきます。
<details>
<summary>Dockerfile</summary>
<div>

```Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:7.3.2
RUN elasticsearch-plugin install analysis-kuromoji
```
</div>
</details>

<details>
<summary>docker-compose.yml</summary>
<div>

```docker-compose.yml
version: '3'

volumes:
  es-data:
    driver: local

services:
  elasticsearch:
    build: ./elasticsearch
    volumes:
      - es-data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
```
</div>
</details>





# 対応方法
Elastisearch7から設定が増えたようです。
以下公式のドキュメントを見て対応します。
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

Dockerfileとdocker-compose.ymlを以下の通りにしElasticsearchの起動を確認しました。

```elasticsearch/Dockerfile.
FROM docker.elastic.co/elasticsearch/elasticsearch:7.3.2

# 日本語全文検索pulgin
RUN elasticsearch-plugin install analysis-kuromoji
```

```docker-compose.yml
version: '3'

volumes:
  es-data:
    driver: local

services:
  elasticsearch:
    build: ./elasticsearch
    volumes:
      - es-data:/usr/share/elasticsearch/data
    environment:
      - discovery.type=single-node
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
```

`environment`と`ulimits`が重要そうです。

動作確認は以下の通り。

```
$ curl -X GET http://localhost:9200

{
  "name" : "d303b5e351a4",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "7h4hvetmRHaM-Kp6rVcQiA",
  "version" : {
    "number" : "7.3.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "1c1faf1",
    "build_date" : "2019-09-06T14:40:30.409026Z",
    "build_snapshot" : false,
    "lucene_version" : "8.1.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
```

Elasticsearch7系から設定値が増えたようなので、古いElasticsearchの記事を適当に参照しても動かないので注意しましょう。
Vueでネストされたオブジェクトにアクセスできないときの解決法がシンプルだった(ついでに同コンポーネントの再帰呼び出し)

nuxtでtwitterクライアントを作っているときに、引用ツイートの処理で詰まった。

### 表示したいツイートのデータ構造
![Untitled(4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227222/76c877ac-dc30-219d-bcd0-2d30edbb007c.png)
ツイートオブジェクトにはそのツイートのテキスト情報やツイートしたユーザーの情報は勿論、引用元のツイート情報まで含まれている。
即ち、図の青の部分と黄色の部分は同じデータ構造。

### 表示したい形式
![Untitled(5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227222/726118cf-2f5b-9ade-8fc2-4b8ff3f4bac2.png)
公式でもあるこの形式で表示したい。
ツイートと引用元ツイートは同じデータ構造なので、ツイートコンポーネント内でツイートコンポーネントを呼び出したらいける！
propsで引用Tweet Object渡せばできるかな。

### やってみた
> Cannot read property 'user' of undefined

### ググると...
[javascript – Vue.jsはデータオブジェクトのネストしたプロパティにアクセスできない](https://codeday.me/jp/qa/20190403/539522.html)
なるほど、まだオブジェクトが読み込めないタイミングで処理しようとして、エラーになってたということらしい。
なになに、フェッチするまで未ロードフラグを立てておいて、フェッチ完了時にフラグをおろして、表示。。。

### 自分のケースに反映
propsでデータを受け取るので、フェッチのタイミングとかわかりません。
でもとりあえず、propsで受け取るデータがあれば表示し始めて大丈夫なので、
受け取ったデータが参照可能かどうかで判定。

```vue:TweetCard.vue
<template>
    <div v-if="tweet">  <!-- コレで解決 -->
        <div><!-- ツイート内容 --></div>

        <!-- 引用ツイート -->
　　　　　<div class="box" v-if="tweet.is_quote_status">
            <quoted-tweet :tweet="tweet.quoted_status"/>
        </div>
    </div>
</template>

<script>
export default {
    name: 'quoted-tweet', // このコンポーネントをquoted-tweetという別名で呼び出せるように別名を宣言
    props {
        tweet: Object
    }
}
</script>
```

これで、TweetCardコンポーネントを再帰的に呼び出しながら、ツイートオブジェクトに含まれるツイートオブジェクトを表示させられました。
Django　form ラジオボタン　選択肢動的に変更方法がわからない。→解決

　会社の受付フォームを趣味でごりごり作成しております。POSTの時にラジオボタンの選択肢を動的に変更したい。
　具体的には「form.py」→｢開催日選択Form｣の｢data｣を「views.py」→「状況View」→「受験者リストView」→「def get(self, request):」の「開催日＿年」に変更したい（data=開催日＿年）。ですが、わかりません。どなたか様かご教授よろしくお願いします。
**→解決しました。「form」に引数が追加することができ、｢form｣内で変更することができました。
参考URL：https://note.crohaco.net/2015/django-form/**

```python:veiws.py
def post(self, request):        
        試験日 = request.POST.get('day')    #試験日        
        self.params['exam'] = 試験日Form(日選択=試験日)
　　　　　                               #↑日選択が引数として追加      
    )
```

```python:form.py
class 試験日Form(forms.Form):
    day = forms.ChoiceField(choices=[],required=False,widget=forms.RadioSelect)
    #↑「choices=[]」は下のコードの中の「self.fields['day'].choices」で生成する。
　　
       ##---コード省略---##
 
    def __init__(self,日選択, **kwargs):
        super(試験日Form, self).__init__(**kwargs)
 　 #↑「def__init__.... super(....  」はよくわりませんww
　　　　 ##---コード省略---##
         self.fields['day'].choices=開催日.objects.filter(開催2日目__gte=start,開催2日目__lte=end).order_by('開催2日目').values_list('id','開催2日目')  

         ##---コード省略---##
```   

```python:form.py
class 開催日選択Form(forms.Form):
    data = 開催日.objects.all().values_list('id','開催2日目')
    evc = forms.ChoiceField(
       label='開催日', choices=data,required=False,
       widget=forms.RadioSelect       
    )
```

```python:views.py

class 受験者リストView(TemplateView):
    def __init__(self):
        self.params = {
            'eventdate' : 開催日選択Form,                                  
        }
    def post(self, request):
        今年=datetime.date.today().year
        start=datetime.datetime(今年, 1, 1,)
        end=datetime.datetime(今年+1, 3, 31,)
        開催日_年=開催日.objects.filter(開催2日目__gte=start,開催2日目__lte=end).values_list('id','開催2日目')
              
        開催日選択Form.data=開催日_年　　　 
　　　　#↑ここで「form.py」の「開催日選択Form」の「data」の値を
       #「data=開催日_年」に変更したい。
       #これではうまくいきませんでした。
```