OmniAICreator/Qiita-1.07M huggingface dataset:
input type="checkbox"で複数チェックすると最後の値しか表示されない

##現象
3つのチェックボックスを作り、複数チェックしてデータを送信すると、最後にチェックした値しか表示されない。（1つのみチェックしているときは正しく表示される。）

||例１  |例２  |例３  |例４|
|---|---|---|---|---|
|user1|✅  |✅  |  |✅|
|user2|✅  |  |✅  |✅|
|user3|  |✅  |✅  |✅|
|結果|user2のみ  |user3のみ  |user3のみ  |user3のみ|


##上手くいかなかったコード
```html:form.html
<form action="test.php" method="GET">
    <label for="user1"><input type="checkbox" name="user" id="user1" value="user1">user1</label><br>
    <label for="user2"><input type="checkbox" name="user" id="user2" value="user2">user2</label><br>
    <label for="user3"><input type="checkbox" name="user" id="user3" value="user3">user3</label><br>
    <button type="submit">送信</button>
</form>
```
```php:test.php
<?php
var_dump($_GET['user']);
```

すべてのチェックボックスに✅して送信（例４）

```:結果
string(5) "user3"
```


##原因
3つとも同じ名前（user）で値を送信しようとしているため、複数チェックされているとuserに設定された値が上書きされてしまい、最後にチェックした値だけになってしまう。

name="user[]"
にすることで、上書きせず複数の値を送信することができる。


##改善されたコード
```html:form.html
<form action="test.php" method="GET">
    <label for="user1"><input type="checkbox" name="user[]" id="user1" value="user1">user1</label><br>
    <label for="user2"><input type="checkbox" name="user[]" id="user2" value="user2">user2</label><br>
    <label for="user3"><input type="checkbox" name="user[]" id="user3" value="user3">user3</label><br>
    <button type="submit">送信</button>
</form>
```

※PHPファイルは変更なし

```:結果
array(3) { [0]=> string(5) "user1" [1]=> string(5) "user2" [2]=> string(5) "user3" }
```

##参考にしたサイト
https://seeknext.co.jp/frontend/checkbox-post/
[Rails]Action Textでリッチテキストを作ろう！

# はじめに
Rails6で追加されたActionTextにリッチテキストコンテンツと編集機能を導入出来ます。
今までは自分で実装していたので、便利な機能だと思い、使い方を調べてみました！

# 使用方法
1.ActionTextのセットアップを行い、`rails db:migrate`を実行する。

```bash
$ rails action_text:install

$ rails db:migrate
```

2.埋め込み画像や他の添付ファイルを扱うため、ActiveStorageのセットアップを行う。

[参考]

https://qiita.com/ren0826jam/items/58bdbaff17581280ee5a

3.使用するモデルにリッチテキストのフィールドを追加する。

```app/models/message.rb
class Message < ApplicationRecord
  has_rich_text :content
end
```

4.ビュー側でヘルパーメソッドを使用する。

```ruby
<%= form_with(model: message) do |form| %>
  <div class="field">
    <%= form.label :content %>
    <%= form.rich_text_area :content %>
  </div>
<% end %>
```

5.リッチテキストを保存するためにコントローラーを設定する。

```app/controllers/messages_controller.rb
class MessagesController < ApplicationController
  def create
    message = Message.create!(message_params)
    redirect_to message
  end

  private

  def message_params
    params.require(:message).permit(:content)
  end
end
```

## 利用時の注意点
### N+1問題における注意
ActionTextは、ActionText::RichTextというモデルで管理されています。そのため、このリッチテキストが別テーブルで管理されていることを意識しないとN+1問題に遭遇します。
解決策として、専用のeager_load用メソッドがあり下記の2つです。
※「name」には、has_rich_textに渡した引数が入ります。

- with_rich_text_#{name}
- with_rich_text_#{name}_and_embeds

```app/controllers/messages_controller.rb
class MessagesController < ApplicationController
  ...
  def index
    @messages = Message.with_rich_text_content
  end
end
```

### カスタマイズにおける注意
セットアップ時に、`app/assets/stylesheets/actiontext.scss`が生成されています。デザインを編集したい場合は、このファイルを修正するか、別のファイルを作成しましょう。
また、添付された画像のビューは、`app/views/active_storage/blobs/_blob.html.erb`で定義されています。このファイルを編集することで画像の見た目を整えられます。

# 終わりに
簡単な手順ではありますが、リッチテキストを導入できました！
正しい手順を踏めば誰でも導入可能だと思うので、ぜひお試しあれ！

# 参考
[Action Text の概要]
(https://railsguides.jp/action_text_overview.html)
each_with_indexの使い方について

eachループしつつ、それぞれデータに番号を振り分けて全体で何番目という風な記述にしたい場合に何か良いのがないか探してみたところ
便利なeach_with_indexというメソッドを見つけることができましたのでアウトプットがてら紹介したいと思います。

#each_With_indexの使い方

```ruby.html.erb
<% @users.each_with_index do |user, i| %>
<%= "#{user}は、 #{i+1}位:" %>
<% end %>
```

```出力結果
userは（iに1プラスした値）
```

なおindexは0から始まるため＋1にしてますが、初期値の0から始めたい場合は{i}だけで大丈夫です。
[シリーズ全7回] Dockerとシェルを活用して、1コマンドで Django を立ち上げる

# はじめに

Docker (docker-compose)と Linux に標準で搭載されているシェルを組み合せて、
下図の Django 環境を 1コマンドで即座に立ち上げるためのコードとその解説です.

本記事の内容は、Zenn で[書籍](https://zenn.dev/robozushi10/books/3d32504b4b5707)として販売している内容と同一です.
Zenn でも書籍の内容は全て無料公開しています.

コンテンツは次の通りです.

|コンテンツ|作成する Django 環境|
|:--|:--|
|[[01] デフォルト環境 runserver + SQLite3 の構築 ](https://qiita.com/robozushi10/items/fc8e40ad7ecc29131ea3/)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/d9fadee4-9a8c-95c6-5e8b-ec177042e1db.png)|
|[[02] SQLite3 を PostgreSQL へ置き換える](https://qiita.com/robozushi10/items/7dc07ab6412b285c75da)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/ec667920-bce0-6029-8ef1-b09c24c38fae.png)|
|[[03] Django アプリの立ち上げもさせる](https://qiita.com/robozushi10/items/bda4e5f1c743c4c26af5)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/25dfd950-b3b6-7e70-beee-5097cea167a4.png)|
|[[04] jwilder/dockerize を使ってセットアップ処理を改良する](https://qiita.com/robozushi10/items/3d955c5c50d845c73e82)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/b5d732d1-1866-5612-8ab8-9cf034234b0a.png)|
|[[05] runserver を Gunicorn へ置き換える](https://qiita.com/robozushi10/items/406ef206efaf8c1f5c39)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/34dbe40c-634b-c752-9d02-a8642d3b9c8b.png)|
|[[06] "まっしろ"対策として Nginx を導入する](https://qiita.com/robozushi10/items/fc4e8d275f3673796038)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/09c82bda-9bb1-a771-da4f-c27bd1c87090.png)|
|[[07] キャッシュデータベース Redis の導入をする](https://qiita.com/robozushi10/items/f33654519c6e0950cef9)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/3c09bedb-e7b4-9383-7bf8-c4f1496dae47.png)|


#### 補足事項

 [「1コマンドでDjangoを立ち上げる」の補足事項](https://qiita.com/robozushi10/items/594c24fdfe440131f43a)

#### 参考文献・サイト

📘 現場で使える Django の教科書《基礎編》横瀬 明仁
📘 現場で使える Django REST Framework の教科書 横瀬 明仁
📘 現場で使える Django の教科書《実践編》横瀬 明仁
📘 15Stepで習得 Dockerから入るKubernetes 高良真穂 
📘 Practical Developers ――機械学習時代のソフトウェア開発［ゲームアプリ/インフラ/エッジ編］ WEB+DB PRESS ― Part 3［フィンテック/金融業界発］大規模データ処理の自動化 - セキュリティ強化のためのサーバーレスアーキテクチャ 西田 圭介

🌍 Djangoの初回マイグレーション時に relation "auth_user" does not exist というエラーが発生する場合 https://yura2.hateblo.jp/entry/2015/08/14/Djangoの初回マイグレーション時に_relation_"auth_user"_does_not_exist_というエ
🌍 PostgreSQL は TRUNCATE もトランザクション内です。 https://www.odin.hyork.net/write/write0206.html
🌍 Docker Compose で複数コンテナの準備完了を TCP / HTTP で待機できる「dockerize」を試した https://kakakakakku.hatenablog.com/entry/2020/11/16/094819
🌍 Using django-redis https://riptutorial.com/django/example/14226/using-django-redis
🌍 Dockerizeを使って他のコンテナの起動を待つ https://qiita.com/Aruneko/items/971e65a945d23f7bb8b6
🌍 dockerizeコマンドで他のDockerコンテナの立ち上げを待つ https://labs.cybozu.co.jp/blog/akky/2017/12/let-dockerize-command-wait-other-container/
「1コマンドでDjangoを立ち上げる」の補足事項

# 概要

各章に記述すると本筋から外れると判断した内容を書き出している.


# 項目

## PostgreSQL に初期データを登録させる方法

セットアップ実行前に `./db/init/.` に対して、次のように SQLファイル (*.sql) を配置しておくと、コンテナ起動時にデータベースに初期データを登録できる.

```
./db/init/001.sql
```

## Django コンテナでのデバッグ補助ツールの導入

./web/Dockerfile を使って下表のパッケージをインストールしておくと、何かしらの調査の際に便利である. 記載例も挙げている.

|パッケージ|内容|
|:--|:--|
|procps| ps や top コマンドが使えるようになる |
|iputils-ping| ping コマンドが使えるようになる |
|net-tools| ifconfig コマンドが使えるようになる|
|curl|curl コマンドが使えるようになる|
|wget|wget コマンドが使えるようになる|


### web/Dockerfile での記述例

```diff
 RUN apt-get update
 RUN apt-get install -y build-essential
 RUN apt-get install -y libpq-dev
+RUN apt-get install -y procps
+RUN apt-get install -y iputils-ping
+RUN apt-get install -y net-tools
+RUN apt-get install -y curl
+RUN apt-get install -y wget

 # 時刻を日本に合わせる
 RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
 
```

## ホストから PostgreSQL にログインしたい

事前にホストに `psql` をインストールしておく.
そして次のようにすればログインすることができる.
なお、localhost は適宜読み替えること.

|項目|値|
|:--|:--|
|アカウント|`admin`|
|パスワード|`admin`|
|ポート|`53432番`|
|データベース|`django307`|

```bash
$ PGPASSWORD=admin psql -U admin -h localhost -p 53432 -w django307
```
WordPressとDockerを用いたローカル環境構築

# WordPressとDockerを用いたローカル環境構築

## 目的

今までWordPress開発のためのローカル環境構築をするときには、[MAMP](https://www.mamp.info/en/windows/)を使用していた。
しかし、今回からはコンテナ型の仮想環境である[Docker](https://www.docker.com/)を用いて実装することにした。
ただ、まだまだDockerとWordPressに関する記事やまとめが少なく、個人的にも一回整理しておきたいと思った
そのため、今回はWordPressをDocker上で操作できる状態にするための手順をメモしていくこととする。

### MAMPからDockerにローカル環境を変更することによるメリット

- MAMPのように直接ツールのインストールを行わないため、開発環境の破棄や再構築が面倒ではなくなる。
- 環境開発を複数用意したい（複数のプロジェクトを同時進行させたい）場合の設定が楽になる。
- 環境開発手順がよりシンプルになる。

### 各ツールのインストール

- [dockerのinstall](https://docs.docker.com/get-docker/)

## WordPress環境構築手順

1. プロジェクトを定義する。

空のプロジェクトのディレクトリを作成する（今回は、ディレクトリ名を `wp-project-001` とする）。そして、プロジェクトのルートディレクトリに移動する。

```terminal
$ mkdir wp-project-001
$ cd wp-project-001
```

2. `docker-compose.yml` というファイルを作成する。これは、wordpressを始めるための設定ファイルのようなものであり、dbとの連携を図るためのファイルとなる。

```terminal
$ touch docker-compose.yml
```

- `docker-compose.yml`

```yaml
version: "3.9"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}
```

3. プロジェクトをbuildする

この設定をした後は、以下のコマンドを実行してローカル環境を立ち上げる。

```terminal
$ docker-compose up
```

4. webブラウザでWordPressの設定を行う

上記コマンドで立ち上がったら、`http://localhost` または `http://localhost:8000` でブラウザを開く。

![Screen Shot 2021-06-13 at 16.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1480416/f6caad5d-d1d3-2873-6ca5-5044bab0f3b7.png)

そうすると上記のようなwelcome画面が出てくるので、「言語選択」を行う。今回は「日本語」を選択しています。

![Screen Shot 2021-06-13 at 16.24.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1480416/a817cfe3-0e01-4db1-f992-0c89613477ed.png)

「サイト名」「ユーザー名」「パスワード」「メールアドレス」「サーチエンジンインデックス」の5項目入力する個所があるため、こちらを記入する。

すべての設定が終わると、上記のような完了画面が出てくる。これで、初期設定は終了する。

## まとめ

MAMPの場合は、dbの設定が特に面倒で、結構躓いてしまう場面が多かった印象がある。ただ、dockerを用いれば1つ設定ファイルを追加し、コマンドで処理するだけで設定が完了するので、遥かに楽かと思う。
ここから色々とカスタマイズしていければいいかと思う。

## 参考リンク

- [Quickstart: Compose and WordPress](https://docs.docker.com/samples/wordpress/)

### ちなみに（2021.07.12現在）

- [Zenn](https://zenn.dev/)にも同じ記事を投稿しています。現時点ではどっちもメリット・デメリットあるので、両方投稿しています。使っていくうちに、役割を分けるか一本化するか徐々に決めていこうと思ってます。
- [Zenn - WordPressとDockerを用いたローカル環境構築](https://zenn.dev/gashi/articles/20210613-article001)
ADFSサーバーでX-XSS-Protectionヘッターの設定

#はじめに
Windows ServerのADFSサービスですが、セキュリティ攻撃のターゲットになることが多く、セキュリティを管理している部門から各種設定を追加するようにといった要求が来ることがあります。ここでは、X-XSS-Protectionヘッタの設定方法に関して記述しています。
X-XSS-Protection ヘッターは、IE, Chrome, Safariの機能で、反射型クロスサイトスクリプティング (XSS) 攻撃を検出したときに、ページの読み込みを停止します。　本ヘッター設定は、最近のブラウザでは、不要ですが、古いブラウザに有効なため、セキュリティ監査で設定を要求される場合があります。

#事前確認
実行前に、ADFSサーバーアクセスした際にCSPヘッタが設定されていないことを確認します。
ブラウザ（chromeなど）を開き、F12キーをクリック、ネットワークのタブを選択します。続いて、ADFSのURLを開きます。

https:///adfs/ls/IdpInitiatedSignon.aspx

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/a1df6b47-1c2d-9bc8-2eb4-5ef0499d8844.png)

Response Headersを参照して、X-XSS-Protectionヘッター無いことを確認します。

#設定
ADFSサーバー（複数台ある場合プライマリサーバー）にログインします。サーバー上で、PowerShellを管理者モードで起動します。
下記のコマンドを実行します。

```
Set-AdfsResponseHeaders -SetHeaderName "X-XSS-Protection" -SetHeaderValue "1"
```
設定後下記コマンド設定内容を確認します。

```
Get-AdfsResponseHeaders | fl

ResponseHeaders        : {[X-Frame-Options, DENY], [X-XSS-Protection, 1]}
ResponseHeadersEnabled : True
```

#確認
設定が正しく反映しているか確認します。確認の項目と同様にブラウザ（chromeなど）を開き、F12キーをクリック、ネットワークのタブを選択します。続いて、ADFSのURLを開きます。

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/0261486d-4d83-2742-6d88-35f3030f69fd.png)

#おまけ
以前、ADFSサーバーのヘッターを登録したのですが、設定に誤りがありうまく動作しなくなりました。この際のヘッター設定の削除ですが、Set-の対にRemove- があるかと思いきや、Remove- は、ADFSにありませんでした。
削除は、下記のコマンドで実行します。

```
Set-AdfsResponseHeaders -RemoveHeaders "ヘッター名"
```

#参考資料
[AD FS 2019 で HTTP セキュリティ応答ヘッダーをカスタマイズする][link1]
[link1]:[https://docs.microsoft.com/ja-jp/windows-server/identity/ad-fs/operations/customize-http-security-headers-ad-fs]
CppNow 2021のプレゼン紹介

# はじめに

CppNow 2021のプレゼンがYoutubeで公開され始めました。いくつか見て面白いなと思ったものを挙げておきます。そのうち内容の紹介も追加しようと思っています。

# プレゼンリスト

- [C++11/14 at Scale: What Have We Learned? - John Lakos & Vittorio Romeo](https://youtu.be/E3JG2Ijjei4)
- [CMake + Conan: 3 Years Later - Mateusz Pusz](https://youtu.be/mrSwJBJ-0z8)
- [Keynote: SOLID, Revisited - Tony Van Eerd](https://youtu.be/glYq-dvgby4)
- [Keynote: CMake: One Tool To Build Them All - Bill Hoffman](https://youtu.be/wULu83jQmIQ)
- [A Crash Course in Unicode for C++ Developers - Steve Downey](https://youtu.be/iQWtiYNK3kQ)
- [When Should You Give Two Things the Same Name? - Arthur O'Dwyer](https://youtu.be/OQgFEkgKx2s)
Arduino

# Arduinoの接続


# 使用するピンに名前を付ける
以下のように名前を付けておくと、プログラミングの際に便利です。

```c
#define LED_PIN1 13
#define LED_PIN2 12
#define LED_PIN3 11
#define LED_PIN4 10
```

# 10回点滅させるための関数
```c
void blink10(){
  int i;
  for(i=0;i<10;i++){
    digitalWrite(LED_PIN1, HIGH);
    digitalWrite(LED_PIN2, LOW);
    digitalWrite(LED_PIN3, LOW);
    digitalWrite(LED_PIN4, LOW);

    delay(200);
    digitalWrite(LED_PIN1, LOW);
    delay(200);
  }
}
```
# アウトプットなどを指定
```c
void setup() {
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
  pinMode(LED_PIN3, OUTPUT);
  pinMode(LED_PIN4, OUTPUT);
  Serial.begin(9600);
  digitalWrite(LED_PIN2, HIGH);
  }
```

# ループ関数
シリアルで'a'を入力した場合、緑を点灯
シリアルで'b'を入力した場合、黄色を点灯
シリアルで'c'を入力した場合、赤を10回点滅させてから点灯

```c
void loop() {
  int inputchar;
  
  inputchar = Serial.read();
  if (inputchar != -1){
    
    switch(inputchar){
      case 'a':
       Serial.print("GR ON\n");
       digitalWrite(LED_PIN1, LOW);
       digitalWrite(LED_PIN2, LOW);
       digitalWrite(LED_PIN3, HIGH);
       digitalWrite(LED_PIN4, LOW);
       break;
      case 'b':
       Serial.print("YE ON\n");
       digitalWrite(LED_PIN1, LOW);
       digitalWrite(LED_PIN2, LOW);
       digitalWrite(LED_PIN3, LOW);
       digitalWrite(LED_PIN4, HIGH);
       
       break;
      case 'c':
       Serial.print("RED ON\n");
       blink10();
       digitalWrite(LED_PIN1, HIGH);
       break;
    }
    Serial.print("READY\n");
  }
}
```

# 長押しを認識させてシリアル出力

```c
#define PUSH_SHORT 100
#define PUSH_LONG 32000
uint16_t count_low = 0;

void setup ( ) {
  Serial.begin(9600);               // 9600bpsでシリアルポートを開く
  pinMode(2,INPUT_PULLUP);
  }
  
void loop ( ) { 
  if(digitalRead(2) == LOW){        //スイッチが押されているとき
    if(count_low <= PUSH_LONG)count_low ++;   }
    else{                            //スイッチが押されていないとき 
      if(count_low>= PUSH_LONG)Serial.println("long");
    else if(count_low >= PUSH_SHORT)Serial.println("short");
    
    count_low = 0;
  }
}
```

# カンマ区切りでシリアル送信

```c
int i = 0;
char buf[20];
int ch[5];

void setup() {
  Serial.begin(9600);
}

void loop() {
 if (Serial.available()) {
    buf[i] = Serial.read();
    if (buf[i] == 'e') {
      buf[i] = '\0';
      //Serial.println(buf);

      ch[0] = atoi(strtok(buf, ","));
      ch[1] = atoi(strtok(NULL, ","));
      ch[2] = atoi(strtok(NULL, ","));

      Serial.println(ch[0]);
      Serial.println(ch[1]);
      Serial.println(ch[2]);
      i = 0;
    }
    else {
      i++;
    }
  }
}
```

#音を鳴らす
```c
const unsigned char sample_raw[] PROGMEM = {
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7f,0x80,0x80,0x80,0x7f,0x80,0x80,
0x6d,0x80,0x5b,0x7f,0x5e,0x80,0x6c,0x7f,0x59,0x80,0x6f,0x7f,0x85,0x7f,0x9a,0x80
};
unsigned int sample_raw_len = 1200;

void setup() 
{
  pinMode(3, OUTPUT);
  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS20);
  
  play();
}

void play() {
  for (int i = 0; i < sample_raw_len; i++) {
    OCR2B = pgm_read_byte_near(&sample_raw[i]);
    delayMicroseconds(125);
  }
} 

void loop() {
}
```
プログラミング初心者が書いたMVCモデルについて

はじめに
-------
現在私はPHPとLaravelを学んでいるのですが、そのLaravelの中で重要となってくるのが
「MVCモデル」と呼ばれる考え方です。

拙いですが自分の備忘録として他の方の記事などを参考にしながら
下記に「MVCモデル」の特徴を書いていきたいと思います。

MVCモデルとは
------
Model、View、Controllerの3つの役割に分割してコーディングを行うモデルのことです。
今回はRouterの説明も一緒に書いてみたいと思います。

・Model
→主にDBを操作する役割を持っています。
　具体的にはデータをDBへ保存、DBからデータを取得、DBのデータの更新や削除を行います。
　DBの編集・管理をするときに使うのが「マイグレーション」になるのですが、まだ理解が追いついていないので割愛します。

・View
→ユーザーが実際に見る画面を表示する役割を持っています。
　Controllerから受け取ったデータ(レスポンス)を画面に表示したり、ユーザーからのリクエストをControllerへ送信したりします。

・Controller
→ModelとViewに処理をお願いする司令塔の様な役割を持っています。
　Viewからリクエストを受け取ってModelに指示を出したり、Modelの処理を受け取ってViewへレスポンスを送るなどをします。

・Router
→アクセスしたアドレスを元に処理を割り振る役割を持っています。
　Laravelはアドレスに割り付けられたプログラムの実行によって表示されるため、アドレスに対しての処理をそれぞれ関連付ける必要があリます。

図解すると下記の通りです。
![MVCモデル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1478204/381649d5-8196-8283-9904-300c58ee6ca9.png)

MVCモデルのメリット
--------
1,役割を分割することで誰が見てもわかりやすいコードとなる。
2,変更・修正を行う際に一部分だけ直せばいいので労力を最小限に抑えることができる
3,役割が分割されているので共同開発しやすい

以上が大まかに書いたMVCモデルの特徴です。
まだまだこの概念は理解しきれていないので誤っている点などがあればぜひ教えてください。

ここまで見て頂きありがとうございました！！

参照元
https://qiita.com/s_emoto/items/975cc38a3e0de462966a
https://qiita.com/OhshimaRyo/items/310a098418cb09b24285
PHP8.1でenumが使えるようになる！

# PHP8.1からenumが使えるようになります
PHP8.1は2021年11月25日リリース予定です。
追加される新機能は以下を参考
https://stitcher.io/blog/new-in-php-81
その中で注目の一つはenumが追加されることかなと思います。

# 実際にどんな感じに使えるのか？

## enumの宣言
まずは以下のようにenumを宣言します。

```php
enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
}
```
## 宣言したenumを利用する
以下のようにコンストラクターでenumを引数として利用します。

```php
class BlogPost
{
    public function __construct(
        public Status $status, 
    ) {}
}
```

先ほど作成したBlogPostのインスタンスを作成します。
この際に、作成したenumのStatusを引数として与えます。
`Status::DRAFT`のように記述します。

```php
$post = new BlogPost(Status::DRAFT);
```

# enumでメソッドを定義する
enumでは、classを同じようにメソッドも定義できます。
今回は`color()`というメソッドを作成して、enumとマッチしたものを指定した文字列として返します。

```php
enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string
    {
        return match($this) 
        {
            Status::DRAFT => 'grey',   
            Status::PUBLISHED => 'green',   
            Status::ARCHIVED => 'red',   
        };
    }
}
```

定義したメソッドは以下のように利用します。
この場合、'red'が返却値となります。

```php
$status = Status::ARCHIVED;

$status->color(); // 'red'
```

## interfacesの実装
enumはclassと同じようにinterfacesの実装をすることも可能です。
以下のようにHasColorというinterfacesが定義されていたとします。

```php
interface HasColor
{
    public function color(): string;
}
```
その際には、classと同様にimplementsで実装することができます。
 
```php
enum Status implements HasColor
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string { /* … */ }
}
```
PHP8.1ではenumの追加以外にも魅力的なアップデートが多そうです。

# 参考
https://stitcher.io/blog/php-enums
ワクチンを2倍にしてワクワクチンチンにする処理

## はじめに

2回接種するということなので

### リテラルでワクチンを2倍にする

```python
def double_vaccine_literal(injection: str) -> str:
    if injection == "ワクチン":
        return "ワクワクチンチン"
    else:
        return injection
```

#### 出力

```shell
>>> double_vaccine_literal("ワク")
'ワク'
>>> double_vaccine_literal("ワクチン")
'ワクワクチンチン'
```

内部処理的には2倍してない

### 演算子でワクチンを2倍にする

```python
def double_vaccine(injection: str) -> str:
    if injection == "ワクチン":
        return injection[0:2] * 2 + injection[2:4] * 2
    else:
        return injection
```

#### 出力

```shell
>>> double_vaccine("ワク")
'ワク'
>>> double_vaccine("ワクチン")
'ワクチンワクチン'
```

n倍にも対応できる

### 全てのワクチンを2倍にする

```python
def double_all_vaccines(injections: str) -> str:
    vaccine = "ワクチン"
    return injections.replace(vaccine, vaccine[0:2] * 2 + vaccine[2:4] * 2)
```

#### 出力

```shell
>>> double_all_vaccines("ワク")
'ワク'
>>> double_all_vaccines("ワクチン")
'ワクワクチンチン'
>>> double_all_vaccines("ワクチンワクチン")
'ワクワクチンチンワクワクチンチン'
```
全てのワクチンって何なんだ

### ワンライナーで2倍にする

```python
>>> "".join(map(lambda s: s * 2, ["ワクチン"[i : i + 2] for i in [0, 2]]))
'ワクワクチンチン'
```
`"".join`がなんか嫌

## まとめ

- ワクチンを2倍にしてみた
- `"ワクチン"[0:2]`みたいに分離するのダサい
- もっとスマートな書き方教えて下さい
- 他の言語でも見てみたいです 👀
Softether VPN と QEMU KVMのtapデバイスを共存させる

#はじめに

Softether VPNでtapデバイスを作成している環境でlibvirt環境を構築すると、
システム再起動時にSoftEther VPN側のtapデバイス作成時にエラーが出ちゃう問題を解決しました。

#環境

Debian 10 Buster
Softether VPN (vpnbridge)
QEMU KVM(libvirtd)

#原因

libvirtdがvpnbridgeより先に起動すると、libvirtdが作成するtapデバイスとSoftEther VPNが作成するtapデバイスがどうやらコンフリクトしてるっぽい。が、逆の順番ならうまくいく。

#解決方法

systemdのUnitファイルを編集し、libvirtdの起動順序をvpnbridgeより後にするよう設定した。

#設定内容

`/etc/systemd/system/multi-user.target.wants/libvirtd.service`の[Unit]に
`After=<SoftEther VPNのユニットファイル>`を追記するだけ。

```unit-file:/etc/systemd/system/multi-user.target.wants/libvirtd.service

[Unit]
Description=Virtualization daemon
Requires=virtlogd.socket
Requires=virtlockd.socket
Wants=systemd-machined.service
Before=libvirt-guests.service
After=network.target
After=dbus.service
After=iscsid.service
After=apparmor.service
After=local-fs.target
After=remote-fs.target
After=systemd-logind.service
After=systemd-machined.service
After=vpnbridge.service
Documentation=man:libvirtd(8)
Documentation=https://libvirt.org

-- 以下略 --
【Vue.js】Vuexのstateを変えるような処理はmutation・commitで行う

## はじめに
仕事で使う事になったので1からVue.jsについて学んだ。
ちゃんと覚えておかないとまずそうな事を備忘録として1つ1つ残しておく。

## Vuexのstateを変えるような処理はmutation・commitで行う
### Vuexとは
Vuexは言うなればグローバル変数のようなもので、Vueのプロジェクトが大きくなった時にコンポーネント間でデータ渡しを簡単にするための仕組み。

```js:store.js
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
    state: {
        count: 2
    }
});
```

上記のように、`Vuex.Store()`でインスタンス化し「Store＝格納する場」を作る。
格納する場には、「state＝状態」というプロパティがあり、このstateに定義されてるものがグローバル変数のようにデータ(状態)を持つものになる。


### stateを変更するのを単純にやると
以下のように`this.$store.state.count`でVuexのStoreのstateにアクセスできるので、それに対して変更（今回は`++`, `--`）をしている。

```vue.HeaderHome.vue
<template>
  <div>
    <button type="button" class="btn btn-secondary ms-2" @click="increment">
      +1
    </button>
    <button type="button" class="btn btn-secondary ms-2" @click="decrement">
      -1
    </button>
  </div>
</template>

<script>
export default {
  methods: {
    increment() {
      this.$store.state.count++;
    },
    decrement() {
      this.$store.state.count--;
    },
  },
};
</script>
```

※ただ、上記の実装ではパット見た時に、stateの値を**参照している** or **変更している**が分かりにくくになる。
　そこでmutations・commitという仕組みを使う。

### mutation・commitでstateを変更する
以下のように`mutations`プロパティを定義し、そこに処理を書く。
その処理をコンポーネント側からは`commit()`で呼び出す事でstateの変更を行う。

```js:store.js
export default new Vuex.Store({
    state: {
        count: 2
    },
    mutations: {
        increment(state, number) {
            state.count += number;
        },
        decrement(state, number) {
            state.count -= number;
        }
    }
});
```
```vue.HeaderHome.vue
<template>
  <div>
    <button type="button" class="btn btn-secondary ms-2" @click="increment">
      +1
    </button>
    <button type="button" class="btn btn-secondary ms-2" @click="decrement">
      -1
    </button>
  </div>
</template>

<script>
export default {
  methods: {
    increment() {
      this.$store.commit("increment", 2);
    },
    decrement() {
      this.$store.commit("decrement", 2);
    },
  },
};
</script>
```

#### mutationsを効率よく使う　～mapMutations～
上記の`HeaderHome.vue`のメソッドのような実装だと冗長だが、以下のように書く事もできこれだと少しスッキリする。
以下のように書く場合には、

- `@click="increment"`　→　`@click="increment(2)"`
- `@click="decrement"`　→　`@click="decrement(2)"`

として引数を渡す。

```vue:HeaderHome.vue
<script>
import { mapMutations } from "vuex";

export default {
  // "..."はES6のスプレッド演算子 
  methods: {
    ...mapMutations(["increment", "decrement"]),
  },
};
</script>
```

※ちなみに、mutationsに複数のデータを渡したい場合はオブジェクトで渡す。
　それは[ここ](https://github.com/yuta-katayama-23/intro-vuecli/commit/d9b0dcf90562308c7fdebfe8e2edd9bca508c471)を参照（例では`mutations`ではなく`actions`になっているがどちらでも同じで、actionsについては[ここ]()を参照。）

## Vue.jsの勉強メモ一覧記事へのリンク
Vue.jsについて勉強した際に書いた勉強メモ記事のリンクを集約した記事。

https://qiita.com/yuta-katayama-23/items/dabefb59d16a83f1a1d4
torchvision.modelsを転移学習するとき出力次元を変更する方法

# カスタマイズ
pytorchでtorchvision.modelsの学習済みモデルで転移学習を試すとき、
最終層の出力次元をモデルに応じて変更させる方法。

```py
import torch
import torchvision


def customize(model, out_features):
    """
    Parameters
    ----
    model:
        Model instance. (from torchvision.models.*)
    out_featurs:
        New dimension of out_features.
    """
    name, last_child = list(model.named_children())[-1]
    if type(last_child) == torch.nn.modules.Sequential:
        args = list(last_child)
        device = next(args[-1].parameters()).device
        in_features = args[-1].in_features
        args[-1] = torch.nn.Linear(in_features, out_features)
        modified = torch.nn.modules.Sequential(*args)
    if type(last_child) == torch.nn.modules.linear.Linear:
        device = next(last_child.parameters()).device
        in_features = last_child.in_features
        modified = torch.nn.Linear(in_features, out_features)
    setattr(model, name, modified.to(device))


model = torchvision.models.vgg16(pretrained=True)
customize(model, 2)
print(model(torch.zeros(1, 3, 224, 224)).shape) # torch.Size([1, 2])


model = torchvision.models.densenet169(pretrained=True)
customize(model, 2)
print(model(torch.zeros(1, 3, 224, 224)).shape) # torch.Size([1, 2])
```

#以下覚書

コーディングでハマった所メモ。
```model.children()[-1]```等でモデルの最後の子にアクセスできるが、
モデルごとにSequentialの場合とLinearの場合が存在することと、(例: vgg16とdensenet169)
```model.classifier = Linear(in_features, out_features)```
等の様にmodelのアトリビュートからアクセスするなら上手くいくが、
```model.children()[-1] = Linear(in_features, out_features)```
等の様に取得した子を上書きしても上手く更新できない。
モデルごとに最終層の名称がclassifierだったりfcだったりと異なるので、
```named_children()```から名前を取得した上で```setattr()```を使うと上手く更新できた。
ローカルTCPポートをリモートに差し出す - SSH reverse tunnel

```plantuml
participant tg as "Target Service\n192.168.0.11:80"
participant tc as "Tunnel Client"
participant ts as "Tunnel Server\nusr@svr.com"
participant usr as "User"

==dig a tunnel==
ts ->> ts : sshd
tg ->> tg : listen(port:80)
tc ->> ts : ssh -N usr@svr.com -R 1234:192.168.0.11:80
ts ->> ts:listen(port:1234) 
==pass through a tunnel==
usr -> ts : tcp(port:1234)
ts -> tc :
tc -> tg : tcp(port:80)
```


```sh:Tunne Client - Connect
TNSVR="usr@svr.com"
EXPPORT=1234
TG="192.168.11:80"
ssh -N $TNSVR -R $EXPPORT:$TG
```

- EXPPORTは1024以上(ウェルノウンポート不可)

### トンネルで開けたポートへの外部からの接続を許可

Tunnel Server側で開かれるポートがバインドされるアドレスは通常ループバックなのでホストからのみ接続可。バインドアドレスを指定するにはsshd設定を変更しトンネル接続時に指定。
```sh:(Tunnel Server) /etc/ssh/sshd_config
GatewayPorts clientspecified
```
```sh:(Tunnel Server) sshd再起動
sudo systemctl restart sshd
```
```sh:(Tunnel Client)
ssh usr@svr.com -N -R 0.0.0.0:1234:192.168.0.11:80
```
※任意のアドレス(0.0.0.0)の場合は省略可

### ssh証明書を指定する場合
```:sh
ssh -i ~/.ssh/private.key ...
```

### 関連

https://qiita.com/shokkaa/items/23a1c6cbe95f49185fcf
WordPressのURLランキング

Wordpressのurlを変更するときに参考にした記事。

#第1位
https://qiita.com/necousagi/items/3c0d92b57259f7067124
#第2位
https://qiita.com/torano_tomo/items/3a716a8da4574b6bf9fa
#第3位
https://qiita.com/halhide/items/9a1ac15164edb92991a9
#その他
https://qiita.com/pugiemonn/items/1852fb246ca141a2256a
https://qiita.com/ironsand/items/7f9f3ae78ac6f6259c2b

いつもわかりやすい記事ありがとうございます。
Express + pugメモ

<h2>memo</h2>
<ul>
<li>ルートのapp.jsでexpressを操作する。</li>
<li>"var indexRouter = require('./routes/index');"でwebページを読み込む</li>
<li>app.setでhtmlにrender</li>
<li>app.useでurlとwebページを紐づける。</li>
<li>azure上のファイル操作はvscodeのローカルのフォルダからdeployを行うと更新できる。</li>
<li>extendsが宣言されているpugファイルはblock外で宣言してはいけないようだ。</li>
<li>javascriptを読み込みたいなら"script(src='/javascripts/test.js')"という風にblockないで宣言する。</li>
<li>javascriptsフォルダはpublic内に存在する。</li>
<li>"include xxx.js"という風に宣言するとpugファイルとしてincludeされる。</li>
</ul>
Notion の APIライブラリ「notion_ruby」の使い方

[Notion API](https://developers.notion.com)が公開されたので非公式のRubyクライアント「notion_ruby」をオープンソースで公開しました。

[notion_ruby](https://github.com/decoch/notion-ruby)

ソースコードは公開しているので Issue / Pull Request をお待ちしております。

https://github.com/decoch/notion-ruby

## 基本的な使い方

### ライブラリのインストール

Bundler を使っている場合は Gemfile に追加して `bundle install` します

```ruby
gem 'notion_ruby'
```

使っていない場合は `gem install notion_ruby` します。

### Notion の Tokenを発行する

[My Integrations](https://www.notion.so/my-integrations) からTokenを作成します

![notion_my_integrations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33499/d57ebe51-247c-9e33-6b55-405a3966060d.png)

作成すると Token を取得できるのでメモしておきます。

![notion_secrets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33499/5b11354a-a427-e4c4-8826-f161a50a9f14.png)

Token を使って以下のようにクライアントを作成します。

```ruby
notion = NotionRuby.new({ access_token: '作成したToken' }) 
```

### 使いたいページ/Databaseを API から呼び出せるようにする

Token だけでは Notion のページを操作することができないので、Share から作成した Integration を招待します。

![notion_share.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33499/559fc3b5-5b48-a3bb-03cf-5b4ec39d0fe2.png)

これでライブラリを使う準備が整いました。

### Notionから情報を取得する

[GitHub の README](https://github.com/decoch/notion-ruby#usage) にAPIの呼び出しの方法が説明されています。
例えばDatabaseの取得であれば以下のようにできます。

```ruby
notion = NotionRuby.new({ access_token: '作成したToken' }) 
databases = notion.databases # => Notionのデータベースを一覧で取得する
```

### 取得したオブジェクトの属性にアクセスする

notion_rubyで取得したデータはHashのようにアクセスできます。

```ruby
databases["object"] # => "list"
```

`FaradayMiddleware::Mashify` を利用すれば取得したデータをオブジェクトのように扱うことができます

```ruby
notion = NotionRuby.new(access_token: NOTION_TOKEN) do |builder|
  builder.use FaradayMiddleware::Mashify
end
databases = notion.databases
databases.object # => "list"
```

## 最後に

普段から Notion を使っており何か貢献できればいいなと思いRubyのAPIクライアントを作りました。
Notionでの作業の自動化をしたいという方は利用してみてください
VCF to Table の使い方

<font size="+3" color="#AAA">
[PictBio HP「解析メモ」](https://www.pictbio.com/tips/3165.html)から移行中です。
元記事：2018/12/18 公開 VCF to Table の使い方</font>

 NGS フリーソフトにて配布中の「VCF to Table」の使い方をご説明いたします。

　このソフトは変異のステータスを記述するのによく用いられるファイル形式である VCF ファイルをエクセルで見やすよう変換いたします。ここでの説明にはソフトの動作テストと同じ環境である Windows10、Java8 の条件で行っております。

#起動
　先に公開されている「FASTA status の使い方」と同様です。ご参照ください。

[FASTA status の使い方](https://qiita.com/PictBio/items/f0aa1fc9344230098bee)

#ファイルの指定
　画面は以下のように左の設定領域と、右の結果表示領域にわかれています。

![起動後の画面](https://www.pictbio.com/wp-content/uploads/tips/3165_1.png)

 先ずは設定領域にある「VCF File」の「Select」ボタンを押してください。ファイル選択のダイアログが開くので、VCF ファイルを選択して「開く」を押してください。

![ファイルの選択](https://www.pictbio.com/wp-content/uploads/tips/3165_2.png)

#実行
　ファイルを選択したらファイル名が表示されます。左の設定領域にある「Run」ボタンを押すことで実行が行われます。

![ファイル選択後](https://www.pictbio.com/wp-content/uploads/tips/3165_3.png)

　計算が完了すると「Successfully completed.」というダイアログメッセージが表示されます。右の結果表示領域にカラム情報が表示されます。表示が切れている箇所はカラムの間にマウスポインタを置き、ドラックすることで広げることができます。

![実行](https://www.pictbio.com/wp-content/uploads/tips/3165_4.png)

#表示される内容

###file version
VCFファイルのフォーマットのバージョン

例： VCFv4.2

###Column Info : CHROM
リファレンスのIDとそれぞれの長さを表示。CHROM カラムの値に ID が使われる。

例：

|ID  |Length  |
|---|---|
|chr1  |248956422  |



###Column Info : ALT
ALT カラムに使われる値とその説明。表では ALT カラムの値に ID が使われる。

例：

|ID  |Description  |
|---|---|
|*  |Represents allele(s) other than observed.  ​|



###Column Info : FILTER
FILTER カラムに使われる値とその説明。表では FILTER カラムの値に ID が使われる。

例：

|ID  |Description  |
|---|---|
|PASS  |All filters passed  ​|



###Column Info : INFO
INFO カラムに格納されている値のタグとその説明。表ではタグごとカラムが作成される。

例：

|ID  |Number of Value  |Valule Type  |Description  |
|---|---|---|---|
|DP  |1  ​|Integer  ​|Raw read depth  ​|



###Samples
サンプル名のリスト。サンプルの変異情報カラムにつけられている名称。

例：NA

###Column Info by Samples : FORMAT
サンプルの変異情報カラムに格納されている値のタグとその説明。表ではタグごとカラムが作成される。

例：

|ID  |Number of Value  |Valule Type  |Description  |
|---|---|---|---|
|AD  |for each possible allele (including the reference)  ​|Integer  ​|Allelic depths  ​|

#ファイル出力
　右の結果表示領域を下にスクロールしていった先にある「Export」ボタンを押すことでファイル出力ができます。

![ファイル出力](https://www.pictbio.com/wp-content/uploads/tips/3165_5.png)

　開いたダイアログにファイル名を記入し「保存」ボタンを押すことで出力が実行されます。

![ファイル名で保存](https://www.pictbio.com/wp-content/uploads/tips/3165_6.png)

　ファイルの作成が完了すると「Exporting completed successfully.」というダイアログメッセージが表示されます。

![ファイル出力完了](https://www.pictbio.com/wp-content/uploads/tips/3165_7.png)

　output.xlsx は以下のように表形式で変異情報を見ることができます。

![出力ファイル](https://www.pictbio.com/wp-content/uploads/tips/3165_8.png)

　INFO カラムは複数タグ情報が1カラムに収まっていたものを分割して表示します。各カラムが何を表すかは、ツールの右の結果表示領域の「Column Info : INFO」で確認できます。

![INFOカラム出力](https://www.pictbio.com/wp-content/uploads/tips/3165_9-1.png)

　サンプルカラムもサンプルごとに、複数タグ情報が1カラムに収まっていたものを分割して表示します。各カラムが何を表すかは、ツールの右の結果表示領域の「Column Info by Samples : FORMAT」で確認できます。

![Samplesカラム出力](https://www.pictbio.com/wp-content/uploads/tips/3165_9-2.png)

　エクセルのウインドウ枠の固定や、フィルター機能を使えばさらに快適に表が見れます。是非ご活用ください。
ローカルと本番環境で挙動が違う時の対処法

ローカル環境での動作はバッチリ！
次に本番環境で動作確認していると、あれ、、思うように動かない。

考えられる原因の仮説として、
ローカル環境では動いているということでコードに問題はないとして、githubのmasterブランチにあげ忘れかな?

確認してみたものの全てmergeしている、、
なんでだろう、、

そうだ！思い切ってDBをリセットしちゃおう！！

```
#dbのリセット
heroku run DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:drop db:create db:migrate

#herokuの再起動
heroku restart

#herokuに再アクセス
heroku open
```


コマンド入力後再度動作確認すると、無事正常に動いている！
偶発的な問題だったみたいです。

皆さんもぜひ試してみてください:thumbsup_tone1:
mac で docker build時に `ENOSPC: no space left on device` エラー

表題のエラーだが、dfコマンドを叩いたところ、特に圧迫しているものはなさそう。
(devfs はディスクではなくUNIXデバイスだとか。)

```
$ df
Filesystem     512-blocks      Used Available Capacity iused      ifree %iused  Mounted on
/dev/disk1s1s1  976490576  29904472 623318552     5%  553757 4881899123    0%   /
devfs                 378       378         0   100%     654          0  100%   /dev
/dev/disk1s5    976490576   8388664 623318552     2%       4 4882452876    0%   /System/Volumes/VM
/dev/disk1s3    976490576    559608 623318552     1%     814 4882452066    0%   /System/Volumes/Preboot
/dev/disk1s6    976490576       768 623318552     1%      16 4882452864    0%   /System/Volumes/Update
/dev/disk1s2    976490576 312792088 623318552    34% 3207456 4879245424    0%   /System/Volumes/Data
map auto_home           0         0         0   100%       0          0  100%   /System/Volumes/Data/home
map -fstab              0         0         0   100%       0          0  100%   /System/Volumes/Data/Network/Servers
```

以下のコマンドで、コンテナがいっぱいだったことがわかった。
66MB、少ない気もするが、使ってないコンテナを削除する。

```
$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          19        14        10.76GB   2.779GB (25%)
Containers      19        0         66.49MB   66.49MB (100%)
Local Volumes   15        14        3.021GB   0B (0%)
Build Cache     227       0         11.8GB    11.8GB
```

ちなみに、dockerの容量確認する前にimageの容量増やしてしまったんだが、減らそうとするとimageとvolume全部消すよって言われたから、増やすときは気をつけて。（別に消してもいいんだけど。）

[Disk utilization in Docker for Mac \| Docker Documentation](https://docs.docker.com/docker-for-mac/space/)
priceのバリデーションを半角数字だけ適応したい

#はじめに
投稿内容に金額（price）を入力する欄を作りました。

しっかり半角数字のバリデーションを定義したのに全角でも入力できてしまったので解消法を投稿します。

#やってしまったミス

```rb
class Review < ApplicationRecord
  with_options presence: true do
    validates :faclity_name, length: { maximum: 40 }
    validates :images
    validates :price, format: { with: /\A[0-9]+\z/ }
  end
end
```

このように`price`に空だと投稿できない、半角数字でなければ投稿できないバリデーションを定義しました。

しかし全角文字でも投稿ができてしまいました。

#解決方法

**数値のみ**というバリデーションがありました。

```
numericality:
```

今回は0円から9,999,999円までまでは投稿できる設定にしたいので以下のように記述しました。

```rb
validates :price, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 9_999_999 },
                  format: { with: /\A[0-9]+\z/ }
```
[AWS]CloudBuildのビルドコンテナからEC2にアクセスしたい


自分メモ用。

## 概要

CloudBuildのビルドコンテナからEC2にアクセスする方法。
前提として、EC2にはIP制限&SSHキーで接続する。

**手順**

1. CloudBuildのビルドコンテナをVPC内で立ち上げる
2. SSMパラメータストアにSSHキー登録する
3. ビルド時にSSHキーを読み込んで接続

## 1. CloudBuildのビルドコンテナをVPC内で立ち上げる

https://buffalokusojima.hatenablog.com/entry/2021/01/16/184926

基本的に上の手順の通り。
CodeBuildのロールにVPCのポリシーをアタッチする必要がある。

## 2. SSMパラメータストアにSSHキー登録する

SSM(Systems Manager)パラメータストアにSSHキー登録。
id_rsa.pub(公開鍵)、id_rsa(秘密鍵)の二つをKMSを利用して登録する。
IAMでCodeBuildのロールにAmazonSSMReadOnlyAccessのポリシーをアタッチする必要あり。

![スクリーンショット 2021-07-12 18.58.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/5425ba65-7beb-d07a-3a41-be5987af59ac.png)

## 3. ビルド時にキーを読み込んでEC2に接続

詳しい手順は以下を参考に。

https://medium.com/@cristiano.ventura/working-with-git-submodules-in-codepipeline-83e843e5d0a

https://qiita.com/sasasin/items/486177194b6063e14b4c

buildspec.ymlを作成

```buildspec.yml
version: 0.2

env:
  parameter-store:
    ssh_key: id_rsa
    ssh_pub: id_rsa.pub

phases:
  build:
    commands:
      - echo "$ssh_key" > ~/.ssh/id_rsa
      - echo "$ssh_pub" > ~/.ssh/id_rsa.pub
      - chmod 0700 ~/.ssh
      - chmod 0600 ~/.ssh/id_rsa
      - ssh USER_NAME@TARGET -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -t -t
```
USER_NAMEはEC2のデフォルトだと`ec2-user`。
TARGETはサブネット間の通信なのでEC2の`プライベートIPアドレス`を指定する。


## (補足)セッションマネージャ使ってCodeBuildのビルドコンテナに接続する

ビルドコンテナの中身に入れると調査に便利。

https://qiita.com/cof123/items/cc6c3b7d22a68ba119d7

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/session-manager.html#ssm.prerequisites


## 最後に
もっと他にいい方法あるよとかあれば教えてください
FASTA status の使い方

<font size="+3" color="#AAA">
[PictBio HP「解析メモ」](https://www.pictbio.com/tips/2945.html)から移行中です。
元記事：2018/10/16 公開 FASTA status の使い方
</font>

　NGS フリーソフトページにて配布中の「FASTA status」の使い方をご説明いたします。

[NGS フリーソフトページ](https://www.pictbio.com/service/distribution)

　このソフトは NGS 解析でよく用いられる配列データファイル形式である FASTA ファイルのデータからステータスを計算します。ここでの説明にはソフトの動作テストと同じ環境である Windows10、Java8 の条件で行っております。

#起動
　このソフトは Java を使用するため、ご使用のパソコンにインストールされていない場合はインストールをお願い致します。

　ダウンロードした JAR ファイルはダブルクリックで起動できます。起動できなかった場合は次のようにします。

1. ファイルを右クリック
2. ひらいたメニューから「プロパティ」を選択
3. 「全般」タグにある「プログラム」の変更を選択
4. 「Java(TM) Platform SE binary」を選択

　「Java(TM) Platform SE binary」　一覧にない場合は「その他アプリ」で追加の一覧を開くか、そこにもない場合は「この PC で別のアプリを探す」で Java をインストールしたフォルダから javaw.exe を選択します。

![jarの起動](https://www.pictbio.com/wp-content/uploads/tips/2945_1.jpg)　プログラムの変更が完了したら、適用→OKの順に選択してください。その後はダブルクリックで開きます。

#ファイルの指定

　画面は以下のように左の設定領域と、右の結果表示領域にわかれています。

![FASTA status画面](https://www.pictbio.com/wp-content/uploads/tips/2945_2.jpg)

　先ずは設定領域にある「FASTA File」の「Select」ボタンを押してください。ファイル選択のダイアログが開くので、FASTA ファイルを選択して「開く」を押してください。

![ファイル選択](https://www.pictbio.com/wp-content/uploads/tips/2945_3.jpg)

#実行

　ファイルを選択したらファイル名が表示されます。左の設定領域にある「Run」ボタンを押すことで実行が行われます。

![ファイル選択後](https://www.pictbio.com/wp-content/uploads/tips/2945_4.jpg)

　計算が完了すると「Successfully completed.」というダイアログメッセージが表示されます。右の結果表示領域にステータスの表と GC 含量と配列長の相関図が表示されます。

![結果の表示](https://www.pictbio.com/wp-content/uploads/tips/2945_5.jpg)

#ファイル出力
　右の結果表示領域にある「Export」ボタンを押すことでファイル出力ができます。

![ファイル出力](https://www.pictbio.com/wp-content/uploads/tips/2945_6.jpg)

　開いたダイアログにファイル名を記入し「保存」ボタンを押すことで出力が実行されます。

![出力ファイル名](https://www.pictbio.com/wp-content/uploads/tips/2945_7.jpg)

　ファイルの作成が完了すると「Exporting completed successfully.」というダイアログメッセージが表示されます。

![出力完了](https://www.pictbio.com/wp-content/uploads/tips/2945_8.jpg)

　output.xlsx は以下のように配列ごとのステータスを見ることができます。

![結果ファイル](https://www.pictbio.com/wp-content/uploads/tips/2945_9.jpg)
「pythonを便利に使おう第四回！行列編！」を参考にWolframAlphaとSymPy Liveでやってみたい。

# original link
https://qiita.com/Garaku49/items/f6550c9ef5cea8576bf1

##WolframAlphaで


####　第一問　行列の計算
https://ja.wolframalpha.com/input/?i=3*Matrix%28%5B%5B1%2C-3%5D%2C%5B2%2C-4%5D%5D%29-2*Matrix%28%5B%5B5%2C6%5D%2C%5B7%2C3%5D%5D%29

結果:
次をお試しください：違う表現や表記法をお使いください。。。。。。。


https://ja.wolframalpha.com/input/?i=3%5B%5B1%2C-3%5D%2C%5B2%2C-4%5D%5D-2%5B%5B5%2C6%5D%2C%5B7%2C3%5D%5D

結果:
(-7 | -21
-8 | -18)

#### 第二問　行列の積

https://www.wolframalpha.com/input/?i=Matrix%28%5B%5B1%2C2%5D%2C%5B3%2C1%5D%5D%29*Matrix%28%5B%5B1%2C2%5D%5D%29&lang=ja

結果:
次をお試しください：違う表現や表記法をお使いください。。。。。。。


https://www.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C1%5D%5D*%5B%5B1%2C2%5D%5D&lang=ja

結果:
(5
5)


https://www.wolframalpha.com/input/?i=%5B%5B1%2C3%5D%2C%5B2%2C4%5D%5D*%5B%5B4%2C1%5D%2C%5B3%2C2%5D%5D&lang=ja


結果:
(13 | 7
20 | 10)


#### 第三問　次のrankを求めなさい。

https://www.wolframalpha.com/input/?i=Matrix%28%5B%5B-1%2C1%2C-1%5D%2C+%5B2%2C0%2C1%5D+%2C%5B1%2C-3%2C2%5D%5D%29&lang=ja

https://www.wolframalpha.com/input/?i=%5B%5B-1%2C1%2C-1%5D%2C+%5B2%2C0%2C1%5D+%2C%5B1%2C-3%2C2%5D%5D&lang=ja

https://www.wolframalpha.com/input/?i=MatrixRank%28%5B%5B-1%2C1%2C-1%5D%2C+%5B2%2C0%2C1%5D+%2C%5B1%2C-3%2C2%5D%5D%29&lang=ja

行列の階数:
2
####第四問　次の逆行列を求めなさい。


https://www.wolframalpha.com/input/?i=%5B%5B1%2C-1%2C-2%5D%2C%5B2%2C-1%2C5%5D%2C%5B1%2C-1%2C-1%5D%5D&lang=ja

https://www.wolframalpha.com/input/?i=%5B%5B1%2C-1%2C-2%5D%2C%5B2%2C-1%2C5%5D%2C%5B1%2C-1%2C-1%5D%5D+%E9%80%86%E8%A1%8C%E5%88%97&lang=ja

https://www.wolframalpha.com/input/?i=inverse%28%5B%5B1%2C-1%2C-2%5D%2C%5B2%2C-1%2C5%5D%2C%5B1%2C-1%2C-1%5D%5D+%29&lang=ja

逆数:
(6 | 1 | -7
7 | 1 | -9
-1 | 0 | 1)



####第五問　次の行列式を求めなさい。


https://www.wolframalpha.com/input/?i=%28%5B%5B-1%2C1%2C3%2C-2%5D%2C%5B-3%2C3%2C5%2C-3%5D%2C%5B3%2C-2%2C-5%2C3%5D%2C%5B2%2C-1%2C-3%2C2%5D%5D%29&lang=ja

https://www.wolframalpha.com/input/?i=det%28%5B%5B-1%2C1%2C3%2C-2%5D%2C%5B-3%2C3%2C5%2C-3%5D%2C%5B3%2C-2%2C-5%2C3%5D%2C%5B2%2C-1%2C-3%2C2%5D%5D%29&lang=ja

行列式:
-1


#SymPy Liveで
以下のソースコードを貼り付けて、Evaluateです。

https://live.sympy.org/



```python
from sympy import *
print("#第一問",3*Matrix([[1,-3],[2,-4]])-2*Matrix([[5,6],[7,3]]))
print("#第二問",Matrix([[1,2],[3,1]])*Matrix([[1],[2]]))
print("#第二問",Matrix([[1,3],[2,4]])*Matrix([[4,1],[3,2]]))
print("#第三問",Matrix([[-1,1,-1], [2,0,1] ,[1,-3,2]]).rank())
print("#第四問第五問 コメント文を見て下さい。")
#第一問 Matrix([[-7, -21], [-8, -18]])
#第二問 Matrix([[5], [5]])
#第二問 Matrix([[13, 7], [20, 10]])
#第三問 2
#第四問第五問 コメント文を見て下さい。
#
# 以下調査中:文字化けしない方法を教えて下さい。よろしくお願いします。
#
# ('#\xe7\xac\xac\xe4\xb8\x80\xe5\x95\x8f', Matrix([
# [-7, -21],
# [-8, -18]]))
# ('#\xe7\xac\xac\xe4\xba\x8c\xe5\x95\x8f', Matrix([
# [5],
# [5]]))
# ('#\xe7\xac\xac\xe4\xba\x8c\xe5\x95\x8f', Matrix([
# [13,  7],
# [20, 10]]))
# ('#\xe7\xac\xac\xe4\xb8\x89\xe5\x95\x8f', 2)
# #第四問第五問 コメント文を見て下さい。
```
【CSS】随時更新！使って便利に感じたCSS

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

* CSSで使いたい機能に出会えていない方


#目的

* CSSを使ってレイアウトを整える助力ができること


###1.resize: vertical;

* 要素の寸法を変更できるかどうか、もしそうなら、どの方向に変更できるかを設定します。

######参照

>https://developer.mozilla.org/ja/docs/Web/CSS/resize


###1.table_bordered, table-borderless

* 要素を表のように整えることができます。
* 前者が線が入った表、後者が線なしの表です。

下記ソースコードです！

````
<table class="table table-bordered">
  <thead>
    <tr>
      <th>#</th>
      <th>First Name</th>
      <th>Last Name</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">1</th>
      <td>Mark</td>
      <td>Otto</td>
    </tr>
    <tr>
      <th scope="row">2</th>
      <td>Jacob</td>
      <td>Thornton</td>
    </tr>
  </tbody>
</table>

````

`````
<table class="table table-borderless">
  <thead>
    <tr>
      <th>#</th>
      <th>First Name</th>
      <th>Last Name</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">1</th>
      <td>Mark</td>
      <td>Otto</td>
    </tr>
    <tr>
      <th scope="row">2</th>
      <td>Jacob</td>
      <td>Thornton</td>
    </tr>
  </tbody>
</table>

`````









※随時更新中！！
CentOS 7にRuby 3.0をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS7にRuby 3.0をインストール
参考：[Quick Start — Software Collections](https://www.softwarecollections.org/en/docs/)

## サポート

本手法で導入した場合、[Red Hat Software Collections Product Life Cycle - Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhscl)より、2024-06がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# yum install -y centos-release-scl
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

# yum install -y rh-ruby30 which
# scl enable rh-ruby30 bash
... 略
```

### 各種確認

```shell-session
# which ruby
/opt/rh/rh-ruby30/root/usr/bin/ruby

# ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-linux]

# yum info rh-ruby30
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * centos-sclo-rh: download.nus.edu.sg
 * centos-sclo-sclo: ftp.nara.wide.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
Installed Packages
Name        : rh-ruby30
Arch        : x86_64
Version     : 3.7
Release     : 2.el7
Size        : 0.0
Repo        : installed
From repo   : centos-sclo-rh
Summary     : Package that installs rh-ruby30
License     : GPLv2+
Description : This is the main package for rh-ruby30 Software Collection.
```
Google OAuth Calendar API サンプルの動かし方


Calendar APIの[PHP Quickstart](https://developers.google.com/calendar/api/quickstart/php)の動かし方の補足説明。

## 必要なもの
* Googleアカウント

## プロジェクト作成 & APIの有効化
* https://console.cloud.google.com/apis/dashboard にログイン
* 「新しいプロジェクト」を作成
* 「APIサービスの有効化」→calendarで検索→「有効にする」

## OAuth Client IDを作成
* 「認証情報を作成」> OAuthクライアントID
* アプリケーションの種類は**「デスクトップアプリ」**を選択する。ここポイント。これ以外にするとサンプルコードを動かした時以下のエラーがでる

```
Uncaught InvalidArgumentException: missing the required redirect URI
```

* 「Oauth同意画面」→**テストユーザーに自分のgamilのアドレスを追加しておく。** これもポイント
* 認証情報のjsonをダウンロードしておく

## コマンドラインでコードを動かす

* 適当なディレクトリでプロジェクト作成し、公式ライブラリをインストール

```
composer require google/apiclient:^2.0
```

* アプリケーショントップに`quickstart.php`を作成し、サンプルコードを貼り付ける
* サンプルを動かす

```
php quickstart.php
```
* 表示されたリンクに飛び、認証する
* 認証コードをコピーしコマンドラインに貼り付ければ完了
テスターとINA226PRCでESP32の消費電力を測定する

# 測定方法
## テスター&INA226PRC
### 電圧
- 回路：並列回路
- 回路図

<img width="531" alt="スクリーンショット 2021-07-05 12.27.58.png (59.0 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/07/05/90647/8defa624-bb24-4619-b86d-49057ef4fbee.png">


### 電流
- 回路：直列回路
- 回路図

<img width="519" alt="スクリーンショット 2021-07-05 12.28.06.png (52.3 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/07/05/90647/beb5f6c3-58ae-41bf-bafc-2d2aebf1bbb5.png">


# 実測
## ESP32
### テスター
- 電圧値：5.177V
<img width="1108" alt="S__8953868.jpg (371.7 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/07/12/90647/41244904-f8f6-441b-abff-d3a08ca0f474.jpg">



- 電流値：0.37mA
<img width="1108" alt="S__8953870.jpg (329.7 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/07/12/90647/ea3f07e1-824c-4dbe-9796-ffa6992bfa1a.jpg">

- 電力:1.91mW

### INA226PRC
- 電圧値：5.177V
- 電流値：0.39mA
- 電力：2.019mW

![スクリーンショット 2021-07-13 18.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/739843/86f01671-a662-2349-ba55-8855649cdc05.png)
PHP serverで「Not Found The requested resource / was not found on this server. 」が出たときの対処法

VSCodeで、PHP serverを使用して
ローカルホストでPHPファイルを確認しようとしたところ、
下記のような画面になりました。

![スクリーンショット 2021-07-12 18.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952495/9b25f47d-e594-37e9-f02f-f492517bce11.png)


「Not Found The requested resource / was not found on this server. 」
と出ています。


コンソールを見てみると、
「Failed to listen on localhost:3000 (reason: Address already in use)」
というエラーが出ていました。


## 前回きちんとstop serverせず終了したのが原因

前回何らかのPHPファイルをローカルホストで確認したのを
きちんとプロセス終了せずに終わってしまったのが原因でした。
今立ち上げているPHPを終了させる必要があります。


## 解決方法

①ターミナルで、下記コマンドを実行。

```
$ ps -f
```

すると現在起動されているプロセスが表示されます。

![スクリーンショット 2021-07-12 18.30.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952495/b83a09e6-0c35-f2ab-28fc-ddd7f032465d.png)

この「PID」の部分の数字を確認。

②ターミナルで、下記コマンドを実行。

```
$ kill -9 PID
```

PIDの部分を数字に入れ替える。


上記コマンド実行で、問題なくPHP serverでファイルが確認できるようになりました！！





いつもきちんと終了させているつもりなのですが
たまに忘れてしまってますね。。
気をつけたいと思います(・_・;;)
gitでブランチを間違えたまま作業を進めてしまった時の対処方

意気揚々と作業を進め、いざコミットしよう！という段で「ブランチ間違えてた！」ということはよくあると思います。
そんな時の簡単な対処法を紹介します。

## 前提
- 開発用ブランチは develop
- develop にコミットしようとした内容を master ブランチで作業してしまった
- master に影響がないように差分を develop だけにコミットしたい

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83110/10655f8e-6c41-2059-7566-c130e15c4379.png)
※こんなに作業したのにブランチを間違えて台無しだよ..の図

## 対処法

#### 行った作業を一旦退避させる

行った作業を一旦退避させるには下記コマンドを利用します。

```
git stash -u
```
※-u は Untracked（新規ファイルやリネームしたディレクトリ等）を含める場合に付与します）
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83110/c09b94a6-aaaa-4487-b11b-5deb7351be1b.png)
コマンド実行後、作業途中の差分が保存された旨とその時点での最新のコミットが表示されます。

#### 退避させた作業を一覧表示する

git stash で退避させた作業を一覧で見るには下記コマンドを利用します。

```
git stash list
```

先程退避した内容が出てきます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83110/88466714-1dd6-c2ad-e179-3c0320ec3a7b.png)
「WIP」とは Work in Progress（作業中）の略で、上記のメッセージを簡単に訳すと「masterブランチのコミットハッシュa978947のコミット上で作業中」と記載されているのがわかります。
git stash コマンドを使用する度にこのリストに作業が追加されていきます。

#### 退避させた作業を別のブランチに適用する

退避させた作業を適用させたいブランチに移動します。

```
git checkout develop
```
ここでは develop へ適用させたいので develop へ移動し、下記コマンドを実行します。

```
git stash apply
```
apply は「適用」という意味を持つのでそのままですね。

このコマンドを実行した結果、develop ブランチに、最初に master ブランチで行った作業と同じ差分が適用されました。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83110/7c522930-0328-32c6-005a-a806612a3717.png)
忘れずにコミットしておきます。

#### 退避した作業を削除する

git stash で作業を退避させる度に退避領域に作業がどんどん溜まっていくため、apply コマンドで適用する際に誤った作業を適用してしまうことを避けるために、余程の複雑な作業を行っていない限り退避領域はきれいにしておきたいです。

退避領域に保存されている作業を一括で削除するには下記コマンドを利用します。

```
git stash clear
```
下記を見ると、1回目のリスト表示で表示されていた作業が、clear 後に削除されていることがわかります。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83110/47598a7c-4596-ab9d-e02e-516dca267848.png)

これで何事もなかったように develop で作業出来ます！gitありがとう！