OmniAICreator/Qiita-1.07M huggingface dataset:
<VB.net> Memo: Using Shift-JIS + UTF8 without BOM encoding (.NET core)

## Environment

* VB.net
* .NET core 3.1


## Aim

Define a `Text.Encoding` instance which defines Shift-JIS and UTF-8 without BOM.

## References
* [CSVファイル読込処理｜VB.NET-TIPS などプログラミングについて](http://vbnettips.blog.shinobi.jp/file-folder/csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%AA%AD%E8%BE%BC%E5%87%A6%E7%90%86)
* [NetCore でSJISエンコードを扱う - Qiita](https://qiita.com/sugasaki/items/0639ea9ca07f1ba7a9e0)


## Code

```vb
Dim UTF8 as Boolean

'(...)

Dim enc As System.Text.Encoding

If UTF8 Then
    'UTF-8 encoding without BOM
    enc = New System.Text.UTF8Encoding(False)
Else
    'Shift-JIS encoding
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)
    Dim encFallBack As System.Text.DecoderReplacementFallback = New System.Text.DecoderReplacementFallback("?")
    enc = System.Text.Encoding.GetEncoding("shift_jis", System.Text.EncoderFallback.ReplacementFallback, encFallBack)
End If
```

## Note

* `New System.Text.UTF8Encoding(False)` defines UTF-8 without BOM. 
    * `System.Text.Encoding.UTF8` seems good as well, but it returns UTF-8 with BOM, which is equivalent to `New System.Text.UTF8Encoding(true)`.<br>
     cf. [Encoding.UTF8 Property (System.Text) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.utf8?view=netcore-3.1)
* On .Net Frameworks, the simple code `enc = System.Text.Encoding.GetEncoding("shift_jis")` may work.  However, it is not the case on .Net Core nor .Net, and `RegisterProvider` is needed.
* Plus, the code above replaces unencodable characters to "?", owing to`encFallBack`.
JSONで返すとは何ぞや？　HTML やXMLとの違いも解説

# JSONとは
JavaScript Object Notationの略で、ブラウザに表示するものです。
他にもブラウザに表示するものといえばHTMLやXMLなどがあります。
***ブラウザに他のマークアップ言語(HTML,XML）と比べたらわかりやすく表示するものです。***
これらと比べて何が違うのでしょうか。

# よくJSONを返すって言うけどどういうことか？
**viewの機能を使いjsonを使いデータベースの中をわかりやすく見れる**ようにすることです。
データベースの中身を見る時はjsonを返すことで見やすくなります。

例えばrenderを使って返すことができます。
```
render json: オブジェクト
```
例えば
```rb
def index
  man = { name: 'Taro', email: 'taro@example.com', job: 'programmer' }
  render json: man
```
でhttp://localhost:3000/users.jsonでアクセスすると

```json
{
  "name": "Taro",
  "email": "taro@example.com",
  "job": "programmer"
}
```
のように表示されてわかりやすくなります。
データベースの中身を見る時にはjsonを使うことで見やすくなります。
postmanを使っても中身を確認することもできます。



# HTML XML JSONの違い
ざっくりですが3つの違いをみていきましょう。

***⚫︎HTML***
***・マークアップ言語(文章に意味がある言語　）***
・タグ付けをしてわかりやすくしてある。
・webページ作成などで使う

*補足　　プログラミング言語はコンピューターに指示を出す言語

```html
<html>
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    <div class="name">Taro</div>
    <div class="email">taro@example.com</div>
    <div class="job">programmer</div>
  </body>
</html>

```


⚫︎XML
・マークアップ言語(文章に意味がある言語　）
・ルールが厳しい
・コードを見るとき見づらい

このように書きます。

```html
<man>
  <name>Taro</name>
  <email>taro@example.com</email>
  <job>programmer</job>
</man>

```

⚫︎JSON
・マークアップ言語ではない
・HTMLやXMLと比べるとみやすい
・データの計量が軽い

```json
{
  "name": "Taro",
  "email": "taro@example.com",
  "job": "programmer"
}

```

上のようにXMLとかと比べるとだいぶみやすいですよね。
このような違いがあります。

# めっちゃ便利なjqコマンド
JSONを使う時はこのコマンドを使うと便利だったりします。

https://zenn.dev/norihashimo/articles/67a7032b082da3

# 参考資料
https://amsstudio.jp/news/2021/03/what-is-json.html

https://pikawaka.com/rails/json

https://pikawaka.com/javascript/json
align-itemsについて

# はじめに
本記事では、HTMLの初めの方に学習する`Flexbox`について記述します。
HTMLをほぼ１ヶ月ぶりに学習しているため、リハビリがてらです。

# Flexboxとは
親要素に、`display:flex;`
を記述すると子要素が横並びになります。
もともと縦並びだったものが横並びに変わったということです。

その子要素たちの並び順や要素同士の幅は、
詳細に決めることができ、その方法を、`Flexbox`といいます。

## justify-contentプロパティ
主軸方向,x軸（初期値は水平方向）の配置を決めることができます。
*justify...整える、揃えるという意味。
過去に投稿している記事を参照ください。

https://qiita.com/mkato1013/items/24b7341355c1346c60ea

## align-itemsプロパティ
交差軸方向,y軸(初期値は垂直方向)の配置の詳細を決めることができます。
*align...物を一直線に合わせる、一直線に並べるという意味で使うそうです。

以下は、
`justify-content: space-around;`した上で
alignのコードを記述し、画像を添付しています。

```
上揃え
align-items: flex-start;
```

![align-item flex-start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/dd45b23e-a3ed-79d1-2099-9f77926436c5.png)


```
下揃え
align-items: flex-end;
```

![align-item flex-end.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/65245bbf-7305-488c-5344-b0ba6d7afdc0.png)


```
中央揃え
align-items: flex-center;
```

![align-item flex-center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/560da7cc-54d4-4aa9-7bde-dbb74f77f7de.png)


# 終わりに
現在、デザイン性をあげるべくHTML/CSSの訓練を再度開始しました！

明日からはそこに焦点を当てて頑張っていきたいと思います！！

明日も頑張ります！！
MacでPython始めるときコマンドを覚えるのが面倒なのでメモする


```zsh
% brew install python3

# プロジェクト用のディレクトリに移動するんやで
% python3 -m venv .venv

# activateするんやで
% pip install -U pip
% pip install jupyterlab
```

## ついでにGPUサーバの設定する

※ここからはUbuntuです

### dockerインストールする

```
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates  curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo groupadd docker
$ sudo usermod -aG docker $USER

***LOGOUT***
***RELOGIN***

$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service
$ curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker
```
参考：https://docs.docker.com/engine/install/ubuntu/

### NVIDIAドライバインストールする

```
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:03.1/0000:09:00.0 ==
modalias : pci:v000010DEd00002504sv000010DEsd00001536bc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-470 - distro non-free recommended
driver   : nvidia-driver-460-server - distro non-free
driver   : nvidia-driver-460 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin
$ sudo add-apt-repository ppa:graphics-drivers
$ sudo apt update
$ sudo apt install nvidia-driver-470-server
$ sudo reboot
```

### CUDAドライバインストールする

```
$ sudo apt-get install linux-headers-$(uname -r)
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
$ wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-$distribution.pin
$ sudo mv cuda-$distribution.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/7fa2af80.pub
$ echo "deb http://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list
$ sudo apt-get update
$ sudo apt-get -y install cuda-drivers
```
参考：https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html

### NVIDIAコンテナツールキットをインストールする

```
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker
```

### Tensorflow使う

```
# bash
docker run --gpus all -it tensorflow/tensorflow:latest-gpu bash

# python適当に起動
docker run --gpus all -it --rm tensorflow/tensorflow:latest-gpu python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

# Jupyter使う
docker pull tensorflow/tensorflow:latest-gpu-jupyter
docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu-jupyter
```

# 気が向いたら

更新します
Corsicaを使ってPhoenix/PlugでCORSを秒で設定する

Phoenixの開発をしていていつもCORSの設定方法をググっていたのですが、
よさそうなライブラリがあったのでメモ :sparkles: 


https://github.com/whatyouhide/corsica

# 使い方

1. `mix.exs`　に依存を追加

    ```exs:mix.exs
defp deps do
        [
          {:phoenix, "~> 1.5.9"},
    ...
          {:corsica, "~> 1.0"} # 追加　
        ]
      end
    ```

2. `mix deps.get`

3. `lib/<appname>_web/endpoint.ex` に設定を追加

    ```elixir:lib/myapp_web/endpoint.ex.exs
...
  plug Corsica, origins: "*"
  plug MyApp.Router
    ```

4. 確認

    ```
$ curl -H "Origin: http://localhost"  -I  http://localhost:4000
HTTP/1.1 200 OK
access-control-allow-origin: *
```

んー楽だ

# その他の機能

##　他のヘッダーの設定

`Corsica` がサポートしているヘッダーは以下のようです ※`()` はoptionsのキー

- `Access-Control-Allow-Origin`(`:origins`)
- `Access-Control-Allow-Methods`(`:allow_methods `)
- `Access-Control-Allow-Headers`(`:allow_headers `)
- `Access-Control-Allow-Credentials`(`: allow_credentials `)
- `Access-Control-Expose-Headers`(`:expose_headers`)
- `Access-Control-Max-Age`(`:max_age `)

```elixir
plug Corsica, origins: "*", allow_methods: ["POST"], ...
```

## 特定のリソースごとに設定を変える

`Corsica.Router` を使うことで、リソースごとに細かい設定が可能なようです

```elixir
defmodule MyApp.CORS do
  use Corsica.Router,
    origins: ["http://foo.com", "http://bar.com"],
    allow_credentials: true,
    max_age: 600

  resource "/*"

  # We can override single settings as well.
  resource "/public/*", allow_credentials: false
end
```

```elixir:lib/myapp_web/endpoint.ex.exs
  plug MyApp.CORS
  plug MyApp.Router
```

# 注意点

[common issues](https://github.com/whatyouhide/corsica#common-issues) に書いてあるとおり、 CorsicaはCORS的に正しいリクエストでないと `access-control-allow-origin`　などのヘッダを返さないようです。
例えば `origins: "http://foo.com"` とした場合は リクエストの`Origin`ヘッダーが `http://foo.com` である必要があります
【Swift】.gitignoreテンプレと、反映させるコマンド

毎回忘れるので残します

<br>

# .gitignoreテンプレ

```swift:.gitignore
# Xcode (from gitignore.io)
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate

# CocoaPod
Pods/*

# others
*.swp
!.gitkeep
.DS_Store
```
<br>

# 反映させるコマンド
.gitignore作る前にプッシュをするなどして、キャッシュにインデックスが残っている場合、下記のコマンドを実行する必要があります。

```
git rm -r --cached .
git add .
```

キャッシュ全部消してまた新しく管理対象を作り直すイメージですね


### 2022/12/29追記

例えば、dataフォルダを無視したいときはこんな感じでやる
```
/data/*
```
MENTAでインフラ/サーバー周りをコーチングしてもらったことを振り返る

## 背景

AWSのデプロイで詰まっていたところ、MENTAでお声掛け頂いてから8月の1ヶ月間MENTAにてメンターの@adachin0817にコーチングの下、インフラ周りの実装を行いました。その成果物としては以下のインフラ構成図の通り。


![Tamari-Baインフラ構成図_Qiita用](https://user-images.githubusercontent.com/69702983/130358185-61db1a10-eee2-4b77-8503-5583eaa2b27b.png)

具体的にはCircleCIによる自動デプロイ、EC2の本番環境、Dockerによる開発環境構築を行いました。
ちなみに今回はポートフォリオということもあり、AWSはコスト削減のためALBやRDSは利用していません。

内容は以下に全てまとめているので是非ご覧いただければ幸いです。

#### アウトプット
- [【CircleCI】AWSにデプロイしたRails6アプリをCircleCIで自動デプロイ](https://qiita.com/vit_udon_husqy/items/46b48a4cd825a8e056cd)
- [【Amazon Linux2】【Rails】Nginxをpumaのunixドメインソケットでリバースプロキシする設定](https://qiita.com/vit_udon_husqy/items/8b488fd552a3a7a1ac64)
- [【Docker】Rails6/MySQLのコンテナを作って開発環境を構築](https://qiita.com/vit_udon_husqy/items/d5e97119fbe69607a5b8)



#### 身についたこと

- 公式ドキュメントを読み、自分で理解しながら実装する自走力
- AWS, CircleCI, Docker等のインフラ周りのツールやMySQL, Nginx, Puma等のDB/サーバー理解
- 学んだことをまとめる能力

１ヶ月で特に自走力は成長できたと実感しています！
ただし、SupervisorやPID等まだまだ理解不足を感じている部分はあるので、学習を続けようと思います！


## お礼

@adachin0817 さんにインフラをサポートしていただいたのですが、インフラ/サーバー知識豊富なのでサポートが手厚いです。
また、レスポンスが速くかつ的確。それでありながら厳しいながらもメンティー自身に答えにたどり着かせることで、エンジニアの現場がわかる指導。控えめに言って最高でした。
本当にありがとうございました。

インフラ周辺の実装で伸び悩んでいる方はぜひ相談してみることをおすすめします。

https://menta.work/user/1162
サインイン と ログインの違い

## 勉強前イメージ

似たような意味で使われてる気がするけど、
何が違うんだろう

## 調査

### サインインとは

システムに自分の身元を示す情報を入力して接続を開始すること。
DBに保管している情報と一致すると利用することができる。

### ログイン

コンピュータを利用可能にしたり、ネットワークに接続したりすること。
サーバで複数の端末から使用する際にも使用される。

### 各サービスのログイン・サインイン状況

- google → ログイン

![1Gmail - Google Chrome 2021-08-22 22.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c6c0cd67-e485-c6e3-a85c-353fade258be.png)


- yahoo japan → ログイン

![2ログイン - Yahoo!メール - Google Chrome 2021-08-22 23.00..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b9ecb636-6c81-c817-b504-7c16a6d8dfb5.png)


- qiita → ログイン

![3ログイン - Qiita - Google Chrome 2021-08-22 23.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/164c6773-d718-f2ce-f61d-1f4383812b80.png)


- icloud → サインイン

![4iCloud - Google Chrome 2021-08-22 23.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/60de7ab9-5dc4-1775-6e90-b90df0fd5890.png)


- facebook → ログイン

![5Facebookにログインするかあたらしゅう登録してや - Google Chrome 2021-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/cc2d2f94-eea5-3d35-2e45-7b9c977124c6.png)


### まとめ

サービスによって違うが、基本的には同じ意味。
元々は以下の意味から来てるのではないかと調査から思う(個人的に)

- ログイン → コンピュータへ入る
- サインイン → システム(サービス)に入る

あまり深く考えてなくても良いかも。。。。

## 勉強後イメージ

結構明確な違いがあると思ってたけど、
そうでもないんだねぇ。
元々は違うかもだけど、今はほぼ一緒みたい。

## 参考

- [「ログイン」と「サインイン」の違いとは？](https://n.career-info.jp/contents/?id=10277)
Git ローカルで変更した内容を取り消す方法

#目次
[1.git addする前の変更を取り消す](#1git-addする前の変更を取り消す)
[2.git addした後の変更を取り消す](#2git-addした後の変更を取り消す)
[3.直前のコミットをやり直したい場合](#3直前のコミットをやり直したい場合)


##1.git addする前の変更を取り消す
```git add``` をする前であれば以下のコマンドで取り消すことができます。
全ての変更を取り消す場合

```
git checkout .
```

特定のファイルのみ取り消したい場合

```
git checkout <ファイル名>
```

#2.git addした後の変更を取り消す
```git add```をした後（ステージ後）の変更を取り消したい場合は```git reset HEAD```を使用します。
ワークツリー（ローカル）の変更は取り消されないため、ローカルの変更も取り消したい場合はステージの変更を取り消した後に、```git checkout```コマンドでローカルの変更を取り消す必要があります。

全ての変更を取り消したい場合

```
git reset HEAD .
```

特定のファイルのみ取り消したい場合

```
git reset HEAD <ファイル名>
```

特定のフォルダの変更を取り消したい場合

```
git reset HEAD <フォルダ名>
```

#3.直前のコミットをやり直したい場合
コミットメッセージを間違えてしまった場合など、コミットをやり直したい場合は以下のコマンドを使用します。
＊このコマンドはリモートリポジトリに```push```する前のコミットの場合に使用します。

```
git commit --amend
```
SwiftUI - モーダルビューsheetで表示すると太字boldになる


表題の通りsheetでViewを表示すると表示されるViewがBoldになってしまうようです。
これを解決するためには .font(.body)を設定すれば良いようです。

```Swift
.sheet(isPresented: $isPresented) {
  NextView()
    .font(.body) //←これ
}
```


詳しくは調べてないので、何か補足情報などがあればコメントにお願いします。


### 参考
https://developer.apple.com/forums/thread/657989
https://stackoverflow.com/questions/64385259/swiftui-sheets-bolded
M1 MACでdocker-compose up -dを実行した際にERROR: no matching manifest for linux/arm64/v8 in the manifest list entriesが出た場合の対処方法

M1 macのdockerでMySQLを利用しようとした際にエラーが発生したので対処方法をメモ

M1 macで

```
docker-compose up -d
```

を実行すると

```
ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries
```

というエラーが発生することがあります。
その場合は「docker-compose.yml」のMySQLのサービスに「platform」の記述を追加してみて下さい。

```
  mysql:
    platform: linux/x86_64
    image: mysql:5.7
```
Presto でのSQL作業用メモ（count_if）

MySQLくらいしか触ってこなかったので、Presto 挙動の違いを覚えるためのメモ用です。

## count_if

これは、集計関数の一種

`count_if（x）`

```
count_if(x) → bigint#
Returns the number of TRUE input values. This function is equivalent to count(CASE WHEN x THEN 1 END).
```

https://docs.starburst.io/341-e/functions/aggregate.html#count_if

カッコ内がTRUEになる個数を数えてくれるわけか。

便利ですね。MySQLだと、

```sql
count(CASE カラム名 WHEN x THEN NULL END)
```

て、書かないといかんもんな。

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
Githubのパスワード認証の廃止でリポジトリにアクセスできなくなってサポートの人に助けてもらった話

## はじめに
1人のユーザーにもGithubに不便さを感じさせないためにたくさんの時間を費やしてくれたプロフェッショナリティの高いGithubのサポートの人たちに感謝します。

## 要約
初期のパスワード認証と途中から設定していたSSHの設定が共存している状態で[パスワード廃止の2021年8月13日](https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/)を迎えた。
すんなりと上手くは行かなくて、パスワード認証だけでなくSSH設定や作成したアクセストークン、`git config`に至るまですべてをクリーンにしたのに下記のエラーが出続けてGithubのリポジトリに全くアクセスすることができなくなってしまった。

```
$ git clone https://github.com/myname/myrepository.git
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: unable to access 'https://github.com/myname/myrepository/': The requested URL returned error: 403
```
通常は、認証情報を削除したら初回clone時にパスワード入力を求められるが、それが全く出てこない。


StackOverflowを見ても自分と同じ現象が発生している人はいなそうで、パスワード廃止から3日目に[Githubのサポート](https://support.github.com/)に問い合わせすることにした。

無料で利用している上に海外のサービスのサポートなんて返事が来たらラッキーくらいに思ってたのだが、投稿した翌日には担当のサポートが付いてくれ、時差もある中で最低1日1回はやりとりしてくれる手厚いサポートを受けることができた。

事象自体が本来発生し得ないようなことだったのであれこれ試して一週間くらいかかったが、以下のコマンドを実行すればgithub.com自体が記憶している認証情報を削除できるのでパスワードの再入力ができるようになるはずとサポートの人が提案してくれて、実際これで無事解決することができた。

```
echo url=https://github.com | git credential reject
```

久しぶりの`git clone`の成功ログには感動を少し覚えた。

## 備考
サポートの人とやりとりする過程で、gitコマンドのデバッグのやり方を少し覚えた。

### gitコマンドの通信ログの出力
```
GIT_TRACE=1 GIT_CURL_VERBOSE=1 git clone https://github.com/myname/myreposisotry.git
```

### システム設定を使用しないでgitコマンドを動かす
```
$ GIT_CONFIG_NOSYSTEM=1 git clone -v https://github.com/myname/myrepository.git
```
[Android]ビューバインディングを使ってfindViewByIdを置き換える 

Androidの実装において、findViewByIdを使ってActivityやFragmentでViewを取得することはこれまでの通例ですが、正直面倒くさいです
実際に書いてみると下記のようになります


```Java:Javaコード
TextView textView = (TextView)findViewById(R.textView)
textView.setText("Test Text")
```
```Kotlin:Kotlinコード
var textView: TextView = findViewById(R.id. R.textView)
textView = "Test Text"
```

上記の通りViewが増えるたびにfindViewByIdが増えてしまいます。
今回ご紹介するビューバインディングではこの煩わしいコードを無くしてもっと便利にできます

# ビューバインディングとは

ビューを操作するコードを簡単に記述できる機能です。
ビューバインディンを有効にすると、各レイアウトファイルごとにバインディングクラスが自動で生成されます。
このクラスには実際のレイアウトファイルに記載されたIDを持つ各Viewへの参照を持っています
このバインディングクラスのViewへの参照をAcitvityやFragmentから呼び出すことでfindViewByIdを使ったViewの取得をしなくて済むようになります。

# ビューバインディングの導入
追加するアプリ・モジュールのbuild.gradleに下記を記載します
導入はこれだけです
※日本語のAndroidDeveloperページではbuildFeaturesではなく、viewBindingとなっているので注意。viewBindingでの記載はもう古いようです

``` build.gradle(app)
android {
    ...
    buildFeatures {
        viewBinding = true
    }
}
    
```

これだけで上記のTextViewの呼び出しが下記のように簡単になります

```Java:Javaコード
binding.textView.setText("Test Text")
```
```Kotlin:Kotlinコード
binding.textView = "Test Text"
```

※上記のようなコードにするにはAcitivityやFragmentで少しだけ準備が必要です
実際の使用方法は下記Developerを参照するとわかりやすいです
https://developer.android.com/topic/libraries/view-binding?hl=ja#usage

__※注意点__
Developerでは「result_profile.xml 」というレイアウト ファイルがあることを前提としています
下記のようにBindingクラスはレイアウトの名前を元に生成されます。
使用する際はご自身の作成したレイアウト名に置き換えるようにしてください

AndroidDeveloperの例
result_profile.xml　→ ResultProfileBinding

例.)
main_fragment.xml → MainFragmentBinding


###参照
https://developer.android.com/topic/libraries/view-binding?hl=ja#findviewbyid
Dockerの基本的なコマンド集 その1

今回はDockerのコマンドをいくつか紹介したいと思います。
主に現場で使用する機会の多いコマンドなので、紹介というよりはメモに近い備忘録となります。
(今回紹介する以外のコマンドも後ほど紹介するかもしれないので、タイトルを「その1」としています)

#login
Docker hubやArtifactory等のDockerリポジトリへログインする為のコマンドです。
-uと-pオプションでコマンドに認証情報を追加する事ができます。このオプションを抜いた場合、対象リポジトリで匿名認証を許可している場合を除き、コマンド実行後に認証情報を求められます。

```
docker login -u <ユーザー名> -p <パスワード> <リポジトリ名>.<FQDN>
```

#search
Dockerのリポジトリからイメージを検索します。

```
docker search <検索イメージ名>
```

#pull
リポジトリにあるイメージを取得するコマンドです。
タグは省略することも可能で、省略しますとlatest(最新)を取得します。

```
docker pull <イメージ名>:<タグ>
```

#images
現在ローカル環境上に存在しているDockerのイメージを一覧表示します。

```
docker images
```

#tag
所有しているイメージにタグを付けるコマンドです。
ここではタグ名だけではなく、イメージのリポジトリも変更できます。

```
docker tag <イメージ名>:<変更前タグ名> <イメージ名>:<変更後タグ名> 
※リポジトリを変更する場合
docker tag <変更前リポジトリ名>.<イメージ名>:<変更前タグ名> <変更後リポジトリ名>.<イメージ名>:<変更後タグ名> 
```
#push
ローカル上の特定のイメージをリモート(外部)のリポジトリへ格納します。

```
docker push <リポジトリ名>.<イメージ名>:<タグ名> 
```

#rmi
ローカル環境上の特定のイメージを削除します。
ちなみに`rmi`ではなく`rm`にするとコンテナ単位での削除となります。
削除時にエラーが返ってきて削除ができない場合、`-f`オプションで強制削除出来ます。

```
docker rmi <イメージ名/イメージID>
```

#logout
ログインしていたリポジトリからログアウトします。

```
docker logout <リポジトリ名>.<FQDN>
```
基本情報技術者試験勉強0822

本日の積み上げ結果
基本情報技術者試験勉強
平成24年秋過去問
平成25年春過去問
平成25年秋過去問
間違えた問題の復習
AWSの本を読む

SQLインジェクション　Webアプリケーションに問題があるとき，データベースに悪意のある問合せや操作を行う命令文を入力して，データベースのデータを改ざんしたり不正に取得したりする攻撃。

裁量労働制　特定の専門業務や企画業務において，労働時間は，実際の労働時間に関係なく，労使間であらかじめ取り決めた労働時間とみなす。

XMLの特徴　XMLでは，ネットワークを介した情報システム間のデータ交換を容易にするために，任意のタグを定義することができる。

ナレッジマネジメント　企業内に散在している知識を共有化し，全体の問題解決力を高める経営を行う。

ペネトレーションテスト　　コンピュータやネットワークのセキュリティ上の脆弱性を発見するために，システムを実際に攻撃して侵入を試みる手法。

ウイルスの調査手法　逆アセンブルはバイナリコードの新種ウイルスの動作を解明するのに有効な手法。

関係データベースの表の列に利用者がインデックスを設定する目的　データの格納位置への効率的なアクセスが可能となり，検索速度の向上が期待できる。

3層クライアントサーバシステム構成で実現したWebシステムの特徴　	業務処理はサーバ側で実行し，クライアントソフトはHTMLの記述に従って，その結果を画面に表示する。

CRMの目的　顧客ロイヤルティの獲得と顧客生涯価値の最大化

ソースコードのバージョン管理システムが導入された場合に，システム監査において，ソースコードの機密性のチェックポイントとして追加することが適切なもの　バージョン管理システムのアクセスコントロールの設定が適切であること。

DNSキャッシュポイズニング　PCが参照するDNSサーバに誤ったドメイン情報を注入して，偽装されたWebサーバにPCの利用者を誘導する。

コストプラス法　製造原価，営業費を基準にし，希望マージンを織り込んで価格を決める。

経済産業省の"営業秘密管理指針"に基づく営業秘密データの管理状況について監査を行うとき，秘密管理性のチェックポイント　当該データの記録媒体に秘密を意味する表示をしていること。

著作権法で保護されるもの　コンパイラのプログラム

PERT プロジェクトの日程計画を作成するのに適した技法

CIOが経営から求められる役割　ビジネス価値を最大化させるITサービス活用の促進

不正競争防止法によって保護される対象として規定されているもの　秘密として管理されている事業活動に有用な技術上又は営業上の情報であって，公然と知られていないもの

包括的な特許クロスライセンスの説明　技術分野や製品分野を特定し，その分野の特許権の使用を相互に許諾すること。

全体最適化計画　システム管理基準によれば、組織全体の情報システムのあるべき姿を明確にする計画。

HTTPSを用いて実現できるもの　電子証明書によるサーバ認証

S/MIME  電子メールを暗号化するために使用される方式。

フィージビリティスタディ　新しい事業やプロジェクトなどの計画に対して，その実行可能性を評価するために調査し，検証することである。

請負契約を締結していても，労働者派遣とみなされる受託者の行為　休暇取得のルールを発注者側の指示に従って取り決める。

システム監査基準における，組織体がシステム監査を実施する目的　情報システムにまつわるリスクに対するコントロールの整備・運用状況を評価し，改善につなげることによって，ITガバナンスの実現に寄与する。

SQLインジェクション攻撃を防ぐ方法　入力中の文字がデータベースへの問合せや操作において，特別な意味をもつ文字として解釈されないようにする。

ソフトウェアの資産管理に対する監査のチェックポイント　ソフトウェアのライセンス証書などのエビデンスが保管されているか。

RFID  極小の集積回路にアンテナを組み合わせたもので電子荷札に利用され，無線自動認識技術によって対象の識別や位置確認などができる。

プロジェクトの特性　独自性も有期性もある。

BYOD 従業員が私的に保有する情報端末を業務に利用することであり，セキュリティ設定の不備に起因するウイルス感染などのセキュリティリスクが増大する。

アサーションチェック　プログラム実行中の特定の時点で成立する変数間の関係や条件を記述した論理式を埋め込んで，そのプログラムの正当性を検証する手法。

経営層のアカウンタビリティを説明したもの　株主やその他の利害関係者に対して，経営活動の内容・実績に関する説明責任を負う。

モーフィングの説明　画像A，Bを対象として，AからBへ滑らかに変化していく様子を表現するために，その中間を補うための画像を複数作成する。

SLA 顧客及びサービス提供者のニーズ，並びに費用を考慮して，サービスレベルを設定する。

テストカバレージ分析　ホワイトボックステストにおいて，コード中のどれだけの割合の部分を実行できたかを評価するのに使うもの。
Linux: ディレクトリ構造を維持してコピーを行う方法

たまに必要となるのでメモ。

###### 実施環境：

```Linux:Linux
[testuser@testhost ~]$ uname -a
Linux testhost 4.18.0-147.8.1.el8_1.x86_64 #1 SMP Thu Apr 9 13:49:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[testuser@testhost ~]$ echo $SHELL
/bin/bash
```

ファイルのコピーを行う場合、通常はファイル単体でコピーが行われます。

```Linux:Linux
[testuser@testhost ~]$ cp /var/log/wtmp .
[testuser@testhost ~]$ ls -l wtmp
-rw-r--r-- 1 testuser testgrp 9216 Jul 14 13:57 wtmp
```

ただ、バックアップを取る時等、ファイルのディレクトリ構造ごとコピーを行いたい場合があります。
そのような時に使用するのが、--parentsオプションです。

```Linux:Linux
[testuser@testhost ~]$ cp --parents /var/log/wtmp .
[testuser@testhost ~]$ ls -l var/log/wtmp
-rw-r--r-- 1 testuser testgrp 9216 Jul 14 14:01 var/log/wtmp
```

ただし、この場合、コピー元ファイルはきちんとフルパスで指定する必要があります。
相対パスで指定した場合、指定した部分までしかディレクトリ構造はコピーされません。

```Linux:Linux
[testuser@testhost var]$ pwd
/var
[testuser@testhost var]$ cp --parents log/wtmp ~
[testuser@testhost var]$ ls -l ~/log/wtmp
-rw-r--r-- 1 testuser testgrp 9216 Jul 14 14:18 /home/testuser/log/wtmp
```
AtCoderログ：0089 - ABC 215 に参加しました

この記事は 2021年08月21日(土)21:00-22:40 に開催された [AtCoder Beginner Contest 215 (ABC 215)](https://atcoder.jp/contests/abc215) に参加した記録です。

https://atcoder.jp/contests/abc215

# 結果
- 得点：600 (=100+200+300)
- 時間：39:22 (= 34:22 + 05:00 × 1)
- 順位：4421 / 8537
- パフォーマンス：556
- レーティング：354 → 379 (+25) Highest更新！
- 段級位：9級

![2021-08-21_abc215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1589302/a726b8de-88a9-f533-1581-6d33eae3cc47.png)

# 詳細
|問題|得点|時間|提出コード|復習|
|:--:|:--:|:--:|:--:|:--:|
|[ABC 215 A](https://atcoder.jp/contests/abc215/tasks/abc215_a)|100|01:43|[○](https://atcoder.jp/contests/abc215/submissions/25194584)|[AtCoderログ：00**]()|
|[ABC 215 B](https://atcoder.jp/contests/abc215/tasks/abc215_b)|200|09:45(1)|[○](https://atcoder.jp/contests/abc215/submissions/25207688)|[AtCoderログ：00**]()|
|[ABC 215 C](https://atcoder.jp/contests/abc215/tasks/abc215_c)|300|34:22|[○](https://atcoder.jp/contests/abc215/submissions/25222208)|[AtCoderログ：00**]()|
|[ABC 215 D](https://atcoder.jp/contests/abc215/tasks/abc215_d)|400|(2)|---|[AtCoderログ：00**]()|
|[ABC 215 E](https://atcoder.jp/contests/abc215/tasks/abc215_e)|500|---|---|---|
|[ABC 215 F](https://atcoder.jp/contests/abc215/tasks/abc215_f)|600|---|---|---|
|[ABC 215 G](https://atcoder.jp/contests/abc215/tasks/abc215_g)|600|---|---|---|
|[ABC 215 H](https://atcoder.jp/contests/abc215/tasks/abc215_h)|600|---|---|---|

# 感想
- A, B, C まで完答できました。
- A は素直に回答して正解。
- B は対数を使ったところ WA になってしまったので、おとなしく整数のみに書き換えて正解。どこで誤差が出たんだろう。
- C はすぐに解法が思いついたものの、コーディングに手間取ってしまいました。考え直したらもっと単純なコードで良かったです。何であんなことしたんだろう。
- D はもうちょっとで解けそうな所で時間切れ。寝るときに解法を思いつきました。残念。せっかくなので復習しておこうと思います。
 
# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0075 - ABC 085 C](https://qiita.com/RoadLynton/items/1316db69d335d0b3f38e)
DFS(幅優先探索)解説動画のコード　ABC213　D

DFS解説動画で使用しているコードの内容です。

https://www.youtube.com/watch?v=VUoZ_WU90sM

```python:
# 再帰回数上限。再帰関数を使うときは必ず最初に書くこと
import sys
sys.setrecursionlimit(10**6)

# 入力の受け取り
N=int(input())

# 道の情報格納リスト
connect=[[] for i in range(N+1)]

# 道の情報受け取り
for i in range(N-1):
    A,B=map(int, input().split())
    connect[A].append(B)
    connect[B].append(A)
# connect[2]=[1,4]ならば2と1,4がつながっている

# 小さい順に回るからソート
for i in range(N+1):
    connect[i].sort()

# 答えの格納用リスト
ans=[]

# DFS(今いる町,前にいた町)
def DFS(now,pre):
    # 今いる町を答えに入れる
    ans.append(now)
    # to=今いる町から行ける町
    for to in connect[now]:
        # もしtoが前にいた町と違うなら
        if to!=pre:
            # 更に先へ探索する
            DFS(to,now)
            # 戻ってきたら答えへ格納
            ans.append(now)

# 最初の町=1,前にいた町=-1(前にいた町がないので便宜上-1)としてスタート
DFS(1,-1)

# 答えの出力
print(*ans)
```
Transfomer #1

#1.初めに
現在Python Transformers 実装ハンズオン１０１本ノックを読んでいます．
問題をやりながらその問題について自分なりにまとめていこうと思います．

Transfomerについては以下の記事を調べながら読み進めていくと理解しやすいと思います．
https://qiita.com/omiita/items/07e69aef6c156d23c538



#自然言語処理とは
人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術です．
例えば，テキストデータを単語ごとに分割したり，大量のテキストデータを学習して単語同士の関係を推測したりすることです．

#huggingfaceのtransformersのver.4.6.1をインストール

```python:install.ipynb
pip install transformers==4.6.1
```

#極性判定
文章の中には，ポジティブ思考，ネガティブ思考の言葉が入っていることが多くある．
そのため，判定する文章がどれだけポジティブ，ネガティブの単語を含んでいるかを調べて点数をつけていくことを極性判定（ポジネガ判定)と言います．

「I like Soccer because it's very exciting.」「I don't like Soccer because it's tired」の二つの文をそれぞれdistilbertで極性判定(ポジネガ判定)してみましょう．

```python:polarity.ipynb
from transformers import pipeline
sentiment = pipeline('sentiment-analysis')
```

上記の二行でDistilBertForSequenceClassificationというモデルをロードすることができます．
このモデルを使うことで，極性判定を行うことができます．(sentiment.modelと記述することで，ロードされたモデルを確認することができます．)

```python:polarity.ipynb
print(sentiment("I like Soccer because it's very exciting.」"))
print(sentiment("I don't like Soccer because it's tired"))
#[{'label': 'POSITIVE', 'score': 0.9998440742492676}]
#[{'label': 'NEGATIVE', 'score': 0.9983914494514465}]
```

上記の記述で極性判定することができます．POSITIVE,NEGATIVEが判定できていることがわかります．


#質疑応答
質問応答は質問が与えられたときテキストから答えを抽出することです．

```python:question.ipynb
from transformers import pipeline
qa = pipeline('question-answering')
```
上記の二行でDistilBertForQuestionAnsweringというモデルをロードすることができます．
このモデルを使うことで，質疑応答を行うことができます．

```python:question.ipynb
text = "HuggingFace Transformers (formerly known as pytorch-transformers and pytorch-pretrained-bert) provides general-purposearchitectures (BERT, GPT-2, RoBERTa, XLM, DistilBert, XLNet…) for Natural Language Understanding (NLU) and NaturalLanguage Generation (NLG) with over 32+ pretrained models in 100+ languages and deep interoperability betweenTensorFlow 2.0 and PyTorch."
questions = "How many pretrained models are available in HuggingFace Transformers?"
print(qa(question=questions, context=text))
#{'score': 0.5217344164848328, 'start': 263, 'end': 271, 'answer': 'over 32+'}
```
上記の記述で，質疑応答を行うことができます．
出力結果は，テキストから抽出された答え、確信度スコアを “start” と “end” 値とともに返します、これらはテキストの抽出された答えの位置です。
プロジェクトを立ち上げるとVisualStudio2017が10秒後に落ちる

外部ネットワークとは切り離したWindows10のパソコンで、いざVBの開発プロジェクトを開こうとすると10秒ぐらいしてから落ちる症状に悩まされました。

### 環境
- VB.NETプロジェクトを実行したい
- VisualStudio2017 version15.9.38
- Windows10Pro


#症状
新規で作成したC#プロジェクトも落ちるので、Windowsのイベントログを見てググり、外部ネットワークに繋いでからVisualStudioのインストローラーから修復を実行。
一応、Windowsのアップデートも実行し最新版にした。
その状態ではどのプロジェクトも無事立ち上がったので、安心してネットワーク環境を外部と切断し、明日から頑張ろうと思っていた。

次の日、同様のエラーと落ちる症状が発生。絶望。


#解決法
以下の記事を見たときに、「もしかしてネットワークが原因か？」と疑いました。
[VS2017起動時、PCがインターネットと繋がっていない場合、エラーが発生する問題！](https://social.msdn.microsoft.com/Forums/ja-JP/c34ab5af-f27d-44b3-b7ac-a64f5f6f349c/vs201736215212052617812289pc1236412452125311247912540124931248312?forum=vsgeneralja)
正常に立ち上がる場合は右上のユーザーアイコンとサインインという文字が10秒ほどしてから表示されますが、落ちるときはそれらが表示される前に落ちます。

ネットワークアダプターの設定、インターネットプロトコルバージョン4(IPv4)のオプションから**優先DNSサーバー**欄を空欄ではなく、何かIPを記述すると正常に動作することが判明。
私は自IPをさす 127.0.0.1 を指定。
すると、プロジェクトを開いても落ちることなくユーザーアイコンが表示され、ビルドも開始もできた！


#おわり
どこまでやってもPC分からない...
Clean Architecture 第Ⅰ部 イントロダクション

https://qiita.com/tak001/items/ae3bf923b3a487a4441b

https://qiita.com/tak001/items/425c5f8ec5a2c7d0143d

https://qiita.com/tak001/items/20a5dc9d7785495a6e60

# なぜクリーンなアーキテクチャが必要なのか？

`
ソフトウェアアーキテクチャの目的は、求められるシステムを構築・保守するために必要な人材を最小限に抑えることである。
(Clean Architecture P34)
`

かなり乱暴な言い方をすると「開発・保守」を楽にし、必要なリソースを最小限に抑えることが目的です。

## クリーンなアーキテクチャでない場合何が起こってしまうのか？

では、クリーンなアーキテクチャでない場合何が起こってしまうのでしょうか？
それは持続可能性が低くなり、実例ではリリース8にリリース1の40倍ものコストがかかっていることになりました。

これは崩壊のサインと言えます。

決して誰かが手を抜いている訳ではなく、開発者が自己犠牲や残業や献身的な行動があったとしても、もはや何の効果もありません。

これは機能の開発ではなく、崩壊の対応に追われているからです。

ではこのような結果にならないためにどうすれば良いのでしょうか？どのようなアーキテクチャが必要なのでしょうか？

# アーキテクチャのルールはどれも同じである！
クリーンアーキテクチャで明言されているのは、「アーキテクチャのルールはどれも同じである」ということです。

これは組み込みでも、ソフトウェアでも全てにおいてであると書かれています。

先程のような悲惨な結果にならないために「クリーンなアーキテクチャが必要である」といえます。そしてそのルールはどれも同じであるということです。

# 「ウサギとカメ」の教訓
イソップ物語に「ウサギとカメ」という有名な物語がありますが、この物語は多くの教訓があります。

- 「遅くとも着実であれば競争に勝つ」
- 「競争は短期戦ではない。強いものが勝つ訳ではない」
- 「急げば急ぐほど速度が落ちる」

「後でクリーンにすればいい、先に市場に出さなければ」と言っても、市場からのプレッシャーは止まらないので後でクルーンにすることはないのがほとんどです。

そして、崩壊が始まり生産性がゼロに近づきます。

ソフトウェアアーキテクチャの品質と真剣に向き合うことが最善の選択肢となります。

そして、真剣に向き合うためには、優れたソフトウェアアーキテクチャとは何かを知る必要があります。

# 2つの価値のお話
1. 振る舞い
1. アーキテクチャ/構造

全てのソフトウェアシステムには、ステークホルダーに2つの異なる価値を提供し、それは「振る舞い」と「構造」になります。ただし、多くの場合片方だけにフォーカスされがちになってしまいます。

そしてフォーカスされがちな価値は低く、最終的にソフトウェア自体の価値がゼロになってしまう可能性を秘めています。

## 1. 振る舞い
これは単純にソフトウェアの要件を満たし動かすことで、収益/価値を生み出します。

## 2. アーキテクチャ/構造
振る舞いを簡単に変更する手段になることを目的としています。

この2つ目の価値は「ソフトウェア」という言葉に関係しており、ソフトウェアはソフトでなければならない、
つまりステークホルダーが機能を変更したいと思えば、簡単に変更できなければいけないということです。

アーキテクチャが特定の「形状」を選択していると、新しい機能がその構造に適さない可能性が高くなってしまうため、形状にとらわれないアーキテクチャにしたほうが実用的です。

# 大きな価値はどっち？
では、先程の2つで価値が大きいのはどちらになるのか？ですが、
著書では「アーキテクチャ/構造」であると記述されています。その理由として例が挙げられています。

1つめは
・完璧に動作するが、変更できないプロプラムだったとすると、要件が変更された時点で機能しなくなり、修正もできない。つまりいずれ役に立たなくなってしまうケース

2つめは、
・動作しないが、変更が簡単なプログラムだったとすると、要件が変更されても修正は可能なので、動かし続けることができる。つまりこのプログラムはこれからも引き続き役に立つケース

実際には変更できないプログラムは存在しないと思うので、極端な例ですが、変更のコストがメリットを上回ってしまうケースは事実存在すると思います。この事を考えるとやはり「アーキテクチャ」に大きな価値があるように思います。

# 重要度x緊急度のマトリクス
先程の2つの価値を、有名なアイゼンハワーの重要度x緊急度のマトリクスに置き換えてみます。

マトリクスでは「重要」だが「緊急ではない」ことの「第二領域」が建設的な将来のために最も大切だとされています。

同じく変更に耐えうるアーキテクチャは「重要」だが「常に緊急性」とは限らないため、「第二領域」に該当します。

ただし、現実的には多くの場合、ビジネスマネージャーがアーキテクチャの重要性を評価できず、「重要」かつ「緊急」に該当する振る舞いに追われ、ソフトウェアであるにも関わらず変更に耐えきれないという現象が発生してしまいます。

# まとめ
- なぜクリーンなアーキテクチャーが必要なのか
 - 要求に対して簡単に変更できるようにする
 - 必要なリソースを最小限にする
- 2つの価値のお話
 - 「振る舞い」と「アーキテクチャ/構造」
 - 「アーキテクチャ/構造」により価値がある
[Python] エラトステネス ABC215D

#[ABC215D](https://atcoder.jp/contests/abc215/tasks/abc215_d)

これは[ABC215 D - Coprime 2](https://kanpurin.hatenablog.com/entry/2021/08/21/232035)を参考にした、自分用のメモである。

$gcd(A_i,k)=1$となるのは，$k$が$A_i$の任意の素因数を持たないことと同じです．$A$のすべての素因数を求めて，その素因数を持たない$1$以上$M$以下の整数を求められれば良いです．
エラトステネスの篩を用いて，$1$以上$maxA$以下の素数$p$であって，$p$を素因数に持つような$A_i$が存在するようなものを$O(\max A\log \log \max A)$で求めます．この素数$p$に対して，$1$以上$M$以下であって$p$の倍数であるような数を，同じくエラトステネスの篩の要領で消していけば残った数が答えとなります．全体の計算量は$O(N+\max A\log \log \max A+M\log \log M)$となります．


```python:サンプルコード
N,M = map(int,input().split())
A = list(map(int,input().split()))
maxA = max(max(A),M)

k = [True] * (maxA+1) # iが条件を満たすkか(iが使えるか)
isprime = [True] * (maxA+1) # iが素数か
prime = [] # Aの素因数(使えない素数)
# Aの要素は使えない
for a in A: 
    k[a] = False
# エラトステネスの篩
for i in range(2,maxA+1):
    if not isprime[i]:
        continue
    for j in range(i*2,maxA+1,i):
        isprime[j] = False
        # iはjの素因数
        # jがAの要素ならiは使えない素数
        k[i] = k[i] and k[j]
    if not k[i]:
        prime.append(i)
# 使えない素数pに対して, pの倍数を使えなくする
for p in prime:
    for j in range(p*2,M+1,p):
        k[j] = k[j] and k[p]
# 使える数をansに入れる
ans = [1]
for i in range(2,M+1):
    if k[i]:
        ans.append(i)
# 出力
print(len(ans))
for i in ans:
    print(i)
```
MqttDesk Windows MQTT Clientをダウンロードするには?

MqttDesk [Windows MQTT Client](https://www.ioctrl.com)をダウンロードするには?

MqttDesk MQTTクライアントは、Windows、Linux、macOSのほか、Raspberry PiやOrange Piなどのarm32/arm64システムで動作します。MqttDeskはデスクトップベースのMQTTクライアントで、あらゆるIOT、IIOTデバイスやホームオートメーションシステムの視覚化に使用されます。Windows互換のデバイスやコントローラであれば、MqttDesk MQTTデスクトップクライアントを実行できます。
Mqttdeskには、[Windows用MQTTクライアント](https://www.ioctrl.com)、[macOS用MQTTクライアント](https://www.ioctrl.com)、Linux用MQTTクライアント、Raspberry Pi用MQTTクライアントがあります。


![MqttDesk_Windows_MQTTClient.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1914451/f32e6e71-9464-d6eb-32a4-e1009448009f.gif)





添付ビデオのガイドラインに従って、MqttDesk MQTT Client for Windowsをダウンロードします。
https://www.ioctrl.com のウェブサイトにアクセスし、「Try free」をクリックし、「Download」ボタンをクリックして、MqttDesk MQTT Client for Windowsのダウンロードページにログインします。
windows(.exe)を選択してクリックし、MqttDesk MQTT Client for windowsのzipファイルをダウンロードします。

[ioCtrl](https://www.ioctrl.com) は、No CodeのIIOT製品を作るためのイニシアチブです。私たちは、メーカー、フリーランサー、プロトタイプ、企業のために、クロスプラットフォームのMQTTデスクトップクライアント「MqttDesk」を開発しました。MqttDesk MQTTクライアントは、トピックの公開と購読に使用します。


Windowsのデスクトップでファイルを解凍して実行すると、Windows用のMqttDesk MQTT Clientが使用できます。
MqttDesk Windows MQTT Clientの使い方」については、ウェブサイトでユーザーガイドを公開し.

リンク「How to download windows MQTT Client -MqttDesk?
https://www.ioctrl.com/post/how-to-download-mqttdesk-mqtt-client-for-windows
[WPF]OpenCvSharpを使ってRenderTargetBitmapをプレビューする

以前に、OpenCvSharp 4.5.2.20210404 を使って、Viewの外観をBitmap化する時などによく使うRenderTargetBitmapクラスのオブジェクトをプレビューするコードを考えましたので、Qiitaで共有したいと思います。

### コード

コードは以下の通りです。

```csharp

    static class OpenCvSharpHelper
    {
        [Conditional("DEBUG")]
        public static void ImShow(string windowTitle, RenderTargetBitmap rtb)
        {
            FormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap();
            newFormatedBitmapSource.BeginInit();
            newFormatedBitmapSource.Source = rtb;
            newFormatedBitmapSource.DestinationFormat = PixelFormats.Bgr24;
            newFormatedBitmapSource.EndInit();

            var mat = OpenCvSharp.WpfExtensions.BitmapSourceConverter.ToMat(newFormatedBitmapSource);
            OpenCvSharp.Cv2.ImShow(windowTitle, mat);
        }
    }
```

### 工夫した点

RenderTargetBitmapはPixelFormats.Pbgra32しかサポートしていないので、OpenCvSharp.ImShow()のMatパラメータの要件であるBGR24で初期化できません。なので、RenderTargetBitmapはPbgra32で作って、その後、FormatConvertedBitmapによりBgr24に変換したビットマップをOpenCvSharp.Matに変換してImShow()しています。

`Pbgra32(RenderTargetBitmap)→Bgr24(FormatConvertedBitmap)→Bgr24(Mat)`

[Conditional("DEBUG")]は付けなくてもいいです。まあ、あまりRenderTargetBitmapをプレビューする機能をリリースビルドに含めることは少ないと思いますが、これは個人または組織の自由です。

私はこのコードを主にデバッグする時によく使います。

### 用例

Visualオブジェクトとwidthとheightがあればビットマップ化してウィンドウに表示できます。

```csharp
        private void Render(Visual target, double width, double height)
        {
            var rtb = new RenderTargetBitmap((int)width, (int)height, 96, 96, PixelFormats.Pbgra32); //Pbgra32である必要がある！！！

            DrawingVisual visual = new DrawingVisual();
            using (DrawingContext context = visual.RenderOpen())
            {
                //ビットマップにFrameworkElementの外観をまるごと描写する例
                VisualBrush brush = new VisualBrush(target);
            context.DrawRectangle(brush, null, new Rect(new Point(), new Size(width, height)));
            }

            rtb.Render(visual);

            //testウィンドウにRenderTargetBitmapを表示する
            OpenCvSharpHelper.ImShow("test", rtb);
        }
```

### ネタ元

このコードのネタ元はベクターグラフィックスドローイングツール "boiler's Graphics"です。
https://github.com/dhq-boiler/boiler-s-Graphics.git
MQTTプロトコルとは何ですか？

[MQTT](https://www.ioctrl.com)は、[IOT](https://www.ioctrl.com)および[IIOT](https://www.ioctrl.com)デバイス間でメッセージを伝送する、軽量のパブリッシュサブスクライブ型ネットワークプロトコルです。MQTTプロトコルは、通常、TCP/IP上で動作します。小さなコードフットプリント」が求められる遠隔地との接続や、ネットワークの帯域幅が限られている場合に設計されています。MQTTプロトコルは、IIOTデバイス、IOT、スマートホームシステム、ホームオートメーションシステムのアプリケーションに理想的な選択肢であり、広く使用されています。

MqttDeskは、Windows MQTTクライアント、Linux MQTTクライアント、macOS用MQTTクライアント、Raspberry Pi用MQTTクライアントとして重要な役割を果たしています。https://www.ioctrl.com/MQTT
任意のマイクロコントローラをMqttDesk Windows MQTT Clientに接続し、MQTT Brokerのアリを使って任意のIOT、IIOTデバイスをリモートで監視します。


![MQTT Protocol Structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1914451/5ea6807c-ed18-ae34-e78a-3d3586a716e5.png)



[ESP8266](https://www.ioctrl.com)、ESP32、Raspberry Pi、Arduinoなどのエンドノードが、他のMQTTクライアントと通信することは、メーカー、フリーランサー、プロトタイプに最適なユースケースです。

IOT/IIOT/スマートホームシステム/ホームオートメーションシステムにおいて、[MQTT](https://www.ioctrl.com)はどのように重要な役割を果たしているのか？


MQTTプロトコルでは、メッセージブローカーと多数のクライアントという2種類のネットワークエンティティが定義されています。MQTTブローカーは、クライアントからすべてのメッセージを受信し、メッセージを適切な宛先クライアントにルーティングするサーバーです。
MQTTブローカーは、Raspberry Pi、ESP8266、ESP32、Arduinoなどの小型コントローラでもMQTTクライアントとして動作する。
MQTTクライアントとは、MQTTライブラリを実行し、ネットワーク経由でMQTTブローカーに接続するあらゆるデバイス（マイクロコントローラから本格的なサーバーまで）を指す。パブリッシャーは、配信する新しいデータがあると、接続しているブローカーにそのデータを含むコントロールメッセージを送信します。MQTTブローカーは、そのトピックを購読しているMQTTクライアントに情報を配信します。パブリッシャーはサブスクライバーの数や位置に関するデータを持つ必要はなく、逆にサブスクライバーはパブリッシャーに関するデータを設定する必要はありません。https://www.ioctrl.com

![MqttDesk MQTT Client Charts.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1914451/5720f22d-c9b7-e9d6-9ff7-cad9151d6dee.gif)




ブローカーが現在のサブスクライバーがいないトピックのメッセージを受信した場合、メッセージのパブリッシャーがメッセージをリテインメッセージとして指定していない限り、ブローカーはそのメッセージを破棄します。保持されたメッセージとは、retained フラグが true に設定された通常の MQTT メッセージのことです。ブローカーは、最後に保持したメッセージと、選択したトピックに対応するQoSを保存します。 

保持されたメッセージのトピックに一致するトピックパターンをサブスクライブした各クライアントは、サブスクライブ後すぐに保持されたメッセージを受け取ります。ブローカーは、リテインされたメッセージをトピックごとに1つだけ保存します。これにより、あるトピックの新しいサブスクライバーは、パブリッシャーからの次の更新を待たずに、最新の値を受け取ることができます。

パブリッシングクライアントが初めてブローカに接続したときに、ブローカが、パブリッシングクライアントがブローカから予期せず切断されたことを検出した場合に、サブスクライバに送信するデフォルトメッセージを設定することができます。クライアントはブローカとしかやりとりしませんが、システムには、現在のサブスクライバのトピックに基づいてデータを交換する複数のブローカサーバが含まれている場合があります。MQTTの最小制御メッセージは、わずか2バイトのデータである。制御メッセージは、必要に応じて256メガバイト近くのデータを伝えることができます。クライアントとブローカーの接続や切断、データの公開、データの受信確認、クライアントとサーバー間の接続の監視などに使用されるメッセージタイプが定義されています。
SwfitGenのLocalizable stringsを用いた文字列管理について

# 本記事について

SwfitGenのLocalizable stringsを用いた文字列管理についてご紹介します。
プロダクトの規模感やドメインによって異なりますが、今回は自身で考えた管理方法について述べます。

## 文字列管理の方法について

以下、2パターンに分ける
- 特定の画面
- どの画面にも共通で使用（Common）

## 対象範囲
### 対象
- Viewに表示する文言

### 対象外

- デバッグの文言
- 動的に変化する文言
- AppDefine内
- URL
- パラメーター
- 空文字
- 正規表現

> 対象外の項目は，言語ではないためLocalizationで管理するのは
管理する場合はStructを作成して対応した方が良い

## 規則
画面ごとの役割に分けて文言を定義する。「.」で階層を区切る
※ L10nはSwiftGen特有の言い回し。

1. 画面ごとに定義する文字列
L10n.[VC名] .[UI].[文字列]

2. 共通で使う文言(UIや表示する場所に限らずに使う文字列の場合)
L10n.Common.[文字列]

3. 共通で使う文言(使うUIが決まってる場合)
L10n.Common.[UI].[文字列]

```
例)
1. L10n.Question.Label.UserName　「差出人」（質問画面にあるラベル）
2. L10n.Common.Followed　「フォロー中」
3. L10n.Common.Alert.Favorite　「お気に入りに追加しました。」
```

## [1] VC名の候補
- TalkDetail　「トーク詳細画面」
- TalkCreate　「トーク作成画面」
- Record　「収録画面」
- RemoteRecord　「リモート収録画面」
- Question　「質問画面」
- TalkDownload　「ダウンロードView」

など

## [2] UIの候補
#### 全パターン
- button（buttonはButtonTitleのことを指す）
- label
- textView
- textFiled
- placeholder
- shareText（質問募集などのURLに結合する文章）
- siriShortcut（userActivityでは広すぎるため）
- navigation
- alert

### [3] 命名規則

- 基本は文字列の意味を表すように設定，PRにて命名の議論を行う
- navigationとalertの場合のみ，定義する文字列の意味を区別できるように末尾にtitleなどを追加

#### navigationの場合

  - title（navigationItem.title）
  - button（navigationItem.leftBarButtonItemなど）

#### alertの場合

  - title
  - button
  - message

> 例)
> L10n.Question.**Navigation**.Question**Title**　「質問を送ろう」
> L10n.TalkDetail.**Alert**.Delete**Button**　「削除する」

## 文字列を定義の仕方について
### 概要
- Resorces/Strings/◯◯.stringsに以下の内容を記述
  - `"キー ([UI].[文字列]の形式で定義)" = "文言";`
- 大きくCommonとVCの2パターンに分けており、VCごとにファイルを分割
- 定義する際、キャメルケースで記述
- 数字，動的な文字を含めた文字列を作成する場合，%d，%@をつける
- アルファベット順で記述

### VCの場合
- 新しく追加したVCの文字列を追加する際，[VC名].stringsファイルを作成
- UIで分ける際，`// UI名`と記述

具体例を以下に示します。

```Common.strings
"followed" = "フォロー中";
"deleteButton" = "削除";
"alert.deleteButton" = "削除する";
```

```TalkDetail.strings
// Alert
"alert.copyUrlButton" = "URLをコピー";
"alert.inputPassward" = "パスワード入力";
"alert.requestMusicButton" = "楽曲申請";
"alert.userInfoError" = "ユーザーの取得に失敗しました。\n%@";

// Button
"talkDetail.button.readMore" = "続きを読む";

// Label
"label.gift" = "ギフトを贈る";
"label.question" = "質問を送る";
"label.detailText" = "%@のトーク「%@」をお届け！";
```

###  文字列を定義後の操作
- Localizations.stringsの記述内容を追加・変更後、`make swiftgen`コマンドを入力
  - Generated/Strings.swiftにコードが生成される。


## 具体例

```
- 特定の画面
例) 質問画面
L10n.Question.Label.UserName　「差出人」
L10n.Question.Placeholder.UserName　「DJトクメイ」
L10n.Question.Label.AttensionWord　「誹謗中傷や〜ご注意ください」
L10n.Question.Button.NextConfirm　「確認画面へ進む」
L10n.Question.Navigation.QuestionTitle　「質問を送ろう」

- どの画面にも共通で使用
L10n.Common.Followed　「フォロー中」
L10n.Common.Alert.RemoveFollowed　「フォロー解除しました。」
L10n.Common.Alert.Favorite　「お気に入りに追加しました。」
```


## 最後に

SwfitGenのLocalizable stringsを用いた文字列管理についてご紹介しました。
他の方の参考になれば幸いです。
【初心者向け】CSRFとは

#はじめに
今回は、CSRFについて書いていきます！！
現在Laravel学習中のため、Laravelでの記述方法についてもさらっと言及します。
#CSRFとは
CSRF（クロスサイトリクエストフォージェリ）とは、Webアプリの脆弱性を利用したサイバー攻撃の一種で、以下のような流れで攻撃してきます。
1. 攻撃者（悪い人）が罠となるサイトを用意する
2. あるWebアプリにログインしているユーザーがそのサイトにアクセスする
3. サイトに仕掛けられた罠リンク（URL）をクリックすると、ユーザーの意図しないリクエストがWebアプリに送信されてしまう
#CSRF対策
サーバーサイドでしか分からないランダムな文字列（トークン）を生成し、そのトークンをinputタグのhidden要素でformに埋め込み、送信されたトークンと保存されているトークンが一致するかを確認することで、正しいリクエストであるかどうかチェックする、といったやり方でCSRF対策を行います。
Laravelでは、formタグの下に以下のように記述するだけで、ランダムな文字列を勝手に埋め込んでくれます。

```php
{{ csrf_field() }}
```
これは

```php
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
```
と同様の意味であり、Laravel

```
@csrf
```
と書いてもOKです。

#おわりに
世の中には悪い人がたくさんいるから気をつけなければいけませんね。。。
Atom おすすめ ショートカットキー (Windows)

[VSCodeのショートカットキーはこちら](https://qiita.com/HyunwookPark/items/0e2a5e61cc2101cc4b60)

中でも個人的に利用頻度高いものには★マークをつけた。

# 編集

## 該当行と同じ行をつくる ★

プログラムでも少し違う行をつくることは多く、一旦行を複製して書き換えるのに便利。

`Ctrl` + `Shift` + `D`

## 行削除 ★

行を削除はかなり利用頻度高く、覚えておくと捗る。

`Ctrl` + `Shift` + `K`

## コメント ★

該当行をコメントにする。
プログラムの種類に合わせたコメントにしてくれるのが嬉しい。
（pythonなら#、javaなら//）

`Ctrl` + `/`

## インデントを減らす

行の先頭に移動しなくてもインデントを編集できる。

`Ctrl` + `[`

## インデントを増やす

行の先頭に移動しなくてもインデントを編集できる。

`Ctrl` + `]`

## 行を上下にずらす ★

行の場所を移動したときにカット + ペーストしなくても移動できる。
移動場所が近い時に便利。
インデントもほぼいい感じに考慮してくれる。

* `Ctrl` + `↑`
* `Ctrl` + `↓`

# カーソル移動

## 行の先頭 ★

Atomに限らず使える便利ショートカット。
このぐらいは常に使って作業効率向上をはかりたいところ。

`HOME`

## 行の末尾 ★

Atomに限らず使える便利ショートカット。
このぐらいは常に使って作業効率向上をはかりたいところ。

`END`

## ファイルの先頭

Atomに限らず使える便利ショートカット。
そんなに頻度は高くないけど、知ってると便利。

`Ctlr` + `HOME`

## ファイルの末尾

Atomに限らず使える便利ショートカット。
そんなに頻度は高くないけど、知ってると便利。

`Ctrl` + `END`

## 行番号指定で移動

エラー発生時にスタックトレースなどのソースコード行番号をもとに調査するときに便利。

`Ctrl` + `G`

## 対応する括弧へ移動

ネストが多く、括弧がややこしいときに使うと便利。

`Ctrl` + `M`

## 単語ごとに移動

* `Ctrl` + `←`
* `Ctrl` + `→`

`Ctrl`を`Alt`でもできる。

* `Alt` + `←`
* `Alt` + `→`

# 選択

## 同じ単語を選択 ★

同じ単語を同時に編集できるのでAtom最高！と思った機能。
複数選択後、マルチカーソル状態になるので複数行同時編集ができる。

`Ctrl` + `D`

## 単語ごとに選択

* `Ctrl` + `Shift` + `←`
* `Ctrl` + `Shift` + `→`

`Ctrl`を`Alt`でもできる。

* `Alt` + `Shift` + `←`
* `Alt` + `Shift` + `→`

## 行の先頭・末尾まで選択 ★

1行選択したいけど、改行は含めたくないときによく使う。

* `Shift` + `HOME`
* `Shift` + `END`

# タブ

## タブ移動

タブごとに表示を切り替える。

- `Ctrl` + `PageUp`
- `Ctrl` + `PageDown`

## タブを閉じる ★

ブラウザと同じように該当のタブを閉じることができる。

`Ctrl` + `W`

## タブを全部閉じる

あまり使ってないけど、`Ctrl`押しっぱなしで`K`→`W`と押すと全てのタブが閉じられる。

`Ctrl` + `K` → `W`

## 閉じたタブを再度開く

うっかり閉じたとき便利。

`Ctrl` + `Shift` + `T`

# 検索

## ファイル名で検索 ★

ファイル名で探したいときが多いので利用頻度高い。
↓どちらでもOK

* `Ctrl` + `P`
* `Ctrl` + `T`

## ファイル内を検索 ★

Atom以外でも使える定番のショートカットキー。
置換もできる。

`Ctrl` + `F`

## プロジェクト内を検索

プロジェクト内のGrep検索で使う。
置換もできる。

`Ctrl` + `Shift` + `F`

## 開いているファイルをツリーで選択する ★

エディタで開いたけど、どこにあったかツリー上で特定したいときに使う。
`Ctrl` + `P`と合わせて使うと便利。

`Ctrl` + `Shift` + `\`

# 設定

## Settingsを開く ★

Atomの設定を開くときに使う。

`Ctrl` + `,`

# プレビュー

## MARKDOWNプレビュー

マークダウンファイルをプレビュー表示する。

`Ctrl` + `Shift` + `M`
OWON VDS3104 をpythonで制御 (その1)

趣味でUSBオシロスコープのOWON VDS3104(LAN無しモデル)を使っています。このオシロ、ハードウェア性能は 4ch 100MHz 1GS/s となかなか気に入っていますが、アプリがイマイチなので、ptyhonで制御して少しでも便利に使いたいと思います。

#環境
OS : Windows 10
対象機器 : VDS3104
アプリ : OWON VDS 2.0.17
言語 : python 3.7

#使用方法
PCにVDS3104をUSB接続しアプリ(VDS)を起動すると、オシロスコープの画面が現れます。外部のプログラムから制御する場合もVDSを立ち上げておく必要があります。VDSで Function menu->Utility->SCPI Console を起動すると、受け取ったSCPIコマンドとそのレスポンスを確認することができます。なお、この画面にキーボードから書き込むこともできますが、何も起きないので、直接書いてもコマンドとして認識してくれるわけではないようです。

#VISAじゃない
測定器の制御といえば VISA と思っていたのですが、VDS3104 は VISA では通信できないようです。Keysight Connection Expert で Verify Connection しても VI_ERROR_TMO となってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/e4180574-23d1-5821-b834-b202d1778137.png)
ただしこのとき SCPI Console には、コマンドとレスポンスが表示されているので、コマンドは届いているものの VISA でレスポンスをリードすることができないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923193/5c76ec99-56b3-11f5-573f-dbc25992cf39.png)

#それではどうやって?
OWONのexample(C++)と

http://files.owon.com.cn//software/Application/VDS_Series_SCPI_example_folder.zip

これが参考になりました。

https://github.com/owonlilliput/VDS_Python

#pythonプログラム例

```python:vds01.py
from socket import AF_INET, socket, SOCK_STREAM, setdefaulttimeout

class LanSource:
    def __init__(self, address):
        #param address: (ip, port) -> (str, int)
        super(LanSource, self).__init__()
        setdefaulttimeout(5)
        client = socket(AF_INET, SOCK_STREAM)
        client.connect(address)
        client.settimeout(5)
        self.address = address
        self.client = client
    def close(self):
        self.client.close()

if __name__ == '__main__':
    ls = LanSource(('localhost', 5188))
    ls.client.send(b'*IDN?')
    res = ls.client.recv(1024)
    print(res)
    ls.close()
```
これで ID character string を読みだすことができました。

```bash
b'OWON,VDS3104,VDS31041506121,V4.0'
```

[次回](https://qiita.com/nachtele/items/d80c6c51208f1dbf0397)に続く
画像がモノクロかどうかを判定する

表題の通りです。
元からチャンネル数で判定できればよいですが、そうではない場合の対処法です。

単純に平均をとって差分を見るだけでは思ったより閾値の設定が難しかったので、rgbそれぞれの差を見るコードです。
ただ、書いて思いましたが偏差をみれば...いや、大半が白背景とかならこれがいいということにします。


```python
import numpy as np
from PIL import Image

def is_color_img(img):
    img = img.convert('RGB')
    array = np.array(img)
    array = array / 255

    diff_rg = array[:, :, 0] - array[:, :, 1]
    diff_gb = array[:, :, 1] - array[:, :, 2]
    diff_rb = array[:, :, 0] - array[:, :, 2]

    not_gray_indices = np.concatenate([
        np.argwhere(diff_rg > 0.5),
        np.argwhere(diff_rg < -0.5),
        np.argwhere(diff_gb > 0.5),
        np.argwhere(diff_gb < -0.5),
        np.argwhere(diff_rb > 0.5),
        np.argwhere(diff_rb < -0.5)
    ])

    return not_gray_indices.shape[0] != 0
# 実行
img = Image.open(img_path)
is_color_img(img)
```
openpyxlで複数のプロットデータを重ねた散布図をつくる

#1.目的
pythonで作成した散布図をエクセルに出力するためにopenpyxlを使った。
そのとき、各プロットデータのまとまりごとでx値、y値、サンプルデータ数が異なっていて苦労したので検討したをやり方まとめる。

#2.作成する散布図
ここでは例としてsklearnのirisのデータセットを散布図をエクセルに出力することを考える。

```python
from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt


iris = datasets.load_iris()

df = pd.DataFrame(iris.data,columns=iris.feature_names)
df['target'] = iris.target
df.loc[df['target'] == 0, 'target'] = "setosa"
df.loc[df['target'] == 1, 'target'] = "versicolor"
df.loc[df['target'] == 2, 'target'] = "virginica"

feature1 = 'sepal length (cm)'
feature2 = 'sepal width (cm)'

for t in df.target.unique():
    x = df[df.target==t].loc[:,feature1]
    y = df[df.target==t].loc[:,feature2]
    
plt.title('test graph')
plt.xlabel(feature1)
plt.ylabel(feature2)
plt.legend()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613560/6b0abde1-d502-f742-9269-181896a87e9f.png)


#3.エクセルで作成
上の散布図をエクセルで作成するために以下のコードを実行。

```python
import openpyxl
from openpyxl import Workbook
from openpyxl.chart import (
    ScatterChart,
    Reference,
    Series,
)

wb = Workbook()
ws = wb.active

feature1 = 'sepal length (cm)' #グラフでx軸になる特徴量
feature2 = 'sepal width (cm)'  #グラフでy軸になる特徴量

chart = ScatterChart() #散布図をかく
chart.title = 'test graph'    #グラフタイトル
chart.style = 10   #グラフのデザイン
chart.x_axis.title = feature1 #x軸ラベル
chart.y_axis.title = feature2 #y軸ラベル

r_end = 0 #

for t in  df.target.unique(): # setosa, versicolor,versicolorについてforループ処理を行う
    data_t = pd.DataFrame()
    data_t[''] =df[df.target==t].loc[:,feature1] # x値を抽出
    data_t[t] = y = df[df.target==t].loc[:,feature2] # y値を抽出
    input_data = data_t.T.reset_index().T.values.tolist()

    for row in input_data : #抽出した情報をエクセルシートに貼り付け
        ws.append(row)

    r_start = r_end+1 #  エクセルの「グラフの選択」の系列のスタート行を設定するためのパラメータ
    r_end = r_start+len(input_data)-1 #  エクセルの「グラフの選択」の系列のエンド行を設定するためのパラメータ

    xvalues = Reference(ws, min_col=1, min_row=r_start+1, max_row=r_end ) # 系列ｘの値
    values = Reference(ws, min_col=2, min_row=r_start, max_row=r_end )  # 系列yの値
    series = Series(values, xvalues, title_from_data=True)

    series.marker = openpyxl.chart.marker.Marker('circle') #マーカはサークルに設定
    series.graphicalProperties.line.noFill = True #プロットのみのため線はかかない設定にする
    chart.series.append(series)

ws.add_chart(chart, "E2") #グラフ貼り付けの位置(グラフの左上端)
wb.save("sample.xlsx")
```
これを実行すると、**sample.xlsx**というファイルが作成され、開くと以下のようなグラフができている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613560/e6c80eb7-5f51-41bf-abec-dfb3a0960c74.png)


※データの並び
・`ws.append(row)`でデータをシートに書き込むと、新しいデータは下の行に追加される。
　⇒列方向にデータを追加することをあきらめて、縦にデータを並べることにした。


#4.参考資料
以下、参考にして勉強しました。
OpenPyXLのサイト：https://openpyxl.readthedocs.io/en/stable/index.html#
 - [Scatter Charts](https://openpyxl.readthedocs.io/en/stable/charts/scatter.html):上のコードはこのページのものを改造
 - [Line Charts](https://openpyxl.readthedocs.io/en/stable/charts/line.html):プロットの設定等を参照

以上