OmniAICreator/Qiita-1.07M huggingface dataset:
WSL上でPythonをインストールする

# やりたいこと
WSL上のUbuntuにPythonをインストールしたい。

# 環境
OS: Windows10 Enterprise / Ubuntu 20.04 LTS

# WSLの設定方法
以下の記事にまとめているのでどうぞ。他にも検索すれば色々と出てくる。

https://qiita.com/tennis_lover/items/66ebdaebee645b6b2c01

# パッケージの更新
インストールしたUbuntuを起動する。Windwsのスタートメニューから`ubuntu`で検索するとインストールしたUbuntuが出てくるはず。
初回起動時には初期設定が行われるので、ユーザ名とパスワードを設定する。その後、以下コマンドでパッケージリストの更新とアップデートを行う。

```
sudo apt update      # パッケージリストの更新
sudo apt upgrade -y  # パッケージのアップデート
```

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

```
sudo apt install python3 python3-pip -y  # python3とpip3のインストール
sudo pip3 install pip -U                     # pip3の更新
```

バージョン確認して表示されれば正しくインストールされている。

```
python3 -V  # 環境によっては、python3 -> python の場合もある
pip3 -V     # 環境によっては、pip3 -> pip の場合もある
```

`python3`と実行すると対話モードでPythonが起動します。`print('test')`と書いてEnterを押すと`test`と表示されるはず。
終了するときは`exit()`で。


以上です。
ネットワークエンジニアがアウトプットをレビューするうえで必要の資料

#ネットワークエンジニアってそもそも何を作っているのか
ネットワークシステムに関する資料だったりルータやスイッチのconfigを作成しています。
当たり前ですね(笑)
ネットワークエンジニアというくくりにもいろいろな扱いがあって、それこそセキュリティ周りをやっていることもあればサーバやOA端末もまとめてやっている人もいるかと思いますが、今回の記事は「ネットワーク」に限定したいと思います。
大体下記をレビューするときの参考にしてもらえればと思います。
・config (ルータやスイッチ、GUIで設定を変えるものであれば用意不要の場合有）
・作業手順書
・パラメータシート
・ポート収容表
・ラック構成図
・IPアドレス台帳
・機器台帳

私が様々な資料を作成してレビューしてたくさんダメ出しを受けたり、褒められたりした経験を踏まえてお伝えいたします。

#レビューに必要な資料3点
①ネットワーク構成図
②通信要件表
③スケジュール

##その①　ネットワーク構成図
一番大事です。ほぼすべての資料を説明するうえでの必須の資料と考えています。
まずは全体像をつかんでもらうために全体の「どこの部分」のレビューなのかを明確に伝える必要があります。
用意した構成図に対して作業対象箇所を赤丸で囲むことや、吹き出しをつけること、経路を書き込むなど加筆するもの様々です。
視覚的にわかりやすく説明をするためには既存の構成図に対して情報を書き加えるのがよいと思います。


例えば、
・config (ルータやスイッチ）/作業手順書　→どこの作業をする上でのものなのか
・パラメータシート　→どの機器のパラメータシートなのか
・通信要件表　→どの経路を指しているのか
・ポート収容表/ラック構成図/IPアドレス台帳　→どこにある機器なのか


こうすることで、ここの機器は対象じゃないんだっけ、とか、この経路でいいんだっけなど「資料単体」だったら見えてこない部分まで見ることができ、より良いレビューをすることができます。


あれ、じゃあそのネットワーク構成図はどこからもってくるの？と思うかもしれませんが、
基本的には方式設計書や基本設計書を作成するタイミングで要件が出てきますのでそれをもとにネットワーク構成図を作成しています。
たまーーーにない場合があります。システムによりけりですね。
そういう場合はリバースエンジニアリングをしてネットワーク構成図を作成します。
めんどくさいかと思いますがあって損はまずしないです。トラブル発生時の切り分けにも使えたり、維持管理資料としても利用できます。


1から丁寧に作成する時間がない！という場合には概要図でもOKです。
私はもともとあるネットワーク構成図のほかに簡易的な概要図も合わせて作成してするケースが多々あります。
全体を見渡すのが大事なのでそこだけはおさえておくとよいと思います。



★余談ですが、新人研修では物理構成図と論理構成図を別々に作成する、ということを教えられていた記憶があります。業務を通して別々で作るメリットをあまり感じられなかったので、私個人的には物理＆論理でまとめて1つで作成してしまうことがほとんどです。
機会があれば構成図の書き方についてもQiitaに残しておきたいですね。


##通信要件
主にインプット情報になるものです。
色々なネットワークシステム基盤を見てきましたが大体の通信要件表というものは以下で構成されていると思います。
・送信元IP,送信元NAT-IP,送信元ポート番号
・宛先IP,宛先NAT-IP,宛先ポート番号
　※もちろんNATの有り無しは要件によりけりです。

これ無くして用意できないものは多々あります。
・config　⇒通信要件が無いと作れない
・作業手順書　⇒上記同様
・パラメータシート　⇒上記同様
・ポート収容表　⇒新しいケーブル接続が無い場合であれば不要
・ラック構成図　⇒新しい機器を導入しない場合であれば不要
・IPアドレス台帳　⇒新しいIPアドレスを払い出さなければ不要
・機器台帳　⇒新しい機器を導入しない場合であれば不要

○○という要件があるから××とういうアウトプットを作成した、なのでそのレビューをしたい。
という流れが基本だと思います。
あいまいに要件をもらっていたり、それこそテキストベースやメールベースで簡単に要件をもらっている場合、そのまま利用するのではなく、きちんと「通信要件表」まで昇華させ、活用してみるが良いと考えております。

##スケジュール
そのレビューする資料はいつまでに作成するのかを明確にするための資料となります。
「ネットワークに限定しない資料じゃん！」
はい、おっしゃる通りですが、今回はネットだけではなく全体を見渡せるようにするための資料として必要と考えていただければと思います。
私の経験上、ネットワークシステム単体でリリースが成立することは少ないです。
例えばネットワーク構築後に今度はサーバの基盤総合テストをやったり、アプリテストをやったりとその後のアクションが多いです。
その場合、ネットワークのいつまでに実施しなければならないと言う日程と後続のスケジュールはどうなっているのかを確認しておくことがポイントになってきます。
どうしてもその日までに準備ができなかった場合、どう言う後続の作業に影響するのか、どの程度の日程までなら影響しないのか、レビュー時に確認しておくと流れとしてイメージしやすくなります。

##あれこれまとめ
ここまでずらずらっと書きましたが、数をこなして慣れを作る必要もあれば、その企業やシステムの特異な文化が強く根付いてしまっているとどうしても偏りが生じてしまい、その特性に合わせて対応しなければならない場合があると思います。

そんな中でも品質の高いものを作りたい、リリース作業は絶対失敗したくない、今後のことを考えて維持管理していく資料は大事にしたい、などの気持ちは共通しています。

ここに書いたものは1つの意見としてとらえ、今後のネットワークエンジニアとしての生活をより良いものしていただければ幸いです。
【KARTE】接客に含まれるhtml要素に向けてclickイベントを発火させたい！

KARTE上で接客を実装するにあたり、試行錯誤したので備忘録

## 想定する読者
KARTE / jqueryに詳しくない人向け

## 何がしたいか
接客に含まれる要素にクリックイベントを付与したい

## 問題
* cssで指定した要素が操作できない
* .on('click')でシンプルに発火しない

## どうしたのか
* karte側で用意されているstylesオブジェクトを利用した

https://developers.karte.io/docs/understand-css-modules

* documentオブジェクトに直接定義した

jquery

```
    $(document).on('click', "."+styles["className"], function(){
        clickMethod();
    });
```
[CSS] 入力フォームの青い枠線を消す

##はじめに
入力フォームを作成していて、特に問題はないのですが、デフォルトで入力しようとした時に、クリックすると変な青い枠線が出てくるんですよね。

非常に気になる。。。

今回はその枠線消す方法を調べたので残しておきたいと思います。
よろしくお願いします。

##修正したいこと

文字じゃ伝わりにくいかもしれないので、私のオリジナルアプリで状況をお伝えします。
このような入力フォームがあるとします。↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/aa4e532c-5888-6fa9-6fea-97de532969da.png)


これをですね、入力しようと思ってクリックすると↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/dd8ccd2d-1113-a84c-84da-a760fb462ac1.png)

こんなふうに青い枠線が出てきます。
なんかめっちゃ気になったんですよね。

##修正方法
これはデフォルトでinput要素やtextarea要素についているoutlineというプロパティの影響らしいです。

outlineて何ぞ！？笑

って感じでしたが、inputやtextarea, select要素などに使用するとフォーカス状態の時に輪郭線を指定できるプロパティらしいです。

今回はこいつがいらないので```none```で消しちゃいます。

```css
input,
textarea {
  outline:none;
}
```

これだけ。
ちゃんと枠線が消えました！


##最後に
outlineは使ったことなかったのですが、クライアントとしてwebサービスを使っている時はそういえばなんか青い線出てくるなと思いました。

状況に応じて必要ない時は消せるのですね。
とりあえず設定すること

# いつも最低限設定している内容です。

# bash

```command:command
wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
```

``` bash:.bashrc
alias ls='ls -al --color=auto'
alias ps='ps -ux'
alias df='df -h'
export HISTSIZE=100000
export LANG='ja_JP.UTF-8'
export LC_ALL='ja_JP.UTF-8'
export LC_MESSAGES='ja_JP.UTF-8'

# Git
if [ -f ~/git-completion.bash -a -f ~/git-prompt.sh ]; then
  source ~/git-completion.bash
  GIT_PS1_SHOWDIRTYSTATE=1
  source ~/git-prompt.sh
  PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
fi
```
# vim

``` bash:.vimrc
set number
set cursorline
set laststatus=2
set tabstop=4
set shiftwidth=4
```
# git

- .gitconfigファイルを直接編集してもいいが、ここではgit configを使って設定している。

``` bash:.gitconfig
git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"
git config --global core.editor 'vim -c "set fenc=utf-8"'
git config --global core.autocrlf false
git config --global core.quotepath false
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
git config --global alias.logs "log --decorate --graph --branches --tags --remotes"
```

# tmux

``` bash:.tmux.conf
set-option -g mouse on
```
自分的GitHub入門

# はじめに

今更ながらコードバージョニングや分散開発の勉強を始めています。
これまでは個人の勢いでそのときどきの課題を爆速で解くことに注力していればよかったですが、
・同僚に技術移転を行うこと（またはその逆）
・再現性を高めること
・長期的に自身の開発効率を高めること
が求められるフェーズに来ています。
GitHubにこだわるわけではないものの、ここから入って自分や自分のチームにあったやり方を模索していきたい考えです。

ここでやる方法は王道とは言えないかもしれませんが、私自身にとってやりやすい方法を書き残しておきます。

# ローカルリポジトリへの登録＆リモートリポジトリへの反映

1. github.comにおいてrepositoryを作成する。
![スクリーンショット 2021-07-11 15.36.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267549/21ff536c-bd66-9939-fd42-9f2434ecd6c7.png)

2. PCでレポジトリのcloneを行う。
```$ git clone ***.git```

3. ローカルのブランチを確認。
```$ git branch```
mainブランチのみが存在している。
以前はmasterがデフォルトのブランチ名であったが、2020年10月よりmainがデフォルトとなった。
https://www.publickey1.jp/blog/20/githubmainmastermain.html

4. 作業用ブランチとしてbranch1ブランチを作成する。
```$ git branch branch1```

5. ここからbranch1で作業していく。
```$ git checkout branch1```

6. test.txtを作成する。
なお、フォルダ単体をgithubにプッシュするのは面倒である。
ローカルでフォルダを作成し、その中でファイルを作成し、そのファイルをコミット、プッシュすると、github上にフォルダも登録される。
https://qiita.com/tommy_aka_jps/items/b2ae85cbeab77e12a925

7. 変更を加えたファイルをインデックスに追加する。
```$ git add test.txt```

8. インデックスの内容をローカルリポジトリに反映させる。
```$ git commit -m "test.txt is added."```

9. コミットした内容をgithubにプッシュする。
```$ git push origin branch1```

10. githubのbranch1ブランチで変更が反映されていることを確認。
![スクリーンショット 2021-07-11 15.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267549/507b1b65-f6d9-8355-11cd-97b65b70e6c2.png)

# ブランチの信頼性が十分に確認できたらmainにマージしてプッシュする

1. ローカルブランチをmainに変更
```$ git branch main```

2. branch1の内容をローカルのmainに反映する
```$ git merge branch1```

3. リモートのmainにマージした内容をプッシュする。
```$ git push origin main```

4. githubのmainで変更が反映されていることを確認。

# 参考文献

・【GitHub超初心者入門】この前初めてGitHubを使い始めたエンジニア見習いが書くGitHubの使い方と実践～とりあえず一緒に動かしてみようぜ！～
https://qiita.com/nnahito/items/565f8755e70c51532459
Spring Bootのgradlewコマンドの簡単な使い方

## 概要
[spring initializrで生成したプロジェクト](https://qiita.com/Esfahan/items/3add9a27feb5f4b032c1)には、gradlewというファイルが付属している。これは開発でGradleを使うためのWrapperで、アプリケーションをビルドしたり実行することができる。このコマンドの基本的な使い方を説明する。

また、Gradleがインストールされていない環境でも、このファイルがあればビルド、実行をすることが可能。


## 関連
- [spring initializrでSpring Bootプロジェクトを生成してIntellijに取り込む](https://qiita.com/Esfahan/items/3add9a27feb5f4b032c1)

## gradlew build
build.gradleがある階層でこのコマンドを実行するとbuildが実行され、build/libs/の下にjarファイルが生成される。

buildする。

```
$ gradlew build
```

生成されたファイルを実行すると、localhost:8080でページにアクセスできる。

```
$ java -jar build/libs/helloworld-0.0.1-SNAPSHOT.jar 
```

## gradlew bootRun
前項のbuildと実行をまとめてやってくれるのがこのコマンド。bootRunを実行してlocalhost:8080にアクセスするとページを閲覧できる。

```
$ ./gradlew bootRun
```

## gradlew clean
このコマンドを実行すると、buildされたファイルを削除することができる。

build

```
$ gradlew build
$ ls -1 ./build
bootJarMainClassName
classes
generated
libs
reports
resources
test-results
tmp
```

clean

```
$ ./gradlew clean
$ ls ./build
ls: ./build: No such file or directory
```

buildディレクトリごと削除される。


## 参考
- [gradlewコマンドでSpring BootのWEB画面用アプリをビルドし実行してみた](https://www.purin-it.com/gradlew-build)
【React Native】React Native の基本【備忘録】

# React Native とは

### React Nativeとは

iOS と Android との__異なるプラットフォーム__のプロジェクトを、
__共通のコード__で開発できるようにしたライブラリである。
[__React__](https://reactjs.org/) と同様に __Facebook__ がオープンソースで開発をしている。

# 主要な Components

各プラットフォームの対応表↓

| React Native UI | Android | iOS | Web | 詳細 |
|:-:|:-:|:-:|:-:|:-:|
| `<View>` | `<ViewGroup>` | `<UIView>` | `<div>` | 色々な仕様を適用できる"箱" |
| `<Text>` | `<TextView>` | `<UITextView>` | `<p>` | 文章などを表現する |
| `<Image>` | `<ImageView>` | `<UIImageView>` | `<img>` | 画像を表現する |
| `<ScrollView>` | `<ScrollView>` | `<UIScrollView>` | `<div>` | スクロール可能な「箱」 |
| `<TextInput>` | `<TextEdit>` | `<UITextField>` | `<input type="text">` | ユーザーが入力可能 |

# React の基礎知識

## Components

### コンポーネントとは

UI について、__独立した再利用できる部品__に分割する。
それによって、部品それぞれを__分離して考える__ことができるようになる。
__生産性やコード可読性の向上__に大きく貢献する。
※2021年7月現在は、関数コンポーネントでの記述が推奨されている[^1]。

[^1]: [関数コンポーネントを使うべき理由](https://tyotto-good.com/blog/reaseons-to-use-function-component)

以下は例↓

```React:Cafe
import React from 'react';
import { Text, View } from 'react-native';

const Cat = (props) => {
  return (
    <View>
      <Text>Hello, I am {props.name}!</Text>
    </View>
  );
}

/* 部品の再利用 */
const Cafe = () => {
  return (
    <View>
      <Cat name="Maru" />
      <Cat name="Jellylorum" />
      <Cat name="Spot" />
    </View>
  );
}

export default Cafe;
```

## JSX

__JavaScript 内に記述可能__な文法である。
※最終的に JavaScript に変換される。

## Props

コンポーネントをカスタマイズできる__読み取り専用の__プロパティである( properties の省略形)。

React には1つだけ厳格なルールがある。

> 全ての React コンポーネントは、
自己の props に対して__純関数__のように振る舞わなければならない。
[React公式](https://reactjs.org/docs/components-and-props.html#props-are-read-only)

ここでの純関数とは、以下の関数を指す。

* 入力されたものを__変更しようとせず__、同じ入力に対して同じ結果を返す __「純粋 (pure)」__ な関数

## State

State は、何度も変更されたり、
ユーザーとの対話的やり取りを扱うのに便利である。
コンポーネントのプライベートなデータストレージのようなものである。

以下は例↓

```React:Cafe
import React, { useState } from "react";
import { Button, Text, View } from "react-native";

const Cat = (props) => {
  const [isHungry, setIsHungry] = useState(true);

  return (
    <View>
      <Text>
        I am {props.name}, and I am {isHungry ? "hungry" : "full"}!
      </Text>
      <Button
        onPress={() => {
          setIsHungry(false);
        }}
        disabled={!isHungry}
        title={isHungry ? "Pour me some milk, please!" : "Thank you!"}
      />
    </View>
  );
}

const Cafe = () => {
  return (
    <>
      <Cat name="Munkustrap" />
      <Cat name="Spot" />
    </>
  );
}

export default Cafe;
```

# Expo CLI と React Native CLI

## Expo CLI
Expo は何かを準備しなくても、すぐにネイティブアプリを作成できる。
ネイティブアプリ開発が初めてでも、気軽に始められる。
アプリの機能は Expo のエコシステム内に限られる(とはいえ日々機能が拡大・追加されている)。

## React Native CLI
Xcode か Android Studio のインストール・設定が必要である。
ネイティブアプリ開発に慣れていれば、すぐに始められる。
大規模なアプリ開発向けである。

# まとめ

* クロスプラットフォーム開発の選択肢の1つ
* React に慣れている人はすぐに始められる
* 開発環境には、以下の2つの選択肢がある<br>
○ Expo CLI<br>
○ React Native CLI<br>


# 参考

[React](https://reactjs.org/)
[React Native](https://reactnative.dev/)
Vuetify3.0Alphaを試してみた

# 概要

Alpha版がでてvue3でのvuetifyを試せるようになったので、確認のためのお試しのメモ。
ドキュメントも仮で日本語化されている。

## viteインストール

nextドキュメントの[アルファ版インストール](https://next.vuetifyjs.com/ja/getting-started/installation/#vite)に従って、今回はvite利用パターンにしてみた。

vue/cliが古いままだったので、最新版に更新し、ドキュメントどおりにプロジェクト作成

```
> npm install -g @vue/cli
> npm init @vitejs/app vuetify3viteProject --template vue

> cd vuetify3viteProject
> vue add vuetify

> npm install
> npm run dev
```


### 起動直後のスクリーンショット

viteのおかげか起動はやい。

```bash
vite v2.4.1 dev server running at:

  > Local: http://localhost:3000/
  > Network: use `--host` to expose

  ready in 307ms.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23242/7fbb5e87-a170-5098-1ea7-78ee365d4026.png)


## 変更されたところ

### 初期化プロセス変更

vue2/Vuetify2.xのころ`new Vue({vuetify}).$mount('#app')`みたいにしていた処理が変わってる。

```javascript:main.js
import { createApp } from 'vue'
import vuetify from './plugins/vuetify'
import App from './App.vue'

const app = createApp(App)
app.use(vuetify)

app.mount('#app')
```

### Hello World

実際どのへんが変わったのかとHelloWorld.vueをみると、ほとんど変わってない。
(追記： 廃止されたはずのcontainプロパティとかでてるので、まだメンテナンスされてないだけっぽい)

[アルファリリースノート](https://next.vuetifyjs.com/ja/getting-started/v3-alpha-release-notes/#current-changes)で関係ありそうなところをざっくり見ていくと、各コンポーネントよりもレイアウトとかグリッドシステムまわりが大きくかわったっぽい。

とりあえず手軽に試せそうなところから雑にHelloWorld.vueに追記した。

### V-Btn

大きさ指定がsizeプロパティに代わった。
これはそもそもSizeの概念にdefaultってのが増えたってことなんかな。

```javascript:HelloWorld.vue(抜粋)
    <v-row>
      <v-col>
        <h2>てすと</h2>
        <v-btn v-for="(size,i) in sizes" :size="size">{{i+1}} : {{size}}</v-btn>
      </v-col>
    </v-row>
...
  data: () => ({
    sizes: ['small', 'default', 'large', 'x-large'],
...
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23242/26abfcc3-ba12-832d-51ef-652fd71d5610.png)

### V-Image

containがcoverに変更?
これはv2.5あたりから変わらずだったやつかな？　左右切らずになるべくコンテナ埋める的な。

```javascript:HelloWorld.vue(抜粋)
        <v-img
          cover
          :src="logo"
          class="my-3"
          height="200"
        />
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23242/fa9b21af-e2af-400a-9a3a-2e6956e4eb41.png)

### Grid

[Display Composable](https://next.vuetifyjs.com/ja/features/display-and-platform/)なるものが増えてる(?)っぽいので、そのあたりはあとで確認する。

廃止予定だったv-layout等(v1.5風の書き方)がついになくなったぽい。
グリッドクラスに v- プレフィクスがついたってどれのことだろう。
WSL→WSL2への変更方法

# やりたいこと
社内のPCがWindows10だけど、Linux系のコマンドを使えるようにしたい。

# 環境
OS: Windows10 Enterprise / Ubuntu 20.04 LTS

# WSLの有効化とWSL2への変更手順およびUbuntuのインストール
Microsoftの公式ページ: https://docs.microsoft.com/ja-jp/windows/wsl/install-win10 を参考にした。
手順1～6を行えば良い。WSL2ではなくWSLを使うならこの手順1だけを行い、手順6へ。

ちなみにWSLとWSL2の違いはこの辺に。基本的にWSL2を使った方が良いよ、くらいでしか理解していない。
https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions
https://www.pc-koubou.jp/magazine/40465

以上です。
マルチスレッドのイベント制御

デスマッチ（KeyboardInterruptまで戦う）

```python
import threading
import time
import sys

event = threading.Event()

def minamikawa(name):
    '''
    flag=True: 防御状態
    flag=False: 攻撃状態
    '''
    count = 0
    event.set()  # 初期値は青信号
    while True:
        if 5 < count <= 10:
            event.clear()  # 体力回復 攻撃状態へ
            print("\33[41;1m[{}]ラッシュ...\033[0m".format(name))
        elif count > 10:
            event.set()  # 体力切れ 防御状態へ
            count = 0
            print("\33[41;1m[{}]体力切れ...\033[0m".format(name))
        else:
            print("\33[41;1m[{}]防御...\033[0m".format(name))

        time.sleep(1)
        count += 1

def shibata(name):
    while True:
        if event.is_set():  # 相手が体力切れかどうか
            print("\33[42;1m[{}] 攻撃...\033[0m".format(name))
            time.sleep(1)
        else:
            print("\33[42;1m[{}] 防御...\033[0m".format(name))
            event.wait()
            # flag=Trueになるまでここでブロッキングする
            print("\33[42;1m[{}] 反撃開始...\033[0m".format(name))


systema = threading.Thread(target=minamikawa, args=("MINAMIKAWA",))
#mainが終了したらスレッドが終了するようにデーモン化
systema.setDaemon(True)
systema.start()

prowrestling = threading.Thread(target=shibata, args=("SHIBATA",))
#mainが終了したらスレッドが終了するようにデーモン化
prowrestling.setDaemon(True)
prowrestling.start()

try:
    while True:
        time.sleep(1)
        print('Fight!!\n')
except KeyboardInterrupt:
    print('!!FINISH!!')
    sys.exit()
```
bashかzshによってPATHを追加する場所が違う

#問題
Ruby on Railsの環境構築の際に、PATHを.bash_profileに記述しているのにも関わらずエラーが起きていた。
#解決
原因はシェルがzshだったため、そもそも.bash_profileを参照していなかった。
bashやzshがそもそも、なんなのかを理解していなかった。
zshからbashにシェルを変えたら問題なく通った。
別に、bashにしなくてもzshの状態で.zshrcに書けば問題ないと思う。

#追伸
コメントにてご教授頂きました。
.bash_profileではなく.bashrcに設定を書き、その.bashrcを.zshrcから読むようにするのがおすすめだそうです！　また、.bash_profileは初期設定のままの方が良いそうです。
ありがとうございました。
[Python] 2部グラフ ABC209D

#[ABC209D](https://atcoder.jp/contests/abc209/tasks/abc209_d)
当内容は、[他サイト](https://yunix-kyopro.hatenablog.com/entry/2021/07/11/020240?_ga=2.121161536.9506465.1625937519-1301098457.1625937519)を参考に自分用に編集したものです。


```python:サンプルコード
from collections import deque

def main():
    [N, Q] = [int(x) for x in input().split()]

    # グラフの初期化
    graph = [[] for _ in range(N+1)]
    for _ in range(N-1):
        [a, b] = [int(x) for x in input().split()]
        graph[a].append(b)
        graph[b].append(a)

    # 深さを記録するリスト
    depth_vec = [-1 for _ in range(N+1)]

    # 1を根とする根付き木を作り、各頂点の深さを記録する
    queue = deque()
    queue.append((1, 0))
    while len(queue) > 0:
        (node, depth) = queue.pop()
        depth_vec[node] = depth
        for child in graph[node]:
            if depth_vec[child] >= 0:
                continue
            queue.append((child, depth+1))

    # クエリに解答する
    for query in range(Q):
        [c, d] = [int(x) for x in input().split()]
        if (depth_vec[c] + depth_vec[d]) % 2 == 0:
            print("Town")
        else:
            print("Road")


if __name__ == "__main__":
    main()
```
AtCoderログ：0014 - ABC 209 A

# 問題：[ABC 209 A - Counting](https://atcoder.jp/contests/abc209/tasks/abc209_a)

## 問題文
> $A$ 以上かつ $B$ 以下の整数はいくつありますか？

## 制約
> ・$1 \le A \le 100$
> ・$1 \le B \le 100$
> ・$A,B$ は整数である。

# 回答1 (AC)

$1$ 以上 $N$ 以下の整数の個数は $N$ 個なので、$A$ 以上 $B$ 以下の整数の個数は「($1$ 以上 $B$ 以下の整数の個数) - ($1$ 以上 $A-1$ 以下の整数の個数)」と考えて、$B-(A-1)$ 個となります。条件から $A>B$ の場合もあり得るので、この場合は $0$ 個を答えるような場合分けが必要となります。計算量は $O(1)$ です。
私が ABC 209 に参加したときの[提出コード](https://atcoder.jp/contests/abc209/submissions/24114365)は同じ方針でしたが、$A>B$ の場合を見逃していて誤答を繰り返してしまいました。

```C++:abc209a-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int a, b;
  cin >> a >> b;
 
  if ( a>b ) {
    cout << 0 << endl;
  } else {
    cout << b-a+1 << endl;
  }
}
```

# 回答2 (AC)

for 文を使って整数の個数を素直に数える方法も考えられます。この場合、$A>B$ のときには for 文が実行されないだけなので、回答1のような場合分けは不要です。コードは以下のようになりますが、計算量は $O(B-A)$ となってしまうため、$A, B$ の値が巨大な場合にはうまくいかない可能性があります。

```C++:abc209a-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int a, b;
  cin >> a >> b;
 
  int integer = 0;
  for ( int i=a; i<=b; i++ ) {
    integer += 1;
  }
  
  cout << integer << endl;
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc209/tasks/abc209_a/editorial) → [公式解説](https://atcoder.jp/contests/abc209/editorial/2226)
回答1と同じ方針でした。max(0,b-a+1) とすると場合分けが不要になるとのこと。なるほど。

# リンク
- 前のログ → [AtCoderログ：0013 - ABC 209 に参加しました](https://qiita.com/RoadLynton/items/2a732766771f067b4edf)
- 次のログ → [AtCoderログ：0015 - ABC 209 B](https://qiita.com/RoadLynton/items/bada7fcc7741dd563775)
Dockerコンテナ内でllコマンドを使う

Dockerfileに以下のRUNコマンドを追記するとコンテナの中でもllが使える。
--colorがないと白黒になるので一緒に書いた方が便利。

```Dockerfile
FROM php:7.4-apache

RUN echo -e "\n\
alias ll='ls -la --color'\n\
" >> /root/.bashrc
```
node.jsのasync/awaitを簡単に説明する

# 非同期処理とは？

非同期処理は実行待ちの間に別の処理を実行することができる。

```https://www.rworks.jp/system/system-column/sys-entry/21730/#:~:text=%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%81%A8%E3%81%AF%E3%80%81%E4%B8%80,%E3%81%AA%E8%A6%81%E7%B4%A0%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82
非同期処理とは、一つのタスクを実行中であっても他のタスクを実行できる実行方式をいいます。
```

# javascriptは非同期処理である

javascriptは非同期処理であるため、プログラムの順番通りには処理は完了しない。

```https://book.impress.co.jp/books/1120101055
Javascriptでは、時間のかかる処理は常に「非同期」(asynchronous)である。
```

# 非同期処理と同期処理を比較する

まずは非同期処理の例

```javascript
async function sleep(t) {
    return await new Promise(r => {
        setTimeout(() => {
            r();
        }, t);
    });
}

async function myAsync() {
    await sleep(1000)
    console.log("2nd")
}
function test() {
    console.log("1st");
    const second = myAsync()
    console.log("3rd")
}
test()
```

出力

```
1st
3rd
2nd
```

このようにsleepで処理を待機させるため、"2nd"が出力される前に"3rd"を出力しています。

次に同期処理の例

```javascript
async function sleep(t) {
    return await new Promise(r => {
        setTimeout(() => {
            r();
        }, t);
    });
}

async function myAsync() {
    await sleep(1000)
    console.log("2nd")
}
async function test() {
    console.log("1st");
    const second = await myAsync()
    console.log("3rd")
}
test()
```

出力

```
1st
2nd
3rd
```

awaitで"2nd"の処理が実行されるまで待機してくれる。そのため、"1st","2nd","3rd"という順に出力されるようになる。

# 参考サイト
https://blog.serverworks.co.jp/async-await
Seleniumで新しいタブを開く --メモ--

ログインした後などに、他のページを開きたいときがある。

```csharp
//ログイン処理
.
.
.
driver.ExecuteScript("window.open()");
var handle_1 = driver.WindowHandles[1];
driver.SwitchTo().Window(handle_1);
driver.Navigate().GoToUrl("行きたいページ");
```

ログイン直後のページとは別に、二つ目のタブで新しいURLが開かれている。
AtCoderログ：0013 - ABC 209 に参加しました

#  結果
- 得点：600
- 時間：32:50 (= 22:50 + 05:00 × 2)
- 順位：4308 / 8758
- パフォーマンス：584　
- レーティング：23 → 86 (暫定)
- 段級位：14級 → 12級

![2021-07-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1589302/97c8257f-a91a-5437-139c-0ed4a385b10e.png)

# 詳細
|問題|得点|時間|提出コード|復習|
|:--:|:--:|:--:|:--:|:--:|
|[ABC 209 A](https://atcoder.jp/contests/abc209/tasks/abc209_a)|100|06:30 (2)|[○](https://atcoder.jp/contests/abc209/submissions/24114365)|[AtCoderログ：0014](https://qiita.com/RoadLynton/items/ad080d4b17ce17424c29)|
|[ABC 209 B](https://atcoder.jp/contests/abc209/tasks/abc209_b)|200|11:45|[○](https://atcoder.jp/contests/abc209/submissions/24119592)|[AtCoderログ：0015](https://qiita.com/RoadLynton/items/bada7fcc7741dd563775)|
|[ABC 209 C](https://atcoder.jp/contests/abc208/tasks/abc208_c)|300|22:50|[○](https://atcoder.jp/contests/abc209/submissions/24125372)|[AtCoderログ：0016](https://qiita.com/RoadLynton/items/2463043b53f5ac24e044)|
|[ABC 209 D](https://atcoder.jp/contests/abc209/tasks/abc209_d)|400|(1)|---|---|
|[ABC 209 E](https://atcoder.jp/contests/abc209/tasks/abc209_e)|500|---|---|---|
|[ABC 209 F](https://atcoder.jp/contests/abc209/tasks/abc209_f)|600|---|---|---|

# 感想
- A, B, C を完答、D に挑戦している間に時間切れとなりました。レーティングが確実に上がっているので良しとしましょう。
- A は、a と b の大小関係をなぜか勘違いしてしまい、2 回も誤答してしまいました。
- A で誤答したおかげで、B, C は素直に回答して正問。
- D はグラフの基本的な内容を調べながら実装しているうちに時間切れとなりました。「[AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067)」が終わり次第、グラフ関係の話を学習していきたいです。

# リンク
- 前の記事 → [AtCoderログ：0012 - ABC 085 A](https://qiita.com/RoadLynton/items/77bcb72d7b746391f3fa)
- 次の記事 → [AtCoderログ：0014 - ABC 209 A](https://qiita.com/RoadLynton/items/ad080d4b17ce17424c29)
Excelで自分の１つ上のセルまでの合計を計算したいときの式の書き方

SUMの：の右側にOFFSET関数を入れる書き方は、もう少し評価されてもいいと思うのだけど。あまりにも存在感がない。

# A1からA10までのセルの合計をA11に計算する
普通に書くと、A11にこの式を書きます
`SUM(A1:A10)`

## この式の問題点
ある一か所以外に行を挿入した場合は、SUMの参照範囲が自動的に`A1:A11`に変更されます。Excel賢い。
ある一か所が問題です。合計のセル（A11）の直前に行を足した場合はSUMの参照範囲が`A1:A10`のままになります。合計セルの一つ上に行を足したいことが多いんですよね、意外と。

この結果、式の範囲ずれが発生します。

これを避けるために、

- 行を挿入したあとに式の範囲を手動で直す
- この現象を先読みしてあえてA9に行を差し込み値をずらす

など人間側がExcelに踊らされることになります。
それか、参照がミスっていることに気が付かず、計算機を使っているのに計算ミスをするというもっと悲しいことが起きます。

# 解決方法
`=SUM(A1:OFFSET(A11,-1,0))` と書く

A1セルに始まり、A11の一つ上のセルまでの合計という意味です。
実は、SUM関数などのセル範囲指定をするときの`：`前後は、文字列で直接セルの番地を書くことが多いですが、セル参照が返ってくる関数であれば書くことができます。

この書き方の場合、`A10`に行を追加しても、OFFSET関数の第一引数も自動的に`A12`に繰り下げられえるので、A12の1つ上まで（つまりA11まで）となり合計が正しく計算できます。

## 副作用
副作用もあります。F2キーを押して編集状態にしたときにSUMの合計範囲に色を付けて教えてくれなくなります。これはちょっと悲しい。

# offset関数について
第一引数のセル番地からの位置を相対的に選択する関数。

**offset関数の定義**
`offset(範囲, 行数, 列数, [高さ], [幅])`

サンプルで使ったOFFSET(A11,-1,0)の説明

- A11, 
- -1(縦位置マイナス１、上方向に1つ動く、つまり10), 
- 0(横位置は変更なし、つまりAのまま)
- 省略（1行分）
- 省略（1列分）

これでA10を指します。

第4引数をうまく使うとA11を起点として、上10個を参照する範囲を取得するOFFSET関数を書くこともできますが、やめておきます。


# まとめ
SUM関数の引数のコロンの右側（左側も）に、関数を指定できるという事実があまり知られてなさそうだったので記事にしてみました。最初にSUMを使うときに`A1:A10`の形式で勉強するから、この形しか使えないと思い込んでしまっているかもしれません。

月の日数によって合計範囲が変わるような表を使っている場合は、毎月SUM式の範囲を確認して調整する雑務から解放されると思います!
App Engineサービスから400とか414とか返ってきて困った話


# 困ったこと
題の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537735/ed73aeec-36af-fc60-4bca-8d7dee4651c6.png)

# なにが問題だったの？
* gunicornのlimit_request_line
    * デフォルトは4094 byteだった
        * それ以上を投げると400 Bad Requestが反ってきた
    * この質問・回答に助けられた
        * https://stackoverflow.com/questions/62404572/how-can-i-increase-gunicorn-limit-request-line-in-a-python-app-engine-applicat
* データ量が大きいリクエストをGETで投げてた
    * 414 URI Too Long
        * 読んで字のごとく

# これで解決
* gunicornのlimit_request_lineを明示的に設定する
* データ量が多いときはPOSTで投げる
MacOSで自作Blu-rayをチャプタごとにMP3に変換する

# 前提
当方の環境: macOS 11.2.3
必要なもの: Mac対応のBlu-rayドライブ

**自作の，あるいはコピープロテクトのかかっていない**Blu-rayから音声のみ取り出して楽しみたい方向けです（2012年の著作権法改正により，コピーコントロール＋アクセスコントールが規制対象に）．

音質など**超適当**ですので適宜調節してください．
他のコーデックが良いという方は，ffmpegコマンドのオプションを変更してください．


# インストールしておくもの
+ ffmpeg 
+ MakeMKV
 
```shell:
# コマンド例
brew install --cask makemkv
```
+ mkvtoolnix
 
```shell:
# コマンド例
brew install mkvtoolnix
```

# 手順
1. Blu-rayを挿入
1. MakeMKVを起動してBlu-rayのマークのボタンを押下．Blu-rayが認識されない場合，当方の環境ではPCの再起動により解決．他に考えられるのはBlu-rayドライブの電力不足とか？
1. PCの空き容量次第で，変換対象のチェックボックスを外して分割しながらMKVに変換．ひとつの大きなMKVファイルが作成される．ここでは originalfile.mkv とする（結構時間がかかる）
1. そのままでは重いので，音声だけ抽出<br>
     
    ```shell
ffmpeg -i originalfile.mkv -vn -acodec copy new.mkv
```
1. 音声のみのMKVファイルをチャプタごとに分割する．チャプタ数だけ連番のMP3ファイルが生成される．<br>
     
    ```shell
mkvmerge -o chapter.mkv --split chapters:all new.mkv
```
1. チャプタごとのMKVファイルをMP3に変換<br>
      
      ```shell
# 単一のファイルを変換する場合
ffmpeg -i chapter-001.mkv -f mp3 -ab 256k chapter-001.mp3
```
```shell 
#    連番のMP3を一括で処理する場合（例. チャプタ数30の場合)
   for i in $(seq 1 30)
   do
   j=$( printf "%03d" "${i}" )
   ffmpeg -i chapter-${j}.mkv -f mp3 -ab 256k chapter-${j}.mp3
   done
```

# 最後に
記事の間違いを見つけた方，より良い方法をご存知の方がいたら教えてください．

この記事は以下のサイトを参考にして作成しました．
[MacでBlu-ray discを音声だけ取り出してWalkmanに入れるまで](https://muse1studiok.blog.fc2.com/blog-entry-1546.html?sp)
[Linux(ubuntu)で、mkvファイルの分割と統合](https://qiita.com/gigatune/items/043965083d1501b9bd5b)
ArduinoのFlextimer2について

#概要
Flextimer2の割り込み間隔に対し疑問が発生したので実験しました。


#FlexiTimer2::set(times, resolution,#function)
このタイプの場合、1secondに100回というのが公式ドキュメントぽいですが。


https://playground.arduino.cc/Main/FlexiTimer2/



FlexiTimer2::set(unsigned long units, double resolution, void (*f)())
this function sets a time on units time the resolution for the overflow. Each overflow, "f" will be called. "f" has to be declared void with no parameters. E.g. units=1, resolution = 1.0/3000 will call f 3000 times per second, whereas it would be called only 1500 times per second when units=2.

```C
#include <FlexiTimer2.h>

volatile boolean flag = true;

void control() {
  
  digitalWrite(A0,flag);
  flag = !flag;
  
}
void setup() {
  pinMode(A0,OUTPUT);
  FlexiTimer2::set(1, 1.0 / 100, control);
  FlexiTimer2::start();

}

void loop() {
  // put your main code here, to run repeatedly:

}
```
これで100回ごとにON,OFFさせてみると

Arduino_Nanoだと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/e55c4889-f64f-7a39-2f23-09a8cc9caab8.png)
で0.784msごとになる。
やはり、狙い通りになっていない。

ちなみに
FlexiTimer2::set(unsigned long ms, void (*f)())
との違いは、指定時間の精度によって使い分ける。具体的にいうとms指定の方は0.1ms間隔等の指定はできない、というより自動的に1msに繰り上げられる（四捨五入かも）。こういう制度の違いである。

```C
#include <FlexiTimer2.h>

volatile boolean flag = true;

void control() {
  
  digitalWrite(A0,flag);
  flag = !flag;
  
}
void setup() {
  pinMode(A0,OUTPUT);
  FlexiTimer2::set(10, 1.0 / 1000, control); 
  FlexiTimer2::start();

}

void loop() {
  // put your main code here, to run repeatedly:

}
```
に

```C
  FlexiTimer2::set(10, 1.0 / 1000, control); 
```
変更したところ、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/e0e1fba6-b399-36be-554f-630d782a2026.png)
10ms間隔に改善された。


#結論

```C
FlexiTimer2::set(times, resolution,#function)
```
この指定を使用する場合は、resolutionを細かく、timesを大きめにとったほうが正しい割り込みになり、timesが1だと、だいぶ大雑把な時間間隔になることに注意してほしい
JavaScriptをアプリに実装①

2021年7月９日（金）から7月10日（土）までまる二日かかって自装できました。
railsアプリ内に実装していきます。
１）アプリ内にはチェックボックスでJavaScriptを発火させます。
２）チェックボックスは１つだけ
３）チェックすると全ての入力フームに入力できるようにする
４）チェックを外すと一部の入力フォームを入力できないように制限する

なぜ時間がかかった
-

・googleで検索していくつも似たようなものが出てきたから
・書いてあるとおおりコピペしても動かなかった

1日半経ってから
-

1から組み上げることにした。
・Railsのメソッド（def ~ end）にあたる関数を調べる
・変数の宣言の仕方を調べる
・イベントハンドラー＝いつJavaScriptを発火させるのか？
・どこで発火させるのか？（DOM）
・console.logできちんと確認しながら開発

初めての人にもわかるように頑張ります。
１）JavaScriptのメソッド
![20210711-105544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/480c4689-3155-15ff-cbd9-3eb06de4035c.png)

２）変数の定義
-

|変数|初期値|再宣言|再代入|
|:--:|:--:|:--:|:--:|
|var|OK|OK|OK|
|let|OK||OK|
|const|OK|||

3)関数の書き方
-

![20210711-112920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/605bc7d7-5425-5188-4453-8f14816a0162.png)

4)どこで発火させるのか
-

DOMとはDocument Object Modelの略です。HTMLやXML文書のためのプログラミングインターフェイスです。ページを表現するため、プログラムが文書構造、スタイル、内容を変更することができます。WEB情報は単なる文字情報ではなくブラウザを使って色々な装飾を施すがその一部としてJavaScriptも使われています。そのJavaScriptを使うところをid名クラス名要素名で取得します。

![20210711-121032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/a91b9199-9b1e-b89b-a051-257e0d31d74d.png)


セレクタ名は
1.クラス名(".class名")
2.id名（”#id名”）
3.HTMLタグ（”タグ名”）と表記します。

５）トリガー（いつ発火するか=イベントハンドラー）
-

![20210711-131636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/e05d15ff-fa2e-0599-ce60-a3f54572c302.png)

●EventTargetElement、Document、Windowなどがあります。 

|click|ボタンをクリックしたとき|
|--|--|
|mousemove|カーソルがターゲット内に移動したとき|
|mouseover|カーソルがターゲット内に侵入してきたとき|
|mousedown|ボタンを押下したとき|
|mouseup|ボタンを離したとき|
|mouseout|カーソルがターゲット外に出たとき|
|keypress|キーを押して離したとき|
|keydown|キー押下時
|keyup|キーを離したとき|
|DOMFocusIn|ターゲットがフォーカスを受け取ったとき|
|DOMFocusOut|ターゲットがフォーカスを失ったとき|
|DOMActivate|ターゲットがアクティブになったとき|
|select|テキストフィールドで文字が選択されたとき|
|change|コントロールの値が変化したとき|
|submit|submitボタンが押されたとき|
|reset|resetボタンが押されたとき|
|focus|コントロールがフォーカスを受け取ったとき|
|blur|コントロールがフォーカスを失ったとき|
|load|読み込みが完了したとき|
|scroll|コントロール付属のスクロールバー位置が変更されたとき|
|resize|コントロールのサイズが変更されたとき|


6)jsファイルを読み込む準備

![20210711-140915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/e6301f6d-4bc5-6214-c464-f7fdeb2651be.png)


```javascript:application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

require("../packs/check")
```
Linuxでリモートデスクトップのサーバを構築する

古き良きvncや、sshのX11 forwardingなどを利用したLinuxサーバ上のGUIアプリケーションの利用方法があるが、ここではもう一歩踏み込んでグラフィカルログインまで利用できるxrdpのサービスを構築する。

##　筆者環境

```
[eru@tndl ~]$ uname -a
Linux tndl.net 5.12.14-300.fc34.x86_64 #1 SMP Wed Jun 30 18:30:21 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[eru@tndl ~]$ cat /etc/redhat-release 
Fedora release 34 (Thirty Four)
```

## xrdpのサービス構築

- xrdpのインストール

```
[eru@tndl ~]$ sudo dnf install -y xrdp
```

- xrdpのサービス登録とスタート

```
# ディストリビューションのお作法によって異なります
[eru@tndl ~]$ sudo systemctl enable --now xrdp
```

- （必要であれば[^1]）ポート開放

```
# ディストリビューションによってはfirewalldでなかったり、rdp.xmlが用意されてないかもしれません
[eru@tndl ~]$ ls /usr/lib/firewalld/services/rdp.xml
ls /usr/lib/firewalld/services/rdp.xml
[eru@tndl ~]$ sudo firewall-cmd --permanent --add-service=rdp
[eru@tndl ~]$ sudo systemctl reload firewalld.service
```

## 最後に

ほぼ、ゼロコンフィグレーションでサービス構築できる良い世界だった。


[^1]: パスワード認証のみでは脆弱なので、外部からアクセスしたい場合にはsshポートフォワードやVPNを使うなどしたほうが良い
anaconda の取り扱い備忘録　ライブラリインストール

#anaconda に pyserial をライブラリに追加したい。
良く忘れるので検索してヒットするように書き込みます。
よくよくプログラムから起動してしまい、環境書き込みエラーを起こしてしまう。初歩的なミスだが、まだ始めたばかりなのでライブラリの追加もてんやわんや。管理者権限が必要（自分のPCなのに！！）

#まずは管理者としてAnaconda promptを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1644631/84f389bc-359c-cb44-b424-13c145f18f81.png)
#そしてpromptに書き込む
元の記事（多分anacondaのページ）

https://anaconda.org/anaconda/pyserial

conda install -c anaconda pyserial

#入っているか確認する
同じくanaconda promptに
　conda list
と記入して入っているか確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1644631/6ceab4bd-064c-eb03-69ed-4b4539cbe677.png)
俺は頭悪りぃからよォ，10^9+7で割った余り関連がわかんねぇんだよ

# 導入
([atcoderのある問題](https://atcoder.jp/contests/abc209/tasks/abc209_c)の文章)
>ただし、答えは非常に大きくなる可能性があるので、
(10^9+7)で割った余りを出力してください。

...ふむふむ，なるほど，求めた解が大きくなると表示できないから表示する際に10^9+7で割った余りを出せばいいんやね．
(問題解き終わった後(tle連発した)，解答を見る)

```{python3}
N = int(input())
C = list(map(int, input().split()))
C.sort()
ans=1
for i in range(N):
    ans = ans * max(0, C[i] - i) % 1000000007
print(ans)
```
**...！最後に10^9+7で割るんじゃァなく，掛ける段階で毎回10^9+7で割ってるッ...！**
これで正しい解が出るのというのかッ！非自明ッ！反直感ッ！

# 疑問点
$x_i$を$q$で割った際の商と余りを，それぞれ，$y_i,\ m_i(<q)$で表すとする．上記の現象を数式を使って表現すると，　

```math
\begin{align}
&\prod_{i=1}^Nx_i \equiv \prod_{i=1}^Nm_i\: \mod q\\
&where\ x_i = y_iq + m_i\ (i = 1,...,N)\\
\end{align}
```
となります．これが実際成立するのかというのが疑問点です．立式までできると後は簡単です．高校数学です．左辺と右辺をそれぞれ$q$で割った余りが一致するかを確かめれば良いだけです．

# 確かめる
では，実際に確かめてみましょう．右辺は

```math
\begin{align}
\prod_{i=1}^Nx_i &= \prod_{i=1}^N(y_iq + m_i)\\
&=zq + \prod_{i=1}^Nm_i\\
\end{align}
```

と変形できます．ここで，zは$\prod_{i=1}^N(y_iq + m_i)$を展開した際に，(qを含む項の和)/qとして定義しています．また，$q,\ m_i$はそれぞれ互いに素であるため，$q,\ \prod_{i=1}^Nm_i$も互いに素です．以上より，


```math
\begin{align}
&\prod_{i=1}^Nx_i \equiv \prod_{i=1}^Nm_i\: \mod q\\
&where\ x_i = y_iq + m_i\ (i = 1,...,N)\\
\end{align}
```

が確かめられました👏
以上から，**最後に10^9+7で割ることと，掛ける段階で毎回10^9+7で割るのは結果として同じってコト！？**(そもそもこんな処理が必要になるほど大きい数字は保持しきれないから，毎回余りとる必要あるよね)

# 終わりに
合同式を忘れた大人はこの程度でつまずく...!
Chart.jsの複数軸グラフはver2とver3で書き方が違う

#背景
Chart.jsでY軸(縦軸)が右と左にあると便利な事があると思う。
しかしver2.xxとver3.xxではscales以下の書き方が違うみたいなので記す。

#ver2.xxのとき
```html:chart_js_2.xx.htm
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Chart.js 2.xx</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.bundle.js"></script>
</head>
<body>
<canvas id="myChart"></canvas>
<script>
var ctx = document.getElementById("myChart");
var myChart = new Chart(ctx, {
    type: 'line',
    data: {
        datasets: [{
            data: [20, 50, 100, 75, 25, 0],
            label: 'Left dataset',

            // これはデータセットを左のy軸に結びつけます
            yAxisID: 'left-y-axis'
        }, {
            data: [0.1, 0.5, 1.0, 2.0, 1.5, 0],
            label: 'Right dataset',

            // これはデータセットを右のy軸に結びつけます
            yAxisID: 'right-y-axis'
        }],
        labels: ['1月', '2月', '3月', '4月', '5月', '6月']
    },
    options: {
        scales: {//↓このあたりが違う
            yAxes: [{
                id: 'left-y-axis',
                type: 'linear',
                position: 'left'
            }, {
                id: 'right-y-axis',
                type: 'linear',
                position: 'right'
            }]
        }
    }
});
</script>
</body>
</html>
```

#ver3.xxのとき
```html:chart_js_3.xx.htm
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Chart.js 3.xx</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.4.1/chart.min.js"></script>
</head>
<body>
<canvas id="myChart"></canvas>
<script>
var ctx = document.getElementById("myChart");
var myChart = new Chart(ctx, {
    type: 'line',
    data: {
        datasets: [{
            data: [20, 50, 100, 75, 25, 0],
            label: 'Left dataset',

            // これはデータセットを左のy軸に結びつけます
            yAxisID: 'left-y-axis'
        }, {
            data: [0.1, 0.5, 1.0, 2.0, 1.5, 0],
            label: 'Right dataset',

            // これはデータセットを右のy軸に結びつけます
            yAxisID: 'right-y-axis'
        }],
        labels: ['1月', '2月', '3月', '4月', '5月', '6月']
    },
    options: {
        scales: {//↓このあたりが違う
            'left-y-axis': {
                type: 'linear',
                position: 'left'
            },
            'right-y-axis': {
                type: 'linear',
                position: 'right'
            }
        }
    }
});
</script>
</body>
</html>
```
Unityでセーブデータを作る方法まとめ

Unityでセーブデータを扱う機会があったのですが、セーブ方法が色々あるので、それぞれの特徴を以下にまとめました。
結論としては有料で良いのであればEasySaveを買うのが情報が多くて多機能なので無難っぽいです。

# PlayerPrefs
### 概要
* UnityEngineクラスで定義されている標準機能的なセーブ方法
* データはキー・バリューで管理する。
* 書き込み時の永続化タイミングはアプリ終了時、または"PlayerPrefs.Save();"の実行時
* ユーザーに値を改ざんされても良いデータを扱う場合に使える。


```c#:save.cs
// load
int volume = PlayerPrefs.GetInt("Volume", 0); 
PlayerPrefs.Save();
//save
PlayerPrefs.SetInt("Volume", 50);
```

### 保存できるデータ型
* int,float,stringの三種類のみ。

### 保存先
* OSのレジストリ(WIndowsの場合)

### 改ざん対策
なし

### 所感
* 読み込み、書き込みがそれぞれ一行で記述できるので、手軽に扱える。
* 設定情報の保存向け


# JSON
### 概要
* 人間が読めるデータ形式
* 保存したファイルをテキストエディタで開き、内容を確認・編集することができる。
* JSON データをシリアル化、逆シリアル化するための Unity の組み込み API
    * JsonUtility
        * 他の .NET JSONと比べると機能が少ないが高速とのこと
        * MonoBehaviour や ScriptableObject ベースのオブジェクトに対応
        * メインスレッド以外のスレッドでも使える
        https://docs.unity3d.com/ja/current/ScriptReference/JsonUtility.html

    * EditorJsonUtility
        * UnityEngine型に対応
        * Unity エディターで任意のゲームオブジェクトの JSON 表現を作成することができる。
        * メインスレッド以外では使用できない（例外が発生）
        
        https://docs.unity3d.com/ja/current/ScriptReference/EditorJsonUtility.ToJson.html
        
### 保存できるデータ型
* 文字列,数値,null,bool,オブジェクト,配列


### 保存先
* 任意

### 改ざん対策
なし

### 所感
* ユーザーに値を改ざんされても良いデータを扱う場合に使える。
* 読み込み、書き込みがそれぞれ一行で記述できるので、手軽に扱える。
* クロスプラットフォーム対応はやりやすそう。
* 


# EasySave
### 概要
* $75.90(2021年7月11日時点)
* 最小の機能だけならPlayerPlefsと同様に簡素なコードで書けるが、細かい設定等も可能
* ビジュアルスクリプトにも対応
* ファイル圧縮機能あり

### 保存できるデータ型
* ほぼ全ての型
　(ES3Typeを作成することで独自の型も追加できる）
https://docs.moodkie.com/easy-save-3/es3-supported-types/

### 保存先
* 任意

### 改ざん対策
* 暗号化可能

### 参考
https://assetstore.unity.com/packages/tools/utilities/easy-save-the-complete-save-data-serialization-asset-768

### 所感
* 有料なだけあって、一番利便性が高そう。



# Databox – Data editor & save solution
### 概要
* $42.90(2021年7月11日時点)
* ゲームデータを管理するための総合的なプラグイン。
http://databox.doorfortyfour.com/

### 保存できるデータ型
* すべての一般的なシリアル化可能なUnityタイプをサポート
* カスタムエディターGUIを使用して独自のタイプとクラスを追加できる

### 保存先
* 任意

### 改ざん対策
* 暗号化可能

### 参考
https://assetstore.unity.com/packages/tools/utilities/databox-data-editor-save-solution-155189

### 所感
* 良さげだが日本語情報少な目

# その他Asset
Level Save,Bayat - Save System等その他多数
群別最小二乗法

```{r}

#ものによっては固定効果モデルをお勧めする

library(dplyr)

data(iris)

data=iris

no=as.integer(data$Species)

seq=sort(unique(no))

XX=as.matrix(data[,!(colnames(data) %in% c("Species"))])

#XX=cbind(apply(XX,1,mean))

Y=no*10




ite=100000

eta=10^(-4)


  
beta=rep(5,ncol(XX));alpha=rep(1,length(seq)) 

for(l in 1:ite){
  
dalpha=c();dbeta=rep(0,ncol(XX));S=0;prevec=c()

for(i in 1:length(seq)){

pre=(XX[no==i,]%*%beta+alpha[i])

prevec=c(prevec,pre)

dbeta=dbeta+t(XX[no==i,])%*%(Y[no==i]-pre)*(-2)

dalpha=c(dalpha,-2*sum(Y[no==i]-pre))

S=S+sum((Y[no==i]-pre)^2)

}

beta=beta-eta*as.numeric(dbeta)

alpha=alpha-eta*dalpha

#print(S)

}





```
【PHP】アルゴリズムで使う関数辞書

##標準入力の扱い
* **fgets()**
`$line = fgets(STDIN);`
改行またはEOF(End of File)に達したかのいずれかの時点で終了する。

* **trim()**
 `$line = trim(fgets(STDIN));`
用意された標準入力ファイルの行頭・行末に余計な空白等があって望んだ出力が得られない場合に、それらを削除します。

* **explode()**
`$array = explode("区切り文字", $line);`
`[$a, $b] = explode(' ', trim(fgets(STDIN)));`

返り値：文字列を区切り文字で分割した結果を配列として返す。

* **implode()**
`$string = implode("区切り文字", $array);`
返り値：区切り文字で配列の中身を連結した文字列を返す。

* **fscanf()**
`fscanf(STDIN, "%d %d %d", ＄a, ＄b, ＄c);`
区切り文字がカンマの場合は"%d,%d,%d"とする。
%s：文字列(string)
%d：10進数の整数(digit)

* **連想配列に収納する**
 [＄a, ＄b] = explode(' ', trim(fgets(STDIN)));
 ＄ab[＄b] = $a;

##文字列の操作

* **文字列の出現回数を調べる　substr_count**
`substr_count (検索対象文字列, 検索する文字列);`
※この関数は重なり合う副文字列をカウントしない。

* **文字列を配列に変換する str_split**
`str_split (変換する文字列, 分割する長さ);`
返り値：配列

* **文字列の一部を得る mb_substr**
`mb_substr(文字列, 開始位置 ,切り取る文字数);`

　（例）文字列＄sの、＄a番目から＄b番目まで切り取る。
　　`mb_substr(＄s, ＄a - 1, ＄b - ＄a + 1);　`

* **文字列を大文字・小文字に変換する　strtoupper()、strtolower()**
大文字に変換　`strtoupper(文字列);`
小文字に変換　`strtolower(文字列);`

*  **文字列の長さを取得する mb_strlen**
`mb_strlen(文字列);`
返り値：文字列の長さをint型で取得


##配列の操作

* **配列を降順にソートする rsort**
`rsort(配列);`
返り値：成功した場合は　TRUE を、失敗した場合は FALSE を返す。

* **配列を昇順にソートする ksort**
`ksort(配列);`
返り値：成功した場合は　TRUE を、失敗した場合は FALSE を返す。

* **配列の値の合計を計算する array_sum**
`array_sum (配列);`
返り値：int型、もしくはfloat型の配列の合計

* **配列から重複した値を削除する array_unique**
`array_unique(配列);`
返り値：処理済みの配列

* **配列要素を文字列により連結する implode**
`implode(連結文字,配列);`
返り値：すべての配列要素の順序を変えずに、各要素間に separator 文字列をはさんで 1 つの文字列にして返す。

##四捨五入・切り上げ・切り捨て
* **四捨五入**
`round(丸める値, 桁数);`
※桁数に正の数を指定すると小数点以下何位まで表示するか、桁数に負の数を指定すると整数の何桁以上で四捨五入するかを指定できる
返り値：丸められたfloat型の値

* **切り上げ**
`ceil(丸める値);`

* **切り捨て**
`floor(丸める値);`

##よく使う構文
* **ループ処理**
`for ($i = 0; $i < $n; $++) {    
}`

* **foreach**
`foreach ($array as $k => $v) {
 echo $k . ' ' . $v . "\n";
}`
Kubernetesの学習まとめ②（Kubernetesのリソースを知る(１) Workloads APIsカテゴリ）

業務で携わったことは無いですが個人的にコンテナ技術に興味があり、Kubernetesについて学習したので、本記事にまとめてみました。記載内容は概要的なものです。（[前記事](https://qiita.com/qwertyuiopnak/items/b0c2edccc5ebcfc859bd)の続きで。）
Kubernetesのリソースは沢山あるので、複数記事に分割して記載します。

①Kubernetesの概要　　　　←[前記事](https://qiita.com/qwertyuiopnak/items/b0c2edccc5ebcfc859bd)記載
②Kubernetesで出来ること　　　　←[前記事](https://qiita.com/qwertyuiopnak/items/b0c2edccc5ebcfc859bd)記載
③Kubernetesの基本知識を知る　　　　←[前記事](https://qiita.com/qwertyuiopnak/items/b0c2edccc5ebcfc859bd)記載
④Kubernetesのリソースを知る　　　　←本記事記載
　（１）Workloads APIsカテゴリ　　　　←本記事記載
　（２）ServiceAPIカテゴリ　　←別記事記載予定
　（３）Config & Storage APIsカテゴリ　　←別記事記載予定
　（４）Cluster APIsカテゴリ　　←別記事記載予定
　（５）Metadata APIsカテゴリ　　←別記事記載予定
⑤Kubernetesアーキテクチャを知る　　←別記事記載予定
⑥Kubernetesのまとめ　　　　←別記事記載予定

##④Kubernetesのリソースを知る
###Workloads APIsカテゴリ

####Pod
Kubernetesリソースの最小単位です。Podは中に1つ以上のコンテナを含んでいます。PodにはNICが1つ付いていて、複数のコンテナがPod内に存在している場合は、NICを各コンテナは共用します。特に理由が無い場合、「Podの中のコンテナは１つ」が推奨されています。

####ReplicaSet
ReplicaSetはPodを複数デプロイする場合に使用するリソースです。ReplicaSetに定義した数のコンテナをスケジューリングしてNode上にデプロイします。仮にNodeに障害が発生してそのNode上のコンテナが無くなっても、ReplicaSetに定義したコンテナ数になるように、オートヒーリングで別のNodeに自動復旧します。

####Deployment
複数のReplicaSetを管理するのがDeploymentリソースです。Deploymentはローリングアップデートに利用されます。以下ような手順でDeploymentは古いReplicaSetAのPodを新しいReplicaSetBのPodへローリングアップデートします。
１.(新)ReplicaSetBを作成する
２.(新)ReplicaSetB上のPod数を1つ増やす
３.(古)ReplicaSetA上のPod数を1つ減らす
４.手順2と手順3を繰り返す
５.(古)ReplicasetAのPod数は0で維持する

####DaemonSet
DaemonSetを使用すると各Nodeに１つずつ均等にPodを配置します。ReplicasetのようにPodの数を指定することは出来ませんし、リソースに応じてスケジューリングによってコンテナを配置する動作はしません。用途としてはdatadog agentなどのメトリクスエージェントの実行や、fluentdのようなログ収集デーモンを実行する際などに利用されます。

####StatefulSet
データベースなどのステートフルなアプリケーションをデプロイ・管理するためのリソースです。ワークロードに永続性を持たせるために同じPod名を維持する仕組みがあります。新たにPodを作成する場合は[Pod名]-[Nunber]のように命名します。例えば、``web-0,web-1,web-2``のようになります。

####Job
コンテナを利用して一度限りの処理を実行させるリソースです。JobとRepicaSetとの大きな違いは、「起動するPodが停止することを前提にして作られているかどうか」です。基本的にReplicaSetでは、Podの停止は予期せぬエラーです。一方、Jobの場合は、Podの停止が正常終了ち期待されるようとに向いています。例えば、「特定のサーバとのrsync」や「S3などのObject Storageへのアップロード」などが挙げられます。ReplicaSetなどでは正常終了の数をカウントしているわけではないため、バッチ的な処理の場合はJobを積極的に利用しましょう。

####CronJob
Cronのようにスケジュールされた時間にJobを作成するためのリソースです。
CronJobがJobを管理して、JobがPodを管理するような３層の親子関係になっています。

　

この記事は以下の情報を参考にして執筆しました。
[Kubernetes公式ドキュメント](https://kubernetes.io/ja/docs/home/)
[Kubernetes完全ガイド 第2版](https://book.impress.co.jp/books/1119101148)
プログラムでのバリデーションとDBの制約

たまたま(7/5現在)ホームフィードに表示されていた「[プログラムでチェックしているとしてもDBにも必ず制約をつけよう！](https://qiita.com/ham0215/items/1d42464e666917475ff1)」について

ほぼ全面的に間違っています。

#パターン1

> プログラムでバリデーションして、DBは何もしない。
> もしチェックが漏れた場合にはDBに制約がないため、不正なデータが格納されてしまう可能性があります。

このパターンの問題は「プログラムでチェックしててもすり抜ける」場合があることです。

例えばUNIQUE制約をプログラムでチェックする処理を素直に実装したとしましょう。この処理が2つ同時に走ったとすると

|プロセスA|プロセスB|
|:-:|:-:|
|SELECT count(*) FROM tbl where name='hoge' →結果0|   |
|   | SELECT count(*) FROM tbl where name='hoge' →結果0|
|INSERT INTO tbl (name) VALUES ('hoge')|   |
|   | INSERT INTO tbl (name) VALUES ('hoge')|

とチェックが漏れたわけではないのに重複するデータが挿入できてしまいます。これを防ぐには適切にトランザクションを用いる必要があります。

非NULL制約は1行のデータの1カラムだけが対象になりますが、一般的にはそうではなく他のカラムや行が関係してくるので、非NULL制約を例に考えると間違えます。

> 例えば、最小文字数や数値の範囲、取りうる値が限られている場合などのチェックはDBの制約で行うことができないのでプログラムで制御する必要があります。

普通にCHECK制約でできることですが知らないんでしょうか？

#パターン2

> DBだけで制御する
> 呼び出し元でチェックする必要がないため、実装が楽になります。

チェックしてどうするか、という視点が全く抜けています。

制約違反が起きたときのDBの応答を元に普通にアプリケーションに求められるであろうエラー処理(例えば入力フォームに「名前は必須です」と表示する)を行おうとすると、実装が楽になるどころか遙かに面倒になります。それをやったとしても、「1つ制約違反を訂正するたびに次の制約違反がでる」という最悪のUIになります。

制約違反が起きたら死ぬ、ぐらいの書き捨てプログラムならよいかもしれませんが･･･

#パターン3

> プログラムでもDBでも制御する。パターン1と2のハイブリッドです。
> 不正データの場合にSQLを実行することなくエラーにすることができるので、パターン2と比べてDBの負荷を下げることができます。

またUNIQUE制約で考えてみましょう。

||DBでの制約|プログラムでもチェック|
|:-:|:-:|:-:|
|1|INSERT INTO tbl (name) VALUES ('hoge')| SELECT count(*) FROM tbl where name='hoge' →結果0|
|2|| INSERT INTO tbl (name) VALUES ('hoge')|

検査のためのクエリが必要ですし、チェックの結果結局挿入するなら2回クエリを行うことになります。DBの負荷は下がるどころか上がります。パターン1のところに書いたように、非NULL制約の場合は挿入するデータだけを見ていればいいのでプログラムに閉じてチェックができるため、例外的に「チェックのためのクエリ」が例外的に不要になります。

ところでこれはそもそも負荷の問題ではありません。

# 何を間違えたか

たいていのアプリケーションでは

1. 入力値がアプリケーション仕様に適合しているか
2. DB全体にわたってデータの整合性が保たれるか

のどちらチェックも求められるでしょう。そして、それぞれについて適切なエラー処理が必要になります。上に書いたようにプログラムのチェック、DBの制約だけでは両方を満たすことはできません。結局、普通にアプリケーションを実装するならどちらも必要な処理です。通常

1. はアプリケーションでチェック
2. はDBの制約

で実現します。

負荷の高低や

> 1回のDBアクセスを減らすことより、実装する量を減らす方が有意義
> コードは可能な限り少ないほうが好ましい

という観点で「やるやらない」「どちらがよい」を考えるのは根本的におかしいです。

> チェック条件が変わったときにプログラムとDBの両方を修正する必要があり手間がかかります

(どっちでもやるべきもの、という話はさておいて)パターン2のところで書いたように、DBの制約を単なる入力値検証に使用するとプログラムでチェックする時より遙かに面倒になりえます。その時点で「手間」を比較すると不利ですし、チェック条件が変わったときも同様です。

> DBの制約で制御できるものはDBの制約だけで制御する
> DBの制約で制御できないものはプログラムで制御する

普通のアプリケーションではすべてのデータをDBに保存するわけではあありません。DBが絡まない場合、もっと極端(でもあり得る)には、入力値の中でもDBに保存するものしないものがある場合を考えて見ましょう。これはプログラムでチェック、これはDBでチェックするのでプログラムでチェックしない、とかやるのでしょうか。この点だけ見てもこの記事の主張は非常にナンセンスです。
イベント日時のバリデーションを明日以降にしたい

こんにちは！
オリジナルアプリケーションを作成中です。
オリアプ作成になると、スクールのメンターへの質問が
禁止されているのでそれが僕にとって非常にカロリーになっています。
とはいえ自分で調べたり、考えたりして問題解決を
目指すという行為自体は確実に自分にプラスになってるはずです。

今回はスクールの教材に載っていない機能を
付け加える中で実装できたことを一つアウトプットしたいと思います。

# 作成中のオリアプについて

ライブハウス経営者がアプリに登録し、イベント情報を投稿することで
ユーザーが日本全国のライブハウス情報を閲覧することができる
Webアプリケーションを開発中です。
コロナ禍ということもあり、イベントが中止になり、
ライブハウスが軒並み閉店していく中で
ライブハウス経営者やDJ、ラッパーが表現する場を提供する
助けになればいいなあと思い作成中です。


# イベント日時のバリデーション

ライブハウス経営者がイベント投稿をする際に
イベント日時を記入する欄を設けました。

![スクリーンショット 2021-07-11 12.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/96d429a8-debe-b0b3-6dde-4fc59723dc0e.png)


誰か頼むからこの実装をオシャレにできる方法を教えてください。
まじで助けて。

それはそうとイベント日時を入力する際、
明日以降の日付でないといけないバリデーションを
加えたいと僕は考えました。
まあ正直、今日以前のイベントを投稿しても
ライブハウス経営者サイドからしたら損でしかないから
そのまま実装してもいいかなと思ったけど、
僕は優しいからしっかりバリデーションを加えます。

# イベント日時を明日以降にしたい

いろいろ調べた結果、

```  model
validates :event_date, presence: true
validate :day_after_today
def day_after_today
    unless event_date == nil
      errors.add("明日以降の日付を入力してください") if event_date <= Date.today
    end
  end
```

これにしたら余裕やろとか思って
試したらエラーがでやがった

![スクリーンショット 2021-07-11 11.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/553606cb-a301-d6d4-fc4b-f411c38b9caa.png)

  errors.add(バリデーションしてえカラム, "出力するエラーメッセージ")
ってしなきゃいけないところの「バリデーションしてえカラム」が
抜けてたみたい。

```  model
validates :event_date, presence: true
validate :day_after_today
def day_after_today
    unless event_date == nil
      errors.add(:event_date, "明日以降の日付を入力してください") if event_date <= Date.today
    end
  end
```

上記に変更したらいけました。

![スクリーンショット 2021-07-11 11.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/4d577236-34c9-813f-3fb5-65a8b042a9a6.png)
Perlって何ですか？【初心者】

# <font color="#1dc244">Perlを知らない人へ</font>
私も知りません。恥ずかしながら、この間初めて「Perl」という単語を知りました。
なので急いでこの記事を作成しました。一緒に勉強していきましょう

# <font color="#1dc244">よく見る「Perlについて」</font>
ラリー・ウォールさんが開発した、サーバサイドプログラミング言語
～特徴～
　①　テキスト処理に優れている（文字と数値を自動的に変換してくれるから）
　②　コンパイルが不要なため、すぐ実行できる。
　③　バージョンがアップデートされても、古いバージョンのコードが扱える（後方互換性）
　④　コードが読みやすく、何が書かれているか分かる（可読性）
　⑤　CPANモジュールが豊富（←なにそれ…）
　　　・モジュールとは
　　　　他のプログラミング言語では「ライブラリ」「クラス」。
　　　　誰かが作成した便利なものを、誰でも使えるように公開したもの。
　　　・CPAN（シーパン）モジュールとは
　　　　Perlのモジュール。
　　　　
<font color="#1dc244">参考資料</font>

https://www.geekly.co.jp/column/cat-technology/1911_011/

https://allabout.co.jp/gm/gc/424432/




# <font color="#1dc244">私が知りたかった「Perlについて」</font>
webのサーバーサイドプログラミング、
ちょっとしたテキスト処理で使用することが多い。
Rubyとは違い、**Linuxの標準構成として、最初からすべてのサーバーに入っている。**

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10227521375

<br>
<br>
<br>
if の条件式とは(超基礎)

わかっているつもりであいまいだった基礎なので言語化しました。

条件によって処理を分けるためにifを使用する。
（使用方法：条件式にifを渡す）

**ifは基本的に「trueかfalseかを判断するもの」**
trueであれば、if直下の処理が実行！
falseであれば実行されない。

```.ruby
if true # trueという値そのもの
  puts "出力" # 実行される
end
if false # falseという値そのもの
  puts "出力" # 実行されない
end
plunkerでa-frame その4

# 概要

plnkerでa-frameやってみた。
boxをアニメーションで回して、もう一個は、そのローテーションを取得して回す。

# サンプルコード

```

function run() {
	let sceneEl = document.querySelector('a-scene');
	let box1 = sceneEl.querySelector('#box1');
	let box2 = sceneEl.querySelector('#box2');
	box2.object3D.rotation.copy(box1.object3D.rotation);
	requestAnimationFrame(run);
}
run();	

```

# 成果物

https://embed.plnkr.co/plunk/BkdQJTxM5TW42Ry8

以上。