OmniAICreator/Qiita-1.07M huggingface dataset:
Slackチャンネルで情報発信したら謎の組織と呼ばれなくなった



5分で読めます:point_up:

#はじめに：こんにちは
プラットフォーム事業本部（以下PF）のあおいと申します。
PFに所属して数年が経ちました。
ぺーぺーの私の投稿ですが
我が組織の情報発信についてお話しを少々させてください。


#異動前、そこは謎の組織と呼ばれていた

![PFの他事業コンサルチーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649937/3786cd19-c778-2715-63a7-047f84292bc4.png)


入社時は別の部署にいたのですが、その当時はPFは「謎の組織」と呼ばれていました。
####何やってるのかわかんない、急に話が飛んでくる、と…
所属してなんとなく仕事内容が掴めてきたとき、
プラットフォーム事業本部
**やろうとしていること/やっていること/やったこと** がたくさんあることに気づきました。
サイトの基幹機能を多く担っているので、その分、多くの作業をしなくてはいけないし、影響も大きい。
都度、適度に、発信しておかないと、
うまく調整できなかったり、せっかく良きものを作って提供していても、
知らなくて、実際使うときに手間になったり、使えなかったり。

やろうとしていることも含めて、適切な情報量で、先行して発信しておくことが
**効率的な開発かつ利益貢献になるはずだ！**ということで
動いてみることにしたのが、私が所属する<code>他事業コンサルチーム</code>です。
謎の組織とは言わせない！という決意のもと、
いろいろとPF以外のみなさんとコンタクト取ってみることにしました。
<code>（他事業コンサルチームについてはまたどこかでお話しします。）</code>




#【やってみたその1】　対面での定期MTG開催
初めにやってみたのは**対面でのMTG開催**です。
メリットは、PF組織内の動きを発信できることは前提で
心理的距離も近づき、相手のちょっとした要望も吸い上げられること。
その場で解決できることもあるので、調査コストも下げることができていたと思います。

デメリットは、コスパです。
定期MTGの開催コストが高いわりに
他事業コンサルチームメンバー1人につき数人の社員にしか情報を伝えられない。
そして、アジェンダの用意やスケジュール調整などがちょっと手間。
また特に相談がない（お互い発信し尽くしていたり開発に集中したい時期など）の場合は
MTG時間そのものがもったいない。
当時はチームのメンバーが少なくなるタイミングだったので
他に優先すべき業務のために定期MTG時代は幕を閉じました…



#【やってみたその2】　情報発信専用チャンネルの作成

![情報発信chの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649937/69e9000a-3703-ffcb-2f0b-3b26a74ee750.png)


その当時、プロダクト開発者も情報発信を行うことはしていたのですが
定期MTGにて
>「どのチャンネルをみたらいいのか分からない」
>「チャンネルを探して見に行くのが手間だなあ」

という要望を受け取っていました。
しかし、プロダクト開発者が展開している情報は、機能を利用する技術者が欲しい情報です。
PF機能利用の開発者には、ぜひ見て欲しいもの。

ではこの情報を直接流して、直接キャッチしてもらえばいいじゃないか……！
情報を収集して！アジェンダ作成して！MTGで私たちが介在して伝えるよりも！
タイムロスもなく、わかりやすいのでは…………！

そうして誕生したのが、PFの情報を一元化して流すチャンネルその名も「#times_pf」です。

このチャンネルを見れば、PFの情報がわかる。
このチャンネルに投稿すれば、PFの情報を知りたい人がキャッチできる。

あわせて、プロダクト開発者が既存のチャンネルで発信することを止めず、
プロダクトのチャンネルにて投稿したものも
SlackAPIを利用して、特定のスタンプを押せばtimes_pfに投稿されるようにしたり、

また別のスタンプを押せばConfluenceへアーカイブページを作成するようにし
Slack上だと流れてしまうものもページとしてストックできるようにしました。

>Slackの技術についてはこちらでお話ししています！
>_[業務効率化のためのSlack活用術 ～他事業部コンサル編～_DMM.inside](https://inside.dmm.com/entry/2020/01/06/tako-operational-efficiency)_
>2021/09/14追記



#組織内の情報発信が定着
現在もこのチャンネルは活用しており
PF提供機能に関して、新機能追加や不具合改修のリリース連絡をしたり
新規プロジェクトのキックオフ連絡、進捗状況連絡、効果測定の結果報告など
プロダクト開発者だけでなく部長メンバーからも重宝いただいてます。
やったね！


チャンネル作成当初は、読者を増やすため定期MTGにてプレゼン＆チャンネル招待で地道に増やしていきましたが
現在は各月の新入社員メンバーの方へPF説明会を行っていますので、その参加者を招待していき
毎月平均15名ほど増やすサイクルをしています。
>PF説明会とは
>_[プラットフォーム認知度を上げるための「オンボーディング」のすすめ](https://qiita.com/emi-hayashi/items/11b379a5248c7f9a5587)_

現在はPFメンバーを除き、1000名ほどがチャンネルに入っているため
同時に多くの他部署の方々にアプローチすることができるようになりました。

地道に定期MTGを行っていたときよりも遥かに影響力があり、コスパも最強です。
（もっともっと重要な情報はエスカレーションして、適切に展開するようにはしています。）

#謎の組織と呼ばれなくなった！
対面MTGの実施やチャンネルの作成などでプラットフォーム事業本部の情報発信を行うようになってから
「何やってるかわからない謎の組織だよね」という言葉は聞かなくなりました。
私がPF内の人間になったなど、別の要因もあるかもしれませんが…

#おわりに
ビジネス上、一緒に戦っていく仲間同士で”お互い今何をやっているのか”を知ることは
非常に大切なことだと思っています。
秘密にすることでのメリットより、デメリットの方が多い気がします。
現在コロナ禍でのリモート作業が続いているので
また謎の組織なんて言われないように、適切な情報発信は続けようと思っております。

ここまで読んでくださった方、お時間頂戴し、ありがとうございました。
ポエムで失礼しました。読んでくださった方のお助けになれば幸いです。
ruby on rails6にbootstrapを導入　

#ruby on rails にbootstrapを使うときのコマンド

rails等のバージョン
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x64-mingw32]
Rails 6.1.4.1
```yarn add jquery bootstrap popper.js```
だと最新になると動作しなかったので4.5.3に指定した。


#これ
```
yarn add jquery bootstrap@4.5.3 popper.js
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987832/ca6fd834-0072-8eb5-cb97-8c0488846687.png)

完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987832/e4c72068-8dfc-7784-bda4-00a570abe0b3.png)



#config/webpack/environment.jsにコード追加
importやrequireを使わずに$やBootstrapのJavaScriptを使えるようにする

```js
const webpack = require('webpack')
environment.plugins.append(
  'Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery',
    Popper: ['popper.js', 'default']
  })
)
```

#app/javascript直下にstylesheets/application.scssを作成

stylesheetsというフォルダを作り、application.scssというファイルを作成でOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987832/02388185-ca0a-882d-8e9c-d40b2c5ce955.png)

あとはファイル内に

```
@import "~bootstrap/scss/bootstrap";
````
と書き込んで完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987832/3fe6523a-fa5e-c7cd-865f-6b1c2eb8be65.png)


#Bootstrapを使えるようにする
次にapp/javascript/packs/application.jsにコードを書き込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987832/40dec03c-ecc6-389f-84c3-f15f53dca9a7.png)

```js
import 'bootstrap';
import '../stylesheets/application';
```
ns-3.34 をwindows上にてDocker+WSL2経由で動かす

# はじめに
ns-3 はネットワークシミュレータであり，研究などでよく用いられます．
環境構築が少し面倒ということもあり，下記の記事のようにDockerでの環境構築が紹介されています．
[ns-3.30用にDockerコンテナを立てた話](https://qiita.com/RIckyBan/items/e21ff6e3c44bc603a85c "ns-3.30用にDockerコンテナを立てた話")

しかし，Windows用いた環境構築方法の記事は少なく，せっかくDockerで利用できるようにしている方がいるならWindows上で利用したいものです．
今回はこのようにWindows上でVisualizerによる表示ができるようにするところまでをご紹介します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510882/54763bd2-36a9-8ed5-8cbc-03b305f75a40.png)

なお，この記事によって起きた損害等の責任は一切負いませんので，自己判断にて参考にしてください．
# 前提条件
以下のものをインストール・セットアップしている必要があります．
1. [Docker Desktop](https://www.docker.com/products/docker-desktop)
2. WSL2上で動作するUbuntu

（つまり，WSL2上でdockerコマンドが使えるようになっている必要があります．）

# インストール手順
今回利用するDockerFile等のソースコードは以下の記事にて紹介されているレポジトリをフォークし，記事作成時の最新バージョン(ns-3.34)用に書き換えたものになっています．そのため，DockerFile等の詳細については以下の記事を参照いただき，自己責任にてご利用ください．
なお，ns-3.30でよい方は下の記事の手順でDocker イメージを作成する手順まで行い，当記事の「WindowsにVcXsrvをインストール」の部分から作業してください．
[ns-3.30用にDockerコンテナを立てた話](https://qiita.com/RIckyBan/items/e21ff6e3c44bc603a85c "ns-3.30用にDockerコンテナを立てた話")

以下ns3.34を利用する方向けです．
## ns-3.34のDocker イメージの作成
WSL2上のUbuntuの任意のディレクトリにて，以下を実行してレポジトリをクローンします．その後，v3.34ブランチを利用します．

```
$ git clone https://github.com/takonasu/ns3-docker.git
$ cd ns3-docker
$ git checkout v3.34
```

その後，Docker イメージをビルドをするため， makeコマンドを利用します．
PCのスペックによりますが，30-60分程度かかります．

```
$ cd ns3-docker-34
$ make
```

## WindowsにVcXsrvをインストール
[sourceforge.net](https://sourceforge.net/projects/vcxsrv/) より，VcXsrvをインストールします．
インストールの詳細は以下の記事が参考になります．この記事を参考にWindowsにVcXsrvをインストールしてください．
[Windows10のWSLでX11アプリケーションを実行してみた](https://dev.classmethod.jp/articles/wsl-x-window/)
インストール後，Xlaunchを起動しておきます．

## Docker イメージの実行
WSL2上で，makefileファイルがあるディレクトリ（ns3-docker-34）に移動後，

```
$ make run
```

を実行することで，Dockerコンテナを起動し中に入ることができます．
Dockerコンテナ内で以下のコマンドを実行し，環境変数にホスト（Windows）のIPアドレスを設定します．
以下のコマンドのIPアドレスは適宜書き換えてください．

```
# export DISPLAY=192.168.10.11:0.0
```
その後，ns-3のwafファイルがあるディレクトリに移動してサンプルコードを実行します．

```
# cd /usr/ns-allinone-3.34/ns-3.34
# ./waf --pyrun src/flow-monitor/examples/wifi-olsr-flowmon.py --vis 
```

以下のようにVisualizerが起動すればひとまず成功です．お疲れさまでした．
モジュール等のエラーは各自修正してみてください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510882/54763bd2-36a9-8ed5-8cbc-03b305f75a40.png)

# 参考文献
https://qiita.com/RIckyBan/items/e21ff6e3c44bc603a85c

https://dev.classmethod.jp/articles/wsl-x-window/

# あとがき
Ubuntu 20.04のDocker イメージを使うとVisualizerの依存関係にあるライブラリがすんなり入ってくれないので18.04のサポート期間中はおとなしく18.04使ったほうが楽です．
確率(練習)

### 確率
事象$A$が発生する確率を$P(A)$と表記する。

### 余事象の確率
事象$A$が発生しない確率を事象$A$の余事象といい、$\bar{A}$と表記する。  
事象$A$の確率と余事象$\bar{A}$の確率の関係は以下のとおりである。
$$P(\bar{A})=1-P(A)$$

### 確率密度関数
確率密度関数は連続系の確率分布をモデル化した関数のことである。  
確率密度関数$p(x)$を事象$x$で積分することで確率$P(x)$を導出できる。
$$P(x)=\int_{-∞}^{∞}p(x)dx$$

### 確率質量関数
確率質量関数は離散系の確率分布をモデル化した関数のことであり、$P(x)$と表記する。

### 期待値
期待値は確率密度関数$p(x)$において事象$x$が発生したときの得られる値$f(x)$の平均値のことである。  
表記は$<>$と$E$を使う2つのパターンが存在する。

```math
\begin{align}
<f(x)>_{p(x)}&=E_{p(x)}[f(x)]\\
&=\int_{-∞}^{∞}f(x)p(x)dx
\end{align}
```

期待値は線形性をもっているため、以下の式が成り立つ。

```math
<f(x)+\alpha g(x)>_{p(x)}=<f(x)>_{p(x)}+\alpha<g(x)>_{p(x)}
```

### 条件付き確率
条件$B$における事象$A$が発生する確率を条件付き確率$P(A|B)$と表記する。

### 同時確率
確率$P(x,y)$を考える。  
$P(x=a,y=b)$を$x=a,y=b$の同時確率という。

### 独立
事象$A$と事象$B$が互いに独立とは、発生した事象$A$の結果が事象$B$に影響しないこと、発生した事象$B$の結果が事象$A$に影響しないことをいう。

### 加法定理
事象$A$の発生確率を$P(A)$、事象$B$の発生確率を$P(B)$とすると、事象$A$と事象$B$が同時に発生する確率は$P(A \cap B)$となる。  
また、事象$A$または事象$B$が発生する確率は$P(A \cup B)$となる。
このとき以下の式が成り立つ。

```math
P(A\cup B) = \left\{
\begin{array}{ll}
P(A) + P(B)&(事象Aと事象Bは互いに独立である) \\
P(A) + P(B) - P(A \cap B)&(事象Aと事象Bは互いに独立でない)
\end{array}
\right.
```

交換法則も成立する。
$$P(A)+P(B)=P(B)+P(A)$$

### 乗法定理
事象$A$の発生確率を$P(A)$、事象$B$の発生確率を$P(B)$とする。

```math
P(A \cap B) = \left\{
\begin{array}
P(A)・P(B)&(事象Aと事象Bは互いに独立である)\\
P(A|B)・P(B)=P(B|A)・P(A)&(事象Aと事象Bは互いに独立でない)
\end{array}
\right.
```

交換法則も成立する。
$$P(A)・P(B)=P(B)・P(A)$$

### 相互排他
ある事象$A$における結果$a_{0}$と結果$a_{1}$を考える。
この結果$a_{0}$と結果$a_{1}$が同時に発生しないことを相互排他という。

### 周辺化
確率密度関数$p(x,y)$を確率密度関数$p(x)$に変換すること。
$$p(x)=\int_{-∞}^{∞}p(x,y)dy$$
変換後の$p(x)$を周辺確率と呼ぶ。

### マルコフ性
未来の状態は現在の状態にのみ依存し過去の状態には依存しない、という性質のこと。

### ベイズの定理
事象$A$の発生確率を$P(A)$、事象$B$の発生確率を$P(B)$とする。

```math
\begin{align}
P(B|A)&=\frac{P(A|B)・P(B)}{P(A)}\\
&=\eta P(A/B)・P(B)
\end{align}
```

$\eta$は正規化のための係数である。
また、$P(B)$を事前確率、$P(B|A)$を事後確率という。

### ベイズネットワーク
事象$A$、事象$B$、事象$C$があるとする。
ベイズネットワークとは事象間の関係性を定義したもの。また、図示したもの。  
ベイズネットワークを考えることにより、事象間の関係性を整理できる。
#### 因果連鎖
事象$B$は事象$A$によって引き起こされ、事象$C$は事象$B$によって引き起こされるような関係性のこと。
もし事象$B$の結果が既知であるならば、事象$A$は事象$C$の結果に影響しない。これを「事象$C$に対する事象$A$への影響を事象$B$がブロックする」という。
ある事象がブロックを行うと、その事象の前後でネットワークを独立に考えることができる。
#### 共通利害網
事象$A$によって、事象$B$と事象$C$が引き起こされるような関係性のこと。
ナイーブベイズネットワーク、ベイズ分類とも呼ばれる。
#### 共通効果網
事象$A$と事象$B$によって事象$C$が引き起こされるような関係性のこと。  
事象$A$と事象$B$は互いに独立であるにも関わらず、事象$C$の結果を観測後に事象$A$または事象$B$を知ると、その結果によってもう一方の事象$A$または事象$B$の確率が変動する。
はじめてのJulia (5): ループ

# While
`while (条件)`と　`end`で挟まれたコードについて、指定した条件が成立する間実行する。

```jl
# 1から10まで順に出力する
n = 0
while n < 10
    n += 1
    println(n)
end
n
```


# for
`for in (iterable)`と　`end`で挟まれたコードについて、iterableの各要素について実行する。

```jl
# 1から10まで順に出力する
for i in 1:10
    println(n)
end
```

`for in (iterable)`の代わりに、`for = (iterable)`で始めても良い。 Matlabユーザー救済。

```jl
# 1から10まで順に出力する
for i = 1:10
    println(n)
end
```

以上。
Vite + Vue3 で.envの値を取得する方法

## 概要
Vite + Vue3で開発をしていて環境変数を利用しようとした際に詰まったのでメモ程度に残しておこうと思います。

## やり方

Vueでは値の接頭辞に `VUE_APP` というprefixを付ける事で、 `process.env` から値を呼び出す事が出来るようになります。

```
VUE_APP_BASE_URL=https://hoge
BASE_URL=https://hoge2
```

```js
console.log(process.env.VUE_APP_BASE_URL) // https://hoge
console.log(process.env.BASE_URL)         // undefined
```

ところが何度試しても`undefined`が返ってきてしまい、頭を悩ませてた所こちらの記事を見つけました。

https://vitejs.dev/guide/env-and-mode.html

どうやらViteでは `process.env` が利用できず、 `import.meta.env` というオブジェクトを通してenv値を取得する事が出来るようです。またVueと同じように接頭辞に `VITE` というprefixを付ける必要があります。

```
VITE_BASE_URL=https://hoge
BASE_URL=https://hoge2
```

```js
console.log(import.meta.env.VITE_BASE_URL) // https://hoge
console.log(import.meta.env.BASE_URL)      // undefined
```

## 参考

https://cli.vuejs.org/guide/mode-and-env.html#environment-variables

https://vitejs.dev/guide/env-and-mode.html
Velodyne ROS Driverのインストール

Velodyne社の3DLiDARをROSで利用するための，
ROSDriverのインストール方法についてメモ．

#環境
ubuntu 20.04.3LTS
ros noetic
（kinetic/melodicでもOK）

#インストール

ROS依存関係のインストール
※ROSバージョンに合わせて，　noetic→melodicなどに変更

```
sudo apt-get install ros-noetic-velodyne 
```

VelodyneDriverをgitから落とす．

```
cd ~/catkin_ws/src/ && git clone https://github.com/ros-drivers/velodyne.git 
```

必要なROSパッケージをインストール

```
cd ~/catkin_ws && rosdep install --from-paths src --ignore-src --rosdistro noetic -y 
```

catkin_makeでコンパイル
少し時間がかかるのでお茶でも飲む:tea:

```
cd ~/catkin_ws && catkin_make 
```

以上で，Velodyne ROS Driverのインストールは終了．

#（おまけ）Velodyneの設定

ここからは，実際のVLP*シリーズの設定となるので，
本記事では大きく取り扱わない．

VLPとPCをLANケーブルで接続し，
IPAアドレスを手動設定にする必要がある．

IPアドレス　　：192.168.1.100
ネットマスク　：255.255.255.0
ゲートウェイ　：0.0.0.0

にすればいい．以下，参考画像

![image](http://wiki.ros.org/velodyne/Tutorials/Getting%20Started%20with%20the%20Velodyne%20VLP16?action=AttachFile&do=get&target=gnome_page.png)

#参考

- [velodyne driver](https://github.com/ros-drivers/velodyne)
- [ROS Wiki/velodyne](https://wiki.ros.org/velodyne)
- [VLP16入門](http://wiki.ros.org/velodyne/Tutorials/Getting%20Started%20with%20the%20Velodyne%20VLP16)
【Mac】Docker+rails6+MySQLでの環境構築完全版

環境
---
MacOS Big Sur 11.5.2
ruby 3.0.2
rails 6.1.4
Docker 20.10.8
MySQL 8.0.23
ディレクトリ　myapp
全て現時点(2021/09/06)での最新バージョンです。

1.用意するファイル
---
・Dockerfile
・Gemfile
・Gemfile.lock
・entrypoint.sh
・docker-compose.yml

```Docker:Dockerfile
FROM ruby:3.0.2
RUN apt-get update -qq && apt-get install -y nodejs

# yarnパッケージ管理ツールをインストール
# https://classic.yarnpkg.com/en/docs/install/#debian-stable
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install yarn

WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
```
ここでyarnをインストールしておくのがポイントです。しないと後でwebpackerがインストールできずエラーになります。

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

Gemfile.lockは空のままで大丈夫です

```rails:entrypoint.sh
#!/bin/bash
  set -e

  # Remove a potentially pre-existing server.pid for Rails.
  rm -f /myapp/tmp/pids/server.pid

  # Then exec the container's main process (what's set as CMD in the Dockerfile).
  exec "$@"
```
```Docker:docker-compose.yml
version: "3"

services:
  db:
    image: mysql:8.0

    command: mysqld --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
    ports:
        - 3306:3306
    volumes:
      - ./tmp/db:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    environment:
      MYSQL_HOST: db
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
 ```
2.実行
---
```
$ docker-compose run web rails new . --force --no-deps --database=mysql
```
↓

```
$ docker-compose build
```
↓

ここでdatabase.ymlを編集します

```rails:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: <%= ENV.fetch("MYSQL_ROOT_PASSWORD", "root") %>
  host: db

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
```
パスワードなど設定した後データベースと接続します。

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

```
$ docker-compose up
```
終わったらlocalhost:3000とネットで検索すればこの画面が出てきます。
そしたら環境構築成功です！

![スクリーンショット 2021-09-06 13.25.32.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340036/c8e8c35d-f98a-6486-9649-7ba52c4a2002.jpeg)



おわりに
---
未経験でしかも初心者なのでかなり苦労しましたが必要な情報は以上だけでした
一人でも多くの方の役に立てば嬉しいです
[【Mac】Docker+rails6+postgreSQLでの環境構築完全版](https://qiita.com/minoppp411/items/73a11c1762835ac92d79)
PostgreSQLバージョンも作ったのでよかったら参考にしてください！
【javascript】stringのyyyy年mm月dd日をyyyymmddにフォーマットする。

業務の中でどうしても年月日表記のデータを数字だけの表記に変換したい。

例）
渡ってくるデータ　→　2021年09月06日(月)
変換後の値　　　　→　20210906
<h3>moment.jsを使用して変更</h3>

```html:index.html
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.js"></script>
</head>
<div id="date">2021年09月06日(月)</div>
<script>
var get_id = document.getElementById("date")
var get_value = get_id.textContent
console.log(moment(get_value, 'YYYYMMDD').format('YYYYMMDD')) //20210906
</script>
```
<hr>
<h3>replace()で変更</h3>
コメントにて　@gsw213　様より

```html:index.html
<div id="date">2021年09月06日(月)</div>
<script>
  const elem = document.getElementById('date');
  console.log(elem.textContent.replace(/\D/g, '')); // 20210906
</script>
```
AppEngineへのデプロイ権限

CIでAppEngineをデプロイするときのパーミッションの設定で少しハマったのでメモ。
以下のロールをデプロイで使用するサービスアカウントに付与する必要がある。

* Cloud Build 編集者
* Cloud Storage オブジェクト管理者
* App Engine 管理者

設定直後にデプロイしても失敗することがあり、反映までに少しだけタイムラグがある可能性がある。

参考
https://cloud.google.com/appengine/docs/standard/php7/roles?hl=ja#predefined_roles
Mac版CiscoPacketTracerバージョン8.0.1でモジュール追加できない問題

# 概要
Mac版Cisco Packet Tracer(以下、パケトレ)のバージョン8.0.1で、ルータのスロットにモジュールをドラッグアンドドロップできない現象が起こったため、調べても日本語の対応方法がのってなかったので書いておきます。

## 環境
PC:MacBook Air (13-inch, Early 2015)
OS:macOS Catalina バージョン10.15 (BigSurでも確認済み)
Packet Tracerバージョン:8.0.1

# 問題
ルータにシリアルモジュール(NIM-2T)などを追加しようとしてもドラッグアンドドロップができない


# 対処法

1. 新しくパケトレを開く
2. 「Command + S」か、タブのセーブボタンを押して、適当なファイル名でsavesフォルダに保存する。(/Users/(ユーザ名)/Cisco Packet Tracer 8.0.1/saves)
2. savesフォルダを開き、先ほどセーブしたpkaファイルをsavesフォルダからデスクトップなど別フォルダへ移動させる。
2. パケトレに戻り、モジュールがドラッグアンドドロップできるようになり、スロットへ追加できることを確認する。


# 参考
Cisco Packet Tracer 8.0.1 FAQ

https://www.netacad.com/sites/default/files/cisco-packet-tracer-faq.pdf

Drag n Drop Bug with Packet Tracer v8 - Cisco Community

https://community.cisco.com/t5/cisco-bug-discussions/drag-n-drop-bug-with-packet-tracer-v8/td-p/4296013
Effective Modern C++ のサンプルコードの誤り？

「Effective Modern C++」 は、名著 「Effective C++」 のC++11/C++14対応版で、こちらもためになる内容が多く何度も読み返しています。
その中で一点、掲載されているサンプルコード(というか解説？)に誤りがあるのではないかという点があります。

「項目3: decltypeを理解する」で decltype(auto) の解説で以下のようなコードが示されます。

```c++
template<typename Container, typename Index>
decltype(auto) authAndAccess(Container&& c, Index i)
{
  authenticateUser();
  return std::forward<Container>(c)[i];
}
```

このコードは、もともと引数cの型が`Container&`で左辺値参照であったコードから`Container&&`のユニヴァーサル参照に変更したもので、戻り値も`c[i]`だったものを`std::forward<Container>(c)[i]`に変更しており、「項目25の忠告にもあるように、テンプレートの実装にはユニヴァーサル参照をstd::forwardするように変更する必要があります。」と高らかに宣言しています。
ですが、よく見るとstd::forwardしているのはコンテナの`c`であり、return しているのは`c[i]`です。いくらcを完全転送たところで、返しているのはそのcの配列に含まれる要素の一つなので、これではstd::forwardしていないのと全く同じ事だと思えます。

実際、`c`自体は右辺値として転送されずこの関数終了時に削除されてしまうので、

```c++
auto&& hoge = authAndAccess(std::vector<int>{1, 2, 3}, 0);
std::cout << hoge << std::endl;
```

のようなコードはhogeが破棄された領域を参照しており、未定義動作になります。
もちろん、

```c++
auto hoge = authAndAccess(std::vector<int>{1, 2, 3}, 0);
```

のように書けば値がコピーされるので大丈夫ですが、それだとそもそも std::forward する必要が無いですよね。

C++の超有名な本を書く人でもすみずみまでは理解できないほど、C++は難しいという事の証左でしょうか。

## じゃあどう書けばいいのか

結局本来やりたかった事は、`c`に左辺値が渡された場合はコンテナの要素の参照を返し、右辺値が渡された場合はコンテナの要素をムーブして返したい、という事なのだと思います。上述した例は整数の配列なのでコピーでも問題ありませんが、巨大なオブジェクトだとコピーのオーバーヘッドを避けたいというのがあります。
じゃあこれを実現するためにはどう書けばいいのか、と頭をひねって絞り出したコードはこんな感じになりました。

```c++
template<typename Container, typename Index>
decltype(auto) authAndAccess(Container&& c, Index i)
{
  authenticateUser();
  if constexpr (std::is_lvalue_reference_v<Container>) {
    return c[i];
  } else {
    return typename Container::value_type(std::move(c[i]));
  }
}
```

std::is_lvalue_reference_vで左辺値が渡されたかどうかをチェックし、左辺値ならばコンテナ要素の参照を返し、右辺値なら新たにオブジェクトをムーブコンストラクタで生成して返す（RVOにより最適化されるので戻り値に直接ムーブコンストラクトされる）、というものです。（if constexpr を使うのでC++17が必要ですが…）

もっといい書き方がありそうです。
コンピュータとオセロ対戦2 ～ランダムに返す～

https://qiita.com/tt_and_tk/items/068f2afde6db637e189f

[前回の記事(普通にオセロ)](https://qiita.com/tt_and_tk/items/6346aaec7277fca4ad2c)

#今回の目標

オセロ対戦で、ランダムに打ち返してくるプログラムを作る

#ここから本編

基本的には[前回](https://qiita.com/tt_and_tk/items/6346aaec7277fca4ad2c)とほぼ同じです。
mainだけ変えます。

##基本戦略

ランダムに打ち返すといっても簡単ではありません。
ランダムに決めた場所に常に置けるとは限らないからです。
つまり、 <b>置ける場所の候補の中から</b> 、ランダムで選ばなければなりません。
そのためには

1. 盤面の一つ一つの場所を調べ、置ける場所を探す
2. 置ける場所をメモしておく
3. メモした場所からランダムに選ぶ

というステップが考えられます。
というかこれ、後々使います。
が、せっかくC言語使ってることですし楽しちゃいます。
ということで考えたのは、

1. ランダムに場所を選ぶ
2. そこがたまたま置けない位置だったら1に戻る、置けたら置く

です。
雑な方法ですが、C言語の速度なら一瞬で打ち返してきます。

##main

ほぼ[前回](https://qiita.com/tt_and_tk/items/6346aaec7277fca4ad2c)と同じ。
boradが盤面、turnがターンです。
また、コンピュータとの対戦なので「黒」、「白」がそれぞれ「あなた」、「わたし」に変わっています。コンピュータ目線なので「あなた」がプレイヤーです。
先攻、後攻はここでは変えられません。
プレイヤーのターンは[前回](https://qiita.com/tt_and_tk/items/6346aaec7277fca4ad2c)と同じ動作をします。
乱数を使っているのでtime.hは必須ですね。

```random.c
int main(){
    int line, col;
    bool my_check = true, old_check = true;
    srand((unsigned int)time(NULL));

    // check_allで反転させられるので
    turn = false;
    setup();
    print();

    long now = time(NULL);
    while ((my_check = check_all()) || all_none()){
        if (turn) printf("\nあなたのターンです\n");
        else printf("\nわたしのターンです\n");
        if (my_check){
            if (turn){
                que(&line, &col);
                while (!check(line, col)){
                    printf("その位置には置けません\n");
                    que(&line, &col);
                }
                put(line, col);
            }else{
                line = rand() % SIZE + 1, col = rand() % SIZE + 1;
                while (!check(line, col)){
                    line = rand() % SIZE + 1, col = rand() % SIZE + 1;
                }
                printf("行: %d\n列: %d\n", line, col);
                put(line, col);
            }
        }else{
            printf("置ける場所がありません\n");
        }
        if (!my_check && !old_check) break;
        old_check = my_check;
    }

    printf("\n試合時間: %ld秒\n", time(NULL) - now);
    count();

    return 0;
}
```

#フルバージョン

この中のrandom.cです。

https://github.com/TTaisei/osero

#実際にやってみる

強くはないですが、中盤で調子に乗って追いつめすぎると打てる手がなくなってきて負けたりします。
手加減しつつ戦うと勝てました。

#次回は

自分で考えて打ち返してもらいます。
一手先まで読んで打ち返すプログラムを考えます。
[次回](https://qiita.com/tt_and_tk/items/7ddb15af4609e55908d2)

https://qiita.com/tt_and_tk/items/068f2afde6db637e189f
レスポンシブ - その１ - 基本


# レスポンシブとは

# viewport

#### viewportとは

#### viewportの書き方

以下の`<meta`タグを`<head>`タグ内に記述します。

```html
<meta name="viewport" content="width=device-width,initial-scale=1">
```
こんな感じです。

```html
<!DOCTYPE html>
<html lang="ja">
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# website: http://ogp.me/ns/website#">
  <meta charset="utf-8" />
  <!-- ここに記述します。 -->  
  <meta name="viewport" content="width=device-width, initial-scale=1" />    
</head>
<body>
  <header>
  </header>
  <main>
  </main>
  <footer>
  </footer>
</body>
</html>
```




# メディアクエリ（Media Queries）

#### メディアクエリとは
パソコンやスマートフォン、タブレットなど画面サイズ（解像度）が異なるデバイス毎にCSSのスタイルを振り分けるためのタグです。
レスポンシブなWEBサイトを構築するためには必須のタグです。

# ブレークポイント

#### ブレークポイントとは
メディアクエリを使ってデバイス毎に適応させるCSSスタイルを切り替えるポイント（主に横幅）を「ブレイクポイント」と言います。


# モバイルファーストの書き方

Googleは、とにかく「モバイルファースト」を推奨、推進している。らしいです。

# PCファーストの書き方
PropertyWrapper

PropertyWrapper
--
Property Wrappers とは、プロパティにアクセスする際に制限をするのを簡単にしてくれるもの。
制限方法はboiler plateと呼ばれる内部変数を事前に定義しておいて、そこにcomputedPropertyを通してアクセスする方法が存在する。（setter、getterを組み合わせる）ただ、これはどうしても長い書き方になってしまう。
そのためpropertyWrapperを使用することで短く書くことができる。

```swift:お魚&どうぶつ.swift
struct FishAndAnimal {
    //おさかな
    private var _fish: Int = 0
    var fish: Int {
        get { return _fish }
        set { _fish = min(20, max(0, newValue)) }
    }
    
    /// どうぶつ
    private var _animal: Int = 0
    var animal: Int {
        get { return _animal }
        set { _animal = min(20, max(0, newValue)) }
    }
}
```
おさかなとどうぶつ構造体はどちらもget,setを使って、20匹以上入らないように設定している。現在は動物と魚だけだがこれがどんどん増えていけば、同じgetとsetをかきつづけるのはわかりにくいし大変。。

@propertyWrapper使用する場合

```swift
@propertyWrapper
struct Count {
    
    private var value: Int

    init() {
        value = 0
    }
    
    var wrappedValue: Int {
        get { return value }
        set { value = min(20, max(0, newValue)) }
    }
}

struct FishAndAnimal {
    /// おさかな
    @Count var fish: Int
    
    /// 動物
    @Count var animal: Int
}
```

上記の例の様にwrappedValue(内部変数）にアクセスする際にFishAndAnimaｌのコンピューテッドプロパティを経由してアクセスする　。直感的でわかりやすい書き方ができるというもの。構造体であるFishAndAnialのプロパティfishは存在はしているが値自体はCount構造体をwrappedValueに保存している形になる。この保存先（WrappedValue）とアクセスする際のコンピューテッドプロパティ（fishやanimal)の型は一緒でなければならない。

WrapperValue以外にprojectedValueというものも存在する。
コンピューテッドプロパティに$をつけることでアクセスできる。アクセス制限の値を自由に変更する追加機能を実装できる
AngularCLIを実行する際に、CLI分析データの収集するかどうかの質問を非表示にする


## はじめに
AngularCLIを実行する際に、CLI分析データの収集するかどうかの質問が表示されるのが面倒だったので表示されないようにしました！
>ユーザーは ng analytics CLIコマンド を使用して、Angular CLIの使用状況データを Google Analytics と共有することを選択できます。 データはAngularチームと共有され、CLIを改善するために使用されます。

上記のようにAngularのプロジェクトではCLIの使用状況を収集するかどうか選択できます。

AngularCLIを実行した際に以下のような質問が表示されます。

```bash
? Would you like to share anonymous usage data about this project with the Angular Team at
Google under Google’s Privacy Policy at https://policies.google.com/privacy? For more
details and how to change this setting, see https://angular.io/analytics. (y/N) 
```

上記質問で「No」を選択するとangular.jsonに以下の変更が加わります。

```json
 "cli": {
    "analytics": false,
  }
```

## 何が面倒だったのか？
僕が実務で触っているAnuglarプロフジェクトでは、元々angular.jsonの"cli"に"analytics"という項目は存在していませんでした。
(※ trueかfalseかどちらかはある認識なので、何故ないのかは分かっていません。。 知っている方いたら是非コメントに！！)

上記質問で「No」を選択すると gitの変更にangular.jsonが加わりcommitする際に面倒だった！

## 何をしたか？
結論としては、下記環境変数を設定することで質問が非表示になりました！

```bash
export NG_CLI_ANALYTICS="false"
```

検索してみると下記のように他の環境変数の値が異なるものもいくつか見当たりましたが、僕の環境ではfalseで動作しました。

```bash
export NG_CLI_ANALYTICS=cli

export NG_CLI_ANALYTICS=off
```
僕はzshを使用しているので、この環境変数を `~/.zshrc`に記述しました。
下記コマンドを実行したら上記質問は表示されなくなりました！

```zsh
source ~/.zshrc
```

簡単ですが以上です!
何かありましたら、コメント頂けると大変喜びます:v:
パーミッション(chmod)について

#アルファベットの意味

※ r w x　を覚えて足し算すれば、OK。

| アルファベット | ビット値 | 権限 |
|:-:|:-:|:-:|
| r  | 4  | 読み出し可能  |
| w  | 2  | 書き込み可能  |
| x  | 1  | 実行可能 |
| -  | 0  | 権限なし  |
|  |  |  |
| rw  | 6(4+2)  | 読み&書き可能 |
| rwx  | 7(4+2+1)  | 全て許可 |
| r-x  | 5(4+1)  | 読み&実行可能 |

#llコマンド

```.bash

$ ll

:
:
lrwxrwxrwx.  1 root   root       14  9月 19  2019 redhat-release -> centos-release
-rw-r--r--   1 root   root      269  6月  4 10:50 resolv.conf
-rw-r--r--.  1 root   root     1634 12月 25  2012 rpc
drwxr-xr-x.  2 root   root     4096  2月 28  2020 rpm
:
:
```

__先頭文字__

| アルファベット | 意味 |
|:-:|:-:|
| d  | フォルダ  |
| -  | ファイル  |
| l  | シンボリックリンク  |

# 読み解いてみる!!!

__d__ rwx r-x r-x .

>フォルダ

d __rwx__ r-x r-x .

>所有者 に与えられた権限
>全て許可

drwx __r-x__ r-x .

>所有グループ に与えられた権限
>読み込みと実行のみ許可

d rwx r-x __r-x__ .

>その他全員 に与えられた権限
>読み込みと実行のみ許可

drwxr-xr-x.  2 __root__   root     4096  2月 28  2020 rpm

>所有者はroot

drwxr-xr-x.  2 root   __root__     4096  2月 28  2020 rpm

>所有グループはroot

drwxr-xr-x.  2 root   root     __4096__  2月 28  2020 rpm

>データサイズ（4096バイト）


#chmodコマンド

```.bash

#chmod モード 対象のファイル名
chmod 755 file.txt

-rwxr-xr-x

```
Ubuntuでjpドメインのwhoisの結果を日本語で出力するには

IaaS上のイメージから作成されたUbuntuをデフォルトのまま利用している場合や、文字化けなどのマルチバイトキャラクタ系のトラブル（例えばコンソールでの文字化け）を避けるために `LANG=C` や `LANG=en_US` などで運用している場合、whoisコマンドでjpドメインの結果を取得しようとすると、英語で返ってきます。

```
$ whois yahoo.co.jp

[ JPRS database provides information on network administration. Its use is    ]
[ restricted to network administration purposes. For further information,     ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e'     ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'.                 ]

Domain Information:
a. [Domain Name]                YAHOO.CO.JP
g. [Organization]               Yahoo Japan Corporation
l. [Organization Type]          Corporation
m. [Administrative Contact]     HT46858JP
n. [Technical Contact]          KM56800JP
p. [Name Server]                ns01.yahoo.co.jp
p. [Name Server]                ns02.yahoo.co.jp
p. [Name Server]                ns11.yahoo.co.jp
p. [Name Server]                ns12.yahoo.co.jp
s. [Signing Key]
[State]                         Connected (2021/09/30)
[Registered Date]               2019/09/27
[Connected Date]                2019/09/27
[Last Update]                   2020/10/01 01:02:24 (JST)
```

日本語でwhoisの結果を取得したい場合は、 `LANG=ja_JP whois <検索したいドメイン>` とすることで取得可能です。


```
$ LANG=ja_JP whois yahoo.co.jp

[ JPRS database provides information on network administration. Its use is    ]
[ restricted to network administration purposes. For further information,     ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e'     ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'.                 ]

Domain Information: [ドメイン情報]
a. [ドメイン名]                 YAHOO.CO.JP
e. [そしきめい]                 やふーかぶしきがいしゃ
f. [組織名]                     ヤフー株式会社
g. [Organization]               Yahoo Japan Corporation
k. [組織種別]                   株式会社
l. [Organization Type]          Corporation
m. [登録担当者]                 HT46858JP
n. [技術連絡担当者]             KM56800JP
p. [ネームサーバ]               ns01.yahoo.co.jp
p. [ネームサーバ]               ns02.yahoo.co.jp
p. [ネームサーバ]               ns11.yahoo.co.jp
p. [ネームサーバ]               ns12.yahoo.co.jp
s. [署名鍵]
[状態]                          Connected (2021/09/30)
[登録年月日]                    2019/09/27
[接続年月日]                    2019/09/27
[最終更新]                      2020/10/01 01:02:24 (JST)

```
サーバーにデプロイしたjavaWebAPとDBの接続

##MySQLにAP専用ユーザーとデータベース、テーブルを作成する
【本忘備録目的】
SpringBootで作成したjavaWebAPをサーバー側にデプロイしたのち、そのjavaWebAPと連携するDBを構築する。

|環境||
|----|----|----|
|OS|Linux ubuntu20.04|
|Web_S|apache|
|App_S|tomcat|
|DB_S|MySQL|

###ポイント
* サーバー側のMySQLにAP用の**ユーザー**や**DB,パスワード**等を設定する。
* **AP側の**DBに関するプロパティファイルの**内容**(DBユーザー名とパスワード)**をサーバー側の内容と合ううように変更する**。

```
sudo mysql
```
>* MySQL 5.7（またそれ以降のバージョン）を実行しているUbuntuシステムでは、rootMySQLユーザーはデフォルトによりパスワードではなくauth_socketプラグインを使用して認証するように設定されています。【中略】
* root MySQLユーザーにアクセスできるようにするには **sudo権限でmysqlを呼び出す必要があります。**<br>
(参考)https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04-ja

##MySQLにAP専用ユーザー作成
```
CREATE USER 'AP専用ユーザー'@'%' IDENTIFIED WITH mysql_native_password BY '任意のパスワード';
```
### @'%'はホスト名を表す。 
以下詳細 
https://qiita.com/YuichiTanaka007/items/f31f94ace4bac0aaf990#%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D

##MySQLにAP専用ユーザーにグローバル権限を付与する
専用ユーザーでDBやテーブルの作成等ができるようにグローバル権限を付与する


```
GRANT ALL ON 特定のDB名.* TO 'AP専用ユーザー'@'%';
```
### GRANT ALL ON 特定のDB名.* TO 'AP専用ユーザー'@'%';
|部分|説明|備考|
|----|----|----|
|GRANT|権限を与える||
|ALL|グローバル権限||
|ON 特定のDB名.*|特定のDBの全ての権限|ON db_name.* 構文|
|'AP専用ユーザー'@'%';|AP専用ユーザーに対して||
【ポイント】
・「特定のDB名」はこれから作るDB名を指定してOK。
・ 先にGRANTしないと権限がないので、DB等の作成ができない。

https://dev.mysql.com/doc/refman/5.6/ja/grant.html
【令和も対応】PHPで和暦⇔西暦変換


西暦を和暦に変換する処理を書く機会があって、また必要になるかも。
と思い、汎用的に使い回せるよう、関数を作成してみました。

PHPで、西暦⇔和暦変換をする機会のある方は、参考にしてください。
そんな難しくないです。

# PHPで西暦 → 和暦

```php:wareki.php
// 西暦 => 和暦
function wareki($year) {

    $eras = array(
        array('year' => 2018, 'name' => '令和'),
        array('year' => 1988, 'name' => '平成'),
        array('year' => 1925, 'name' => '昭和'),
        array('year' => 1911, 'name' => '大正'),
        array('year' => 1867, 'name' => '明治')
    );

    foreach($eras as $era) {
        if ($year > $era['year']) {
            $era_year = $year - $era['year'];
            return $era['name'] . ($era_year === 1 ? '元年' : $era_year . '年');
        }
    }

    return null;
}

echo wareki(2019); // 令和元年
```

# PHPで和暦 → 西暦

```php:seireki.php
// 和暦 => 西暦
function seireki($wareki_year) {
    $wareki_year = str_replace('元年', '1年', mb_convert_kana($wareki_year, 'n'));

    $era_start_years = array(
        '明治' => 1867,
        '大正' => 1911,
        '昭和' => 1925,
        '平成' => 1988,
        '令和' => 2018
    );

    if(preg_match('!^(明治|大正|昭和|平成|令和)([0-9]+)年$!', $wareki_year, $matches)) {
        $era_name = $matches[1];
        $year = intval($matches[2]) + $era_start_years[$era_name];
        return $year . '年';
    }

    return null;
}

echo seireki('平成元年'); // 1989年

```

## その他の記事
**PHPで日、月、年の加算と減算方法**
https://qiita.com/thiagomatsui/items/619775a96dce38bc5060

## 参考サイト
https://blog.capilano-fw.com/?p=3307
Rで時系列データを作成する・可視化Tips

#Rで時系列データを作成する

## 目的 
- プレゼンや関数のテストで、時系列データのサンプルを手元で作成する
- Dateのシーケンスデータ作成のTips
- ggplot2による可視化のTips

## 手順
1. サンプルデータをdataframe型で作成
2. 作成したサンプルデータの確認 by ggplot2

## Tips
1-1. **as.Date()** を使用した時のseq()パラメータ設定
2-3. **floor_date()** を使用して日付データ"yyyy-mm-dd"を月頭の日別に集約して可視化


### 1-1. サンプルデータ(月別推移)の作成

```{r}
dat<-data_frame(
  date= seq(as.Date("2017-01-01"),
            length=48,#lengthで期間指定、
            by="months"),#byで単位指定
  y = rnorm(length(date), 1000,200)#適当な乱数をdateの数だけ作成
  )
```

### 1-2. サンプルデータをggplotで可視化

```{r}
#必要に応じてlibrary(tidyverse)
dat %>% 
  ggplot(aes( x=date, y = y))+
  geom_point()+
  geom_line()+
  ylim(c(0, max(dat$y)+50))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/80c81754-f35c-b9d8-fc75-65ab7ce5849d.png)


### 2-1. サンプルデータ（日別）を作成
```{r}
dat1<-data_frame(
  date= seq(as.Date("2017-01-01"),
        length=4*365,#length=365*4年分に設定
        by="day"),　#byはdayに設定
  y = rnorm(length(date), 1000, 100) ##適当な乱数をdateの数だけ作成
  )
```

### 2-2. サンプルデータ（日別）をggplotで可視化

```{r}
dat1 %>% 
  ggplot(aes( x=date, y = y))+
  geom_line(colour = "blue",alpha=0.5)+
  ylim(c(0, mean(dat1$y)*2))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/b67484f7-d9a5-2a61-98b3-c238f65cb673.png)



2-2のままだとみにくいので、
lubridateパッケージの**floor_date関数**を使って各月の初日の日付に変換して、月別に集約する。
**floor_data関数**は任意の日付を該当する月の初日を返してくれる。

### 2-3. サンプルデータ（日別）を月別にまとめて可視化
```{r}
#floor_date（）の確認
#"month"で月を指定して、月の初日を返してくれる
#"year"にすると、年の初日を返す。
floor_date(ymd("2021-03-14"),"month")
>[1] "2021-03-01"
floor_date(ymd("2021-03-14"),"year")
>[1] "2021-01-01"

dat1 %>% 
  mutate(ym = floor_date(dat1$date,unit = "month")) %>% 
  group_by(ym) %>% 
  summarise( ym_y = sum(y)) %>% 
  ggplot(aes( x=ym, y = ym_y))+
  geom_point(colour = "blue",alpha=0.5)+
  geom_line(colour = "blue",alpha=0.5)+
  ylim(c(0, mean(dat1$ym_y)*2))

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349193/19c04182-7a12-b888-db74-349f138e3fe2.png)

### 追記：日付ラベルの調整
scale_x_date()を使用して、date_breaks, date_labels等を使用して、調整する。

```{r}
scale_x_date(date_breaks = "3 day",
               date_labels = "%m/%d"
                 )
```
【Python】毎日Pythonを自動実行するタスクスケジューラを設定してみた

#はじめに
Pythonを使って様々な作業を自動化を進めている方、
「Pythonの実行を自動化」しないと毎日Pythonのプログラムをクリックしないといけません。
例えば先日書いた以下の記事も同様です。

https://qiita.com/hirockio2206/items/eef70ae578d425e9f479

そこでWindows10の場合は、標準で「タスクスケジューラ」というアプリが入っていますのでこれを活用します。
意外設定にとクセがあるので、私がいま成功している設定をお伝えしますのでご参考になれば幸いです。

#環境
・python3.7
・windows10

#タスクスケジューラ
私が設定しているタスクスケジューラの設定を記載します。
ユーザ名などはご自身のアカウントに変更をお願いします。

####1.[全般]タブ
**名前**：任意の名前にします。(例：HP_CHECK)
**説明**：タスクの説明を記載します。(例：abc幼稚園のHPに更新情報がないかチェックします。)
**セキュリティオプション**：
**タスク実行時に使うユーザアカウント**：管理者権限をもっているユーザを指定します。(例：hirockio)
　●ユーザーがログオンしているかどうかにかかわらず実行する
　☑最上位の特権で実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/356453fa-1fa6-08b6-96ee-6cbd38425190.png)

####2.[トリガー]タブ
実行するスケジュールを記載します。
**設定**：●毎日
**開始**：本日日付以降を指定します。(例：2020/04/01)
**時間**：毎日実行する時間を指定します。(例：8:43:00)
**間隔**：実行間隔を指定します。(例：１日）
**詳細設定**：☑有効　にチェックをいれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/d4325f10-0621-0184-77e8-c0a5cc690325.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/cb42e6f0-1ace-0520-8570-14f94e5f3f2f.png)

####3.[操作]タブ
実行するPythonのプログラムを指定します。
**操作**：プログラムの開始
**設定**：プログラム/スクリプト
Pythonがインストールされた場所を指定します。
例：C:\Users\hirockio\AppData\Local\Programs\Python\Python37\python.exe

**引数の追加**：プログラム名を記載します。（例：HP.py）
**開始**：配置したプログラムの場所を指定します。(C:\Python\\)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/7597b9dc-1ac5-abb9-3731-763b9a24986e.png)

####4.[条件]タブ
**電源**：☑タスクの実行するためにスリープを解除する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/3a2a74a7-5289-b5fe-d0ec-36abcb86b2ec.png)

####5.[設定]タブ
☑タスクを要求時に実行する
☑タスクが停止するまでの時間　[3日間]
☑要求時に実行中のタスクが終了しない場合、タスクを強制的に停止する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/3ca41810-bf11-bb0d-098a-5329652a069f.png)

#最後に
PCがシャットダウンしているとタスクが実行されませんが、スリープ状態であればタスクは実行されます。「電源とスリープ設定」でタスクが実行される時間にPCがシャットダウンされない設定になっているかご確認下さい。
ご参考になれば幸いです。
Rspec  Userモデルの単体テストの手順


テストコードの備忘録として記事を
書かせていただきます！！


①バリデーションの設定を行う
-----
ここではバリデーションに関するテストを実装致します。

②Gemを追加
------
gemfileに
 gem 'rspec-rails', '~> 4.0.0'　　　を追加で記述


````
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails', '~> 4.0.0'
end
`````


group :development, :testというグループの中に記述。
そうすることで、Gemの動作に制限をもたせる。


③bundle installを実行
--------
ディレクトリの確認を忘れずに

````
bundle install
`````

④Rspecインストール
------
```
rails g rspec:install
````
ターミナル内で生成されるファイルがこれ

create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb

⑤.rspecに設定を追加
-------
この記述を行うとテストコードの結果をターミナル内でわかりやすく表示されるようになる。

````
--require spec_helper
--format documentation
`````

⑥テストコードを記述するファイルの準備
------------

````
rails g rspec:model user
`````

実行後、create  spec/models/user_spec.rb
がターミナル内で生成される。、
今回はユーザーコードの単体テストのみなので、
ユーザーモデルのテストコード用のファイルを用意します。

 ⑦eampleを整理する
--------
テストコードを書くときは正常系と異常系で分ける。
例→どの時に新規登録ができて、どのようなときにできないのかを考える
うまくいくときが正常系で
うまくいかないときが異常系。
それを分けるためには*context*で分ける！


↓create spec/models/user_spec.rbに記述する。

````
require 'rails_helper'
describe User do
  before do
    @user = FactoryBot.build(:user)
  end

  describe 'ユーザー新規登録' do
    context '新規登録がうまくいくとき' do
      it "nicknameとemail、passwordとpassword_confirmationが存在すれば登録できる" do
      end
      it "nicknameが6文字以下で登録できる" do
      end
      it "passwordが6文字以上であれば登録できる" do
      end
    end

    context '新規登録がうまくいかないとき' do
     it "nicknameが空だと登録できない" do
      end
      it "nicknameが7文字以上であれば登録できない" do
      end
      it "emailが空では登録できない" do
      end
      it "重複したemailが存在する場合登録できない" do
      end
      it "passwordが空では登録できない" do
      end
      it "passwordが5文字以下であれば登録できない" do
      end
      it "passwordが存在してもpassword_confirmationが空では登録できない" do
      end
    end
  end
end

```



↓FactoryBotがランダムでユーザーネームを選んでくれる記述


```
@user = FactoryBot.build(:user)

```

describeとは、テストコードのグループ分けを行うメソッド
「どの機能に対してのテストを行うか」をdescribeでグループ分けし、その中に各テストコードを記述.

describeにつづくdo~endの間に、さらにdescribeメソッドを記述することで、入れ子構造をとることもできる。

```
describe 'ユーザー新規登録' do
````
itメソッドは、describeメソッド同様に、グループ分けを行うメソッド。
itの場合はより詳細に、「describeメソッドに記述した機能において、どのような状況のテストを行うか」を明記する。

````
it "nicknameが7文字以上であれば登録できない" do
      end
`````

↓続きはこちらになります。

https://qiita.com/wwaattaa/items/1b24fbfece296aaf4a71
【EC2】EC2にrailsのアプリをデプロイする方法 No.2（デプロイ）

# はじめに
それでは前回に引き続き、EC2を使ってrailsのアプリをデプロイしたいと思います。
前回はEC2の環境構築までを行いました。

これまでの工程について、まだ実装されていない方はこちらの記事をぜひご覧ください

https://qiita.com/kenta-nishimoto-1111/items/86ba0156c71b91dbc999

https://qiita.com/kenta-nishimoto-1111/items/4760bc02a6dfa40db035

https://qiita.com/kenta-nishimoto-1111/items/c6d4a899f4591430d242


それでは早速デプロイしていきます！

# 手順３　gitと連携をします

EC2インスタンスにアプリケーションのコードを送るためにはGithubを使います。
連携したGithubからEC2へクローンすることでデプロイをします。
そのためにGitHubとの接続設定をします。
ターミナルで下記のコマンドを実行します。

```:gitの連携
[ec2-user@ip-172-31-23-189 www]$ git clone リポジトリURL
```

リポジトリURLはご自身のGitHubのページで確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623096/d3facf47-3bb0-93e8-3782-d285283a00bb.png)

Githubのアカウント名とPWを入力し、
ダウロードが開始されます

```
remote: Enumerating objects: 298, done.
remote: Counting objects: 100% (298/298), done.
remote: Compressing objects: 100% (190/190), done.
remote: Total 298 (delta 109), reused 274 (delta 86), pack-reused 0
Receiving objects: 100% (298/298), 58.53 KiB | 365.00 KiB/s, done.
Resolving deltas: 100% (109/109), done.
```

完了

これで、EC2にAppがクローンされています。


# 手順4 アセットファイルをコンパイルします
まずはcssやJavaScript、画像ファイルのコンパイルを行います。
ローカル環境ではこの作業は不要でしたが、本番環境では処理速度の関係で自動的に行われないので随時行う必要があります。
下記のコマンドでアセットファイルをコンパイルします。

```:アセットファイルのコンパイル
# クローンしたアプリのディレクトリに移動
[ec2-user@ip-172-31-47-9 ~]$ cd /var/www/レポジトリ名
# アセットファイルのコンパイルを実行
[ec2-user@ip-172-31-47-9 レポジトリ名]$ rails assets:precompile RAILS_ENV=production
```
コンパイルが無事終了すればOKです。


# 手順5　database.ymlを編集しよう

本番環境でもデータベースを作成する必要があるので、ローカルのconfig/database.ymlの本番環境の定義部分を下記のように編集します。
databaseの値は編集しないでください。

```ruby:本番環境の編集
production:
  <<: *default
  database: アプリ名_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```

ローカルのファイルを編集したのでcommitし、pushします。
そしてEC2インスタンスでpullをしましょう。

# 手順6　データベースの作成

これでデータベースサーバーに接続することができるようになりました。
次にEC2インスタンス内に今回のアプリで使用するデータベースを作成します。
下記のコマンドを実行します。

```:データベースの作成
[ec2-user@ip-172-31-47-9 レポジトリ名]$ rails db:create RAILS_ENV=production
# 以下のように表示されればOK
Created database 'アプリ名_production'
```

次にデータベースにテーブルを作成します。

```:テーブルの作成
[ec2-user@ip-172-31-47-9 レポジトリ名]$ rails db:migrate RAILS_ENV=production
```

エラーなくテーブルが作成されればOKです。

# 終わりに／完成形

以上でデプロイの準備が完成です。
AWS認定パートナー制度

##■AWS（Amazon Web Services）とは
Amazon.comにより提供されているクラウドコンピューティングインフラストラクチャーサービスです。
企業の特徴として「AWSのパートナー認定を受けている」等耳にすることが多いと思います。

##■AWSパートナーとは
AWS の公式な認定を受け、AWSに関連する事業を行っている企業のことを指します。
このパートナーには以下5つのパスがあり、それぞれ実施している事業によって分類されています。

###5つのパス
・ソフトウェアパス
・ハードウェアパス
・サービスパス
・トレーニングパス
・ディストリビューションパス

##■パートナー認定とは
AWS のサービスを通してお客様の課題解決をサポートするパートナーとしての位置づけであり、認定を受けたパートナー企業の実績や、その社員が持つ資格を示すものです。
パートナー認定を受けている企業の中でも以下のようにパートナーランク（AWS サービスパートナーティア）が設けられており、実績や技術に基づいてセレクト、アドバンスト、プレミアに分けられています。
**★2023年10月現在、日本国内では13社の企業がプレミアティアの認定を受けています。**
・アイレット
・CTC
・SCSK
・NHNテコラス
・NTTデータ
・クラスメソッド
・サーバーワークス
・TIS
・NEC
・NRI
・日立システムズ
・富士ソフト
・富士通

###■ランク
知識・経験・顧客の成功体験 等それぞれの要件が設けられており、AWSトレーニングの力量や、カスタマーエンゲージメント、全体的事業投資などをそれぞれ判断されて以下3つの階層に分かれます。
1.Premier
2.Advanced
3.Select

###■ランクの詳細
**【AWS プレミアティアサービスパートナー】**
▼知識
・AWSプロフェッショナル認定取得者数：20名（テクニカル10名、ビジネス10名）
・AWS基礎認定技術者数：10名
・AWS認定技術者数：25名（最低10名はプロフェッショナル/専門知識）

▼経験
・年間ローンチ案件数：50件（見込み月次収益＄50,000）
・技術プログラム検証：3件（うち1つは、MSPまたはDevOpsコンピテンシー）
※プレミアへのアップグレード申請前に要件を6か月間満たし続ける必要あり

▼顧客の成功カテゴリー
・公開可能な事例数：6件
・顧客満足度（CSAT）回答数：30件

**【AWSアドバンストティアサービスパートナー】**
▼知識
・AWSプロフェッショナル認定取得者数：8名（テクニカル4名、ビジネス4名）
・AWS基礎認定技術者数：4名
・AWS認定技術者数：6名（最低3名はプロフェッショナル/専門知識）

▼経験
・年間ローンチ案件数：20件（見込み月次収益＄10,000）

▼顧客の成功カテゴリー
・公開可能な事例数：2件
・顧客満足度（CSAT）回答数：20件

**【AWSセレクトティアサービスパートナー】**
▼知識
・AWSプロフェッショナル認定取得者数：4名（テクニカル4名、ビジネス4名）
・AWS基礎認定技術者数：2名
・AWS認定技術者数：2名

▼経験
・年間ローンチ案件数：3件（見込み月次収益＄1,500）

▼顧客の成功カテゴリー
・公開可能な事例数：1件
・顧客満足度（CSAT）回答数：5件"
aws ssmをフルプライベート環境で設定する

前提: ec2のイメージはAmazon Linux 2を想定しています.

#### Amazon Linux 2以外の方はこちらの資料を参考にuserdataを定義してください
https://aws.amazon.com/jp/premiumsupport/knowledge-center/install-ssm-agent-ec2-linux/

#### ec2に`AmazonEC2RoleforSSM`ポリシーがアタッチされているロールを与えてください
資料: https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-add-permissions-to-existing-profile.html

#### フルプライベートサブネットの場合は、追加でそのサブネットにVPC Endpointを作成してください

詳しくはこちらの資料の以下の項目を参照して、VPCエンドポイントを作成してください.

> 5. Systems Manager の VPC エンドポイントを作成します。

資料: https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints/
TeamsのWikiに貼られた文字列のコピペには気をつける

## はじめに
TeamsのWiki上でコードシンタックス機能を使ってコードを貼ってましたが、エディタに貼り付けて実行すると、なぜかシンタックスエラーになるので何事かと思ってました。おっかしいなぁ正しく動くコードにしか見えないのに…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507249/4dff58fa-e9e2-d000-a4c1-2af08356391e.png)

## テキストエディタに貼ってみる
以下のテキストを

```
import urllib.request
proxy = urllib.request.ProxyHandler(
    {'http': 'hogehoge',
    'https':'fugafuga'})
opener = urllib.request.build_opener(proxy)
urllib.request.install_opener(opener)
urllib.request.urlretrieve('http://www.google.com')
```

TeamsのWikiのコードシンタックスで貼り付けてから改めてコピーし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507249/02722fa2-b89c-d3a9-71e4-1404fbc66458.png)

これをTerapadに貼り付けると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507249/85938469-0e49-2338-a07d-cc62e0b64bfb.png)

なにこの「？？？？？」は…

コードシンタックスではなく、```で貼り付けても一緒
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507249/a9c01335-b7fc-35db-279f-867da0e1db7c.png)


## 「????」の正体
サクラエディタで開くと、「U+200B」と表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507249/891c35b8-b2dd-30a0-9daf-c1b813c8e035.png)

「ゼロ幅スペース」という特殊文字だそうです。

https://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E5%B9%85%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9#:~:text=%E3%82%BC%E3%83%AD%E5%B9%85%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%EF%BC%88%E3%82%BC%E3%83%AD%E3%81%AF,%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%81%A7%E8%A1%8C%E3%82%8F%E3%82%8C%E3%82%8B%E3%80%82

Sharepoint Onlineでは、一部要素にゼロ幅スペースが云々とかかいていました。
https://answers.microsoft.com/ja-jp/msoffice/forum/all/sharepoint-online/e9433277-b58b-4632-a842-26c59faf8ae7


よくよく調べてみると、そもそもTeamsのWikiは、素人には理解できなさそうな仕組みでもって実現されてるようにお見受けしたので、どうにもならなさそうな気がします。
https://shanqiai.weblogs.jp/sharepoint_technical_note/2020/06/microsoft-teams-wiki.html



## まとめ
TeamsのWikiは信用してはならない（戒め）
[paiza]スキルチェック見本問題　Java 掛け算/足し算(paizaランク D 相当)

<h2>初めに</h2>
ここまでのJavaの学習でpaizaラーニングにある
スキルチェック見本問題の掛け算、足し算が解けるようになりました。

<h2>掛け算 (paizaランク D 相当)</h2>
見本問題なので問題の公開、コードの公開は問題ないそうです。

https://paiza.jp/works/mondai/skillcheck_sample/multiplication

解答コード

```java:
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        System.out.println(num1*num2);
    }
}
```

<h2>足し算 (paizaランク D 相当)</h2>

https://paiza.jp/works/mondai/skillcheck_sample/addition

```java:
import java.util.*;


public class Main {
    public static void main(String[] args) {
        // 自分の得意な言語で
        // Let's チャレンジ！！
        Scanner sc = new Scanner(System.in);
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        System.out.println(num1+num2);
    }
}
```

<h2>おわり</h2>
随時勉強を進めていき、スキルチェックのランクを上げていきたいです。
Railsの仕組みについて

#1.はじめに
プログラミングスクールでRuby on Railsの勉強を始めるにあたって、
Railsの仕組みを調査する機会があったのでまとめました。

#2.Railsとは
Rubyプログラミング言語で書かれたフレームワーク。

###Railsの2つの基本理念

* 同じことを繰り返すな（Don't Repeat Yourself: DRY）　→　コードの繰り返しを避ける
    * 保守性と拡張性を確保し、バグが減少する。
* 設定より規約（Convention over Configuration: CoC） →　各種設定に対してデフォルト値を予め設定
    * 設定ファイルの設定作業を行う負担が減少。

#3.MVCとは
RailsはMVCと呼ばれる3機能からなるソフトウェアアーキテクチャに基づいて構成されている。

* Model(モデル)　
    * データの処理を行う機能。
    * データベースの入出力や、計算を行う。
    
* View(ビュー)
    * ブラウザへの表示に関する機能。
    * HTMLによるインターフェースの表示を行う。
    * （erbはHTML内にRubyスクリプトを埋め込むためのライブラリ。）
    
* Controller(コントローラ)
    * ユーザからの入力をModelやViewに伝える機能。
    * Viewによって表示されたUIからの入力に応じて、対応するメソッドを呼ぶ。

###ルーティング
リクエストURLと処理を結びつける仕組み。



###MVCの流れ
1.ユーザがWebページに入力を行う。
2.Controllerがユーザのアクションに応じてModelのメソッドを呼び、データの処理が行われる。
3.データがModelからControllerを経由してViewに伝達される。
4.ViewはHTMLを生成し、Controllerを経由してWebページに表示する。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736250/7c97c536-4b66-4728-1c79-808065b61f10.png)
（出典：MVCの仕組みについて - https://qiita.com/wacker8818/items/7c66fb9db7a2b110cb6c）




#5.参考
Railsドキュメント - https://railsdoc.com/
Railsガイド - https://railsguides.jp/getting_started.html
python初学者の備忘録　コレクションについて

#### [←目次へ](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# コレクションとは
+ 複数のデータを格納することから「コレクション」「コンテナ」などと呼ぶこともある
+ また、そのうち「リスト」と「タプル」はシーケンス型オブジェクトとも呼ぶこともある
※「range」「文字列」もそれにあたる

:::note info
オブジェクト生成後に要素を変更できる：mutableオブジェクト
:::
:::note info
オブジェクト生成後に要素を変更できない：immutableオブジェクト
:::

:::note info
生存期間中変わらないハッシュ値を持つ：hashableオブジェクト
:::


##### `各コレクションの違い`

| データ型 | 変更可否 | 要素の順序 | インデックス | 説明 |
|:-:|:-:|:-:|:-:|:--|
|リスト|〇|〇|〇|任意の型のデータを格納できる|
|タプル|×|〇|〇|任意の型のデータを格納できる|
|辞書|〇|×|×|キーと値の組で表されるデータを格納する|
|集合|〇|×|×|重複の無いリストを格納する|
|集合(frozenset型)|×|×|×|重複の無いリストを格納する|

`リスト型`
`タプル型`
`辞書型(連想配列)`
`集合型`
`集合型（frozenset型）`

##### 同じ要素数のシーケンスの比較演算
+ タプルやリストなどのシーケンスオブジェクトは比較演算できる

:::note info
シーケンス同士の比較は、先頭の要素から順番に同じインデックス同士の値を比較して、先に小さい値となったシーケンスが小さい値となる
:::

```python
# -- リストの場合 --
list1 = ['a', 'b', 'c']
list2 = ['a', 'b', 'd']
print(list1 <= list2)
True

list3 = ['a', 'b', 'c']
list4 = ['a', 'b', 'b']
print(list3 <= list4)
False

# -- タプルの場合 --
value1 = (1, 2, 3, 4)
value2 = (1, 2, 3, 5)
print(value1 < value2)
True

value3 = (1, 2, 3, 4)
value4 = (1, 2, 3, 3)
print(value3 < value4)
False

dic1 = {'a': 0, 'b': 1}
dic2 = {'b': 1, 'a': 0}
print(dic1 == dic2)
True # 全てのキーと値が等しいので別オブジェクトだがTrue

# -- 集合の場合 --
set1 = {"A", "B", "C"}
set2 = {"B", "C", "A"}
print(set1 == set2)
True # set1の要素がset2にすべて含まれており、set2の要素がset1にすべて含まれているのでTrue
```

##### 異なる要素数のシーケンスの比較演算

:::note info
比較するシーケンス同士の長さが異なる場合、短いシーケンスの要素と長いシーケンスの要素を比較してすべて等しければ、短い要素のほうが小さい値となる
:::

```python
# -- リストの場合 --
>>> list1 = ['a', 'b', ]
>>> list2 = ['a', 'b', 'C']
>>> print(list1 <= list2)
True

# -- タプルの場合 --
value1 = (1, 2, 3)
value2 = (1, 2, 3, 4)
print(value1 < value2)
True
```

##### 異なるコレクションの比較演算はできない
```python
list1 = [1, 2, 3]
value2 = (1, 2, 3)
print(list1 <= value2)
# TypeError: '<=' not supported between instances of 'list' and 'tuple'
# 型が違うためエラーになる
```

+ 辞書型や集合型は比較演算できない