OmniAICreator/Qiita-1.07M huggingface dataset:
Windows MySQLクライアントインストールなしでリモート接続・データ取得・TSV出力

## 概要
WindowsでMySQLのクライアントをインストールせずにリモートMySQLに接続し、データ取得してローカルPCにTSV出力します。

背景としては、ツールとして他のPCでMySQLでのデータ取得をインストールなしでサクッと使いたい場面がでてきました。バッチファイルで実行できるようにします。

## 環境
リモートサーバ Ubuntu 20.04 + MySQL 8.0.28
DB名 = test テーブル名 = test
ローカルPC Windows 10 Pro 21H2
ダウンロードしたMySQL Community Server 8.0.29
```test.test
+------+--------------------------------+
| id   | name                           |
+------+--------------------------------+
| １   | 1234567890                     |
| １   | 1234567890                     |
| １   | 1234567890                     |
| １   | 1234567890                     |
+------+--------------------------------+
```

## 大雑把な流れ
1.MySQL Community Serverをダウンロードする。
2.zipから必要なファイルを取り出す。
3.バッチファイルとsqlファイルを作る。
4.さらに必要なdllを集める。
5.1つのフォルダにまとめる。
6.実行する。

## 手順1 MySQL Community Serverをダウンロードする。
[ここ](https://dev.mysql.com/downloads/mysql/)から、zipをダウンロードします。
アカウント作成などが必要になるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/e9e83c77-c637-d519-fd4b-fc371566dd5c.png)

## 手順2 zipから必要なファイルを取り出す
ダウンロードしたzipの中binフォルダの中から、libcrypto-1_1-x64.dll、libssl-1_1-x64.dll、mysql.exeを取り出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/257326e2-1b87-44ea-3ccb-3397d26c177c.png)

## 手順3 バッチファイルとsqlファイルを作る
バッチファイルは同じディレクトリのtest.sqlを読み込んで、同じディレクトリにtest.tsvを出力するようにします。
```test.bat
mysql -u USER -pPASSWORD -h 88.88.88.88 -P 3306 < test.sql > test.tsv
```
sqlファイルは、SELECT文を書いておきます。
```test.sql
select * from test.test;
```

## 手順4 さらに必要なdllを集める
ここまでやっても他PCで動かない可能性があるので、さらにdllを集めます。
C:\Windows\System32の中から、msvcp140.dll、vcruntime140.dll、vcruntime140_1.dllをコピーして集めます。
※コピーしてペーストします。そのまま移動させると問題が出ます。
※ない場合はMicrosoft Visual C++ 2015-2022 Redistributableをインストールしてから集める必要があります。

## 手順5 1つのフォルダにまとめる
すべてのファイルを1つのフォルダにまとめます。mysql.exeを動かすには、同じディレクトリにdllを配置する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/3e9337d8-0738-3db4-ec44-0b57cae17e52.png)

## 手順6 実行する
他のPCにフォルダごと持って行ってバッチファイルをダブルクリックして実行します。
ネットワークがつながっていてフォルダ内にtest.tsvが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/967e2795-abf4-86cd-7d9c-9a85fd0d3fde.png)
```test.tsv
id	name
１	1234567890
１	1234567890
１	1234567890
１	1234567890
```

## 最後に
mysqlのコネクタ、ドライバなどいろいろ試してみましたが、やりたいことを実現するためにこんな感じになりました。
もっと良い方法もあるかもしれません。
tsvをcsvにすることもできると思います。私は置換してカンマに変えようと思います。
[こちら](https://tech.pjin.jp/blog/2019/08/16/how_to_connect_mysql_zip/)の情報を参考にさせていただきました。
herokuにLaravelアプリケーションをデプロイする

## はじめに
Laravelのアプリケーションを作成したのでherokuにデプロイしようとしてつまずいたので、書いていけたらとおもっています。
今回自分はLaravelでのアプリケーションをデプロイしますが、他の言語でもやることはあまり変わらないと思いますので少しでも参考になると幸いです。

herokuコマンドやherokuへの登録は終わってるものとします。
まだの方はこちらの記事を参考に実施してください
https://qiita.com/tetsu-sh/items/f6fcbb6b85df04e5cf3f


### 使用する環境
- MacOS(M1)
- PHP　8.0.19 
- Laravel 9.19.0
- MySQL 8.0.29
- Docker
- LaravelSail


## 早速やっていくよ！！
herokuアプリを作成
```
$ heroku create
```
作成したアプリケーションに移動して
```
#アプリケーション名の確認
$ heorku apps

# 確認した名前をアプリ名としてherokuと連携
$ heroku git:remote -a {アプリ名}

# ちゃんと連携できてるかの確認（herokuが追加されてたらOK）
$ git remote -v
```

アプリケーション直下にProcfileを追加する
```
$ touch Procfile
```
webサーバーにapachを使う場合
```.Procfile
web: vendor/bin/heroku-php-apache2 public/
```

デプロイ

```
$ git add .
$ git commit -m "heroku-deploy"
$ git push origin master
$ git push heroku master
```

heroku configの設定
APP_KEYを確認してherokuにセットする
```.env
APP_KEY=base64:{APP＿KEY}
```
```
$ heroku config:set APP_ENV=production
$ heroku config:set APP_DEBUG=false
$ heroku config:set APP_URL=https://{アプリ名}.herokuapp.com/
$ heroku config:set APP_KEY=base64:{APP＿KEY}
# うまく設定できたのかを確認
$ heroku config
```
デプロイしたのを確認
```
$ heroku open
```
### MYSQLの設定
クレジットカードの設定ができてないとエラーが出るのでクレジットの設定をする
ここで設定する：https://heroku.com/verify
cleardbはMySQL5.7以降だとマイグレーションの時にエラーになってしまうのでJawsDBを採用する（無料）
```
$ heroku addons:create jawsdb:kitefin
こちらでしっかりDBに追加されていることを確認
$ heroku config
JAWSDB_URL: mysql://{文字列}
```

### herokuにDBでの設定をする
ここがなかなか難しくて苦戦しました
自分はてっきり.envファイルに書いてある環境変数かと思ってたんですけど、違いました
間違ってるといつまで経ってもマイグレーション出来ないので注意してください。
正解
```
JAWSDB_URL: mysql:/<username>:<password>@<host>/<databse>
```
```
$ heroku config:set DB_CONNECTION=mysql
$ heroku config:set DB_HOST=<host>
$ heroku config:set DB_PORT=3306
$ heroku config:set DB_DATABASE=<databse>
$ heroku config:set DB_USERNAME=<username>
$ heroku config:set DB_PASSWORD=<password>

# ちゃんと設定できたかの確認
$ heroku config
```
heroku環境でマイグレーション
```
$ heroku run php artisan migrate 
```
```
$ heroku open
```
で確認してエラーが出てなかったら完了！
22222 Contributions ありがとう

22222のスクショが撮れていません。ごめんなさい。作業に夢中になると、基本シングルタスクで、外部割り込みがないかぎり、作業し続けてしまいます。マルチタスクOSは苦手です。代わりに、割り込み処理を多用してきました。

![qiita22222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/6b297378-5800-5432-3199-4833d67d95a9.png)

アセンブラへの道

https://qiita.com/kaizen_nagoya/items/46f2333c2647b0e692b2

凡人の生き残り戦略 〜 凡人網のつくりかた 〜

https://qiita.com/kaizen_nagoya/items/c8e2af61f344761c41be

Viewsが一番多く160,000超えの記事は

M.S.WindowsにPython3(Anaconda3)を導入する（7つの罠）

https://qiita.com/kaizen_nagoya/items/7bfd7ecdc4e8edcbd679

いいね（LGTM)が一番多い記事は

プログラマが知っているとよい色使い(JIS安全色)

https://qiita.com/kaizen_nagoya/items/cb7eb3199b0b98904a35

安全色の記事は、まもなくviews 100,000達成しそうで、四色覚について加筆予定です。

昨年は、

Qiita エンジニアフェスタ 2021 プレゼント企画結果発表

https://blog.qiita.com/engineer-festa-presents-winners-2021/

あなたもdocker, 私もdocker。docker(130)

https://qiita.com/kaizen_nagoya/items/8f2746f10f30b575d0a8

開発環境を豊かにする開発事例　過去・現在・未来

https://qiita.com/kaizen_nagoya/items/d9bf0c2c671fe7f1c749

ありがとうございました。

今年は、タグの充実を主眼において活動しています。
今年登録したタグ４つが、投稿数　週間ベスト１０に４つ入っています。

Open Qiita tag best 10

https://qiita.com/kaizen_nagoya/items/3a53e9997856a5829568

C++N4910:2022 tag follower 300人超えました。ありがとうございます。

https://qiita.com/kaizen_nagoya/items/a63fb96d351ac5c16ff7

ありがとうございます。
telnetとncコマンドでクライアントとサーバ対話させたよ

telnetはそのポート開いているか確認するときに便利だったりするよね

### nc同士

サーバ側
```
[ec2-user@ip-10-0-2-248 ~]$ nc -l -p 12080
こんにちは
こんにちはクライアントさん #サーバ側で入力
こんにちはサーバさん #クライアント側で入力
```

クライアント側
```
[ec2-user@ip-10-0-2-231 ~]$ nc サーバのIP 12080
こんにちは
こんにちはクライアントさん
こんにちはサーバさん
```

※
Ncat: Connection timed out.
→firewallでブロックしてる（EC2ならセキュリティグループの設定確認）


### ncとtelnet（クライアント）
サーバ側は同様

クライアント側
```
[ec2-user@ip-10-0-2-231 ~]$ telnet 3.115.5.128 12080
Trying 3.115.5.128...
Connected to 3.115.5.128.
Escape character is '^]'.
私はtelnetから接続しています #クライアント側で入力
```

サーバ側
```
[ec2-user@ip-10-0-2-248 ~]$ nc -l -p 12080
私はtelnetから接続しています
```

注意：telnet: connect to address サーバIP: Connection refused
ncで対話したときのセッションが残っているので、サーバ側のncコマンドを再度listenさせましょう
```
[ec2-user@ip-10-0-2-248 ~]$ nc -l -p 12080
こんにちは
こんにちはクライアントさん
こんにちはサーバさん
^C
[ec2-user@ip-10-0-2-248 ~]$ nc -l -p 12080
```
telnetコマンド
https://eng-entrance.com/linux-command-telnet
Proxmox で Intel NIC が ハングしたときの対処

# 対象
## ソフトウェア
Proxmox Virtual Environment 7.2-7

## ハードウェア
Intel NICでe1000用のドライバを使うもの。
今回はIntel NUC 5i5RYKというモデル
NICは`Intel® Ethernet Connection I218-V`となってた。

::: note
参考：https://ark.intel.com/content/www/jp/ja/ark/products/83254/intel-nuc-kit-nuc5i5ryk.html
:::

# 現象
Proxmox上のVMでsambaを動かして、1Gbpsフルに使い切るようなファイル転送をしたところハングアップして応答しなくなった。
VMだけでなくProxmox本体の応答もなくなった。
モニタもキーボードも接続しないヘッドレス状態だったため対処できなくなった。

# 対処
## Proxmoxの再起動
モニタとキーボードを接続し、コンソールからログインして再起動した。

:::note warn
本来はエラーメッセージなどがあった場合は記録しておきましょう。
スマホで撮影するとかでもいいと思うので。
何が起きたか調べるヒントになる。
今回は予測ついてたし焦ってたのもあって、何もなし。
:::

## 仮対処
再起動後にProxmoxが使えるようになったら、Proxmoxからホストのコンソールを開く。
今回はe1000に関する問題だとわかってるので、dmesgでネットワークデバイス名を調べた。
pve0は作業したコンピュータのホスト名。
```
root@pve0:~# dmesg|grep e1000
[    1.632344] e1000e: Intel(R) PRO/1000 Network Driver
[    1.632347] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[    1.632628] e1000e 0000:00:19.0: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
[    1.709325] e1000e 0000:00:19.0 0000:00:19.0 (uninitialized): registered PHC clock
[    1.777825] e1000e 0000:00:19.0 eth0: (PCI Express:2.5GT/s:Width x1) b8:ae:ed:7b:82:df
[    1.777830] e1000e 0000:00:19.0 eth0: Intel(R) PRO/1000 Network Connection
[    1.777859] e1000e 0000:00:19.0 eth0: MAC: 11, PHY: 12, PBA No: FFFFFF-0FF
[    1.785755] e1000e 0000:00:19.0 enp0s25: renamed from eth0
[   98.102321] e1000e 0000:00:19.0 enp0s25: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
root@pve0:~# 
```
起動時はeth0だったのが、enp0s25とリネームされている。

ethtoolを使って、e1000ドライバのtsoをoffにする。
```
root@pve0:~# ethtool -K enp0s25 tso off
root@pve0:~# 
```

:::note warn
本当は実行前に確認が必要。
tsoがoffでハングしてたなら別の原因がある
:::

設定できてるかを確認。
```
root@pve0:~# ethtool -k enp0s25 | grep tcp-segmentation-offload
tcp-segmentation-offload: off
root@pve0:~# 
```

:::note
この設定は、次の再起動まで有効。
再起動後はデフォルト(=`tso on`)に戻る
:::

## 対処の永続化
`vi /etc/network/interfaces`でファイルを編集

https://jisaba.life/2022/02/05/e1000e-0000001f-6-eno1-detected-hardware-unit-hang/

上記のサイトを参考に、物理I/Fのところに`offload-* off`を追記。
再起動で反映
```
  offload-gso off
  offload-gro off
  offload-tso off
  offload-rx off
  offload-tx off
  offload-rxvlan off
  offload-txvlan off
  offload-sg off
```

proxmoxはDebian Linuxをベースとしているため、設定ファイルも同じ場所にある様子

# 参考にしたページ
- Nutanix CEでIntel製NIC(e1000e)が繰り返しハングする場合の対処方法│smzklab 

https://smzklab.net/2021/03/nutanix-ce-e1000e-hang.html 

- NICのオフロード設定の変更方法(Linux) | アカスブログ 

https://ac-as.net/how-to-setting-nic-offload/ 

- e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang: | 自鯖

https://jisaba.life/2022/02/05/e1000e-0000001f-6-eno1-detected-hardware-unit-hang/
（仕事爆速化)全ての動きをviにする

みなさんこんにちは。vimmerです。
全ての動きといえば嘘になるのですが、かなりの動きをviに近づけたので今回はその紹介です。

もう右下の矢印キーなんて使ってられません。
あなたもviに身を任せましょう。

## 矢印キーをviにする

viはh,j,k,lの四つで移動ができます。
普段の移動にもこれが使えたら便利ですよね。

私の場合はfunction + h,j,k,lの四つを矢印キーにしています。functionキーが1番左下にあるので触れやすいんですよね。
「ショートカット 自作」等で調べれば出てくるのでやってみてください。


## Google Chromeをviにする

[vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?hl=ja)という拡張機能があるのでこれを使用しています。タッチパッドを触ることなくchromeが操作できます。スクロールをキーボードで行えるのが一番好きです。

## テキストエリアをviにする

[wasavi](https://chrome.google.com/webstore/detail/wasavi/dgogifpkoilgiofhhhodbodcfgomelhe/related?hl=ja)という拡張機能があるので使用しています。
cotrol + Enterでテキストエリアをviにできます。
この記事もwasaviを使用して書いています。日本語の文章を書くときは別にviがなくてもいけちゃうのですが、移動系はやはり便利ですね。動きもそれなりに早いですし、好きです。

## マウスカーソルもviで動かしたいと思うのですが、それはありません

これに関してはもう効率的かどうかさえ分かりませんが、それができるなら一度やってみたいものです。
Next.js  ×  Typescript  で環境構築  


Next.jsとTypescriptで開発環境の構築していきます。

環境{
Mac Os 12.5
Vscode 
}

備忘録です。


## 初めに

エディタのターミナルでnode.jsのバージョン（存在）を確認

```terminal
node -v

// v16.14.0
```

nodeの存在を確認。
これは、JavaScriptのライブラリを管理するパッケージ。
パッケージとしてまとめたファイルが作られる。＝`package.json`
具体的にいつ使うのかはこの後すぐに分かる。

## アプリケーションの作成

##### ①ファイルの保管場所を決める。今回はデスクトップ。
```terminal
cd desktop

//ユーザー名＠ユーザー名PC desktop ←　となればOK
```

##### ② アプリ名を決め、コマンドを実行
```terminal
npx create-next-app {好きなアプリ名} --use-npm --typescript
※{}は不要

npx create-next-app {好きなアプリ名} --typescript
```
下段はnpxを使う方法。今回は上段のnpmを使用しますが、npxの方が便利だと思う。
参考：[npmとnpx](https://zenn.dev/ryuu/articles/what-npxcommand)

```terminal
Need to install the following packages : create-next-app Ok to proceed?

次のパッケージをインストールする必要があるよ。 create-next-app 続行する？

//y (yes)で実行

//Success!　
```
となればOK。


## アプリを立ち上げて画面を表示する

##### ①作成したファイルを開く
`command + O`  でフォルダーを参照しデスクトップから作成したフォルダーを選択


##### ②package.jsonを開いてみる
`package.json`というファイルの中に以下の記述。
```js
  "scripts": {
    "dev": "next dev",
　　　　　　　　//以下省力
  },
```
"dev"に注目。

今回のNext.jsとtypescriptではアプリを立ち上げる際にターミナルで下記のように入力し
出力されたurlをアドレスバーなどにドラッグ＆コピーで画面を表示できる。
```terminal
npm run dev

// url: http://localhost:3000 
```
![スクリーンショット 2022-07-23 16.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280802/503825ba-5508-6a7d-eba2-4d9c646eeef2.png)
となればOK。お疲れ様でした。
以降はファイルの整理と各種ライブラリーのインストールをしていきます。

## 後書き　注意事項　結構重要かも

ご覧いただきありがとうございました。素人ならが毎日Webアプリ制作をして遊んでます。
親の脛をかじる正真正銘20代ニートです（親にお金を渡したら怒られたので仕方なく、、）

さて、今回インストールしたNext.jsをReact(Js)のフレームワークです。
何もしなければ常に最新のReactバージョンがインストールされるわけですね。
今回のReactのバージョンは`@18.20`です。
バージョンアップ間も無くのため、各種ライブラリ等が対応できない場合があり、エラーが出続けることがあります。

ということで、私はこの後にReactのバージョンをあえて`@17.02`へダウングレードします。
様子を見て`@1８`を使っていきます。

参考：[React18から17ダウングレード](https://qiita.com/kenny_engineer/items/050d2b724e1ee00d9427)
ZTNA とは

## 勉強前イメージ

GANTZみたいなつづり・・・

## 調査

### ZTNA とは

Zero Trust Network Access の略で、 [ゼロトラスト](https://qiita.com/miyuki_samitani/items/5bfb9b7ae2eb7a36ad57) の考え方をベースにしたネットワークのアクセス方法になります。
コロナの影響で在宅業務が進んでおり、自宅からはVPNを使用してアクセスされていることも多いですが
VPNは社内は安全で社外は危険という境界線を引いている考え方になっています。
しかし、その一線を突破されてしまうと安全な場所が安全ではなくなってしまいます。
ZTNAはゼロトラストという社内も社外も信頼できない考え方を元にしたアクセス方法のことを指します。

ZTNAはユーザや場所、デバイスを問わずにアクセス制御できるので
上記でも記載した在宅勤務やそれに伴うクラウドサービスの利用の増加など環境が様々変わっても制御できるようになっています。

### ZTNAのタイプ

- サービス主導型

ソフトウェアやコントローラーを使って集中的なアクセス制御を行います。
特徴はクラウド上にサービス基盤が存在します。
ZTNAの有名なメーカーはこのタイプが多いです。

- クライアント主導型

オンプレとクラウドの両方から使うことができ、既存のVPNから移行する際にはこちらのタイプがアーキテクチャの変更点が少ないです。
SaaSを利用しているので、場所・機器にかぎらずログインが可能です。


## 勉強後イメージ

## 参考

- [ZTNA (Zero Trust Network Access)](https://www.nec-solutioninnovators.co.jp/ss/insider/security-words/67.html)
- [ZTNA（ゼロトラストネットワークアクセス）とは？種類や特徴を解説](https://locked.jp/blog/what-is-ztna/)
長くないAndroid端末の見分け方

Titan Slimを入手したので、その他の特殊な画面サイズの端末と一緒にリソース解像度を取得しました。

```MainActivity.kt
    val qualifier = getString(R.string.qualifier)

    val configuration = resources.configuration
    val dpHeight = configuration.screenHeightDp
    val dpWidth = configuration.screenWidthDp
    val density = configuration.densityDpi
    val swdp = configuration.smallestScreenWidthDp
    val aspect = resources.configuration.screenLayout

    val LongNo = (aspect and Configuration.SCREENLAYOUT_LONG_NO) != 0
    val LongYes = (aspect and Configuration.SCREENLAYOUT_LONG_YES) != 0

    val textView = findViewById<TextView>(R.id.text)

    textView.text = "qualifier = ${qualifier}\n-----\n" +
            "smallestWidth = ${swdp} [dp]\n" +
            "Width = ${dpWidth} [dp]\n" +
            "Height = ${dpHeight} [dp]\n" +
            "Density = ${density} [dpi]\n" +
            "Long YES/NO = ${LongYes}/${LongNo}\n" +
            "\n------\nconfiguration = ${configuration}"
```

結果がこちら。

|画面タイプ|機種|smallestWidth[dp]|Width[dp]|Height[dp]|Long|Qualifier|
|:---|:---|:---|:---|:---|:---|:---|
|正方形|Titan|572|572|542|not|sw500dp-notLong|
|正方形|Titan Pocket|520|520|483|not|sw500dp-notLong|
|短い長方形|Titan Pocket (narrow mode)|432|432|665|not|sw360dp-notLong|
|短い長方形|Titan Slim|384|384|600|not|sw360dp-notLong|
|短い長方形|BlackBerry KEY2|411|411|593|not|sw360dp-notLong|
|普通のスマートホン|Pixel 5a|411|411|838|long|sw360dp|
|タブレット|Lavie Tab 8|600|600|888|not |sw600dp|

Resource Qualifierは以下の様に設定することで、見分ける事が出来ました。
Titan/Pocketの正方形画面は、sw500dp-notLongで適用。(sw500dpで3:2とかの端末があるかもしれない）
BlackBerryなどの3:2系の画面は、sw360dp-notLongで適用。
いわゆる普通のスマホはlongなので、sw360dpを適用。
タブレットはsw600dpを適用。

Jelly2 などの小型端末については持ってないので分かりません。

誰かの何かの役に立てばいいなあ。


＃あらためて上の表見てみると、BlackBerryの解像度設定はわりかしまともで、Titanシリーズの解像度設定がめちゃくちゃだというのが分かる。
Xcode13で生成したプロジェクトにInfo.plistを追加する

表題の通り、Xcode13で生成したプロジェクトにInfo.plistを追加して古いXcodeでもビルド実行できるようにする備忘録。

`Info.plistがない！コピペ^H^H^H写経できない！`って人には関係ない話なので、他の記事をどうぞ。


### 経緯

Xcode13で作成したプロジェクトをXcode12で開こうとしたら、開けない。
まあ、あるよねー、とプロジェクトファイルの互換性設定を書き換えてやる。

![スクリーンショット 2022-07-23 16.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66847/5df9cae8-4b32-c587-7b92-777390a4c680.png)

と、開けるようにはなるんだけど、実行しようとすると

`No Info.plist file in application bundle or no NSPrincipalClass in the Info.plist file, exiting`
と起動しない。

確かに、よく見るとプロジェクト内にInfo.plistがいない。。。

### 原因

Xcode13からInfo.plistの内容をxcproject内に保持して、ビルド時に自動生成するようになったらしい。

### 対処

#### Info.plistの確保

Xcode13でアプリ実行して、ドックのアイコンを右クリックからのfinderで表示で、アプリケーションバンドルの中から自動生成されたInfo.plistを奪ってくる。

![スクリーンショット 2022-07-23 16.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66847/314e22a3-e34f-9655-4d5d-571bf5fcb4ab.png)

ゼロから自分で作ってもいいけど、面倒なので。

#### プロジェクトに追加

奪ってきたInfo.plistを適当なとこ（プロジェクトのソースルートなディレクトリ）とかに配置して、プロジェクトにドラッグ＆ドロップして追加。
（最初から直に投げ込んでCopy if neededでもいいはずだけど、あんまり信用してない）

ソースコードではないので、ターゲットに追加はしなくてもいい。

Info.plistがいつもの位置に戻ってきました。

#### 設定変更

追加しただけだと当然に使ってくれないので、ターゲットの設定をいじって、Info.plistを認識させる。
ついでに自動生成を切る。

![スクリーンショット 2022-07-23 17.00.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66847/d89702ed-171e-c5c8-17b5-f787e75bbe3f.png)

Packagingのとこ
`GENERATE_INFOPLIST_FILE`があるので、`YES`を削除
`INFOPLIST_FILE`にルートからのファイルパスを追記


で、うまくいくはず。
PostgreSQLでカーソルはすでに使われていますを回避する方法

# 事象
PostgreSQLのファンクション内でカーソルを開き、カーソルを閉じる前に別の(同一でも構わない)ファンクションを呼び出すと、カーソル名が被っている場合に、

> ERROR: カーソル "my_cursor" はすでに使われています

といったエラーが発生する。一般的なプログラミング言語で考えれば、スコープが違うだろと思うが、PostgreSQLにおいてはそうではないらしい。異なるファンクションを呼び出すのであればカーソル名を一意にすればよいが、同一ファンクションを再帰的に呼び出す場合はその方法では解決できない。

# エラー再現
エラーを再現するために、test_tableのnumに値が入ると全てのnumが5に書き換えられるという意味不明なファンクションを作ってみる。

```SQL
-- テストテーブルの作成
CREATE TABLE test_table (
    id SERIAL,
    num INTEGER
);

-- エラー再現ファンクションの作成
CREATE FUNCTION cursor_error_function () RETURNS trigger
    LANGUAGE plpgsql
    AS $$

    DECLARE
        var_current_id INTEGER;
        error_cursor CURSOR FOR
            SELECT id FROM test_table WHERE num != 5;

    BEGIN
        OPEN error_cursor;

        <<read_loop>>
        LOOP
            FETCH error_cursor INTO var_current_id;
            
            IF NOT FOUND THEN
                EXIT read_loop;
            END IF;

            UPDATE test_table SET num = 5 WHERE id = var_current_id;
        END LOOP;

        CLOSE error_cursor;
        RETURN NULL;
    END;
    $$;

-- テーブルに設定
CREATE TRIGGER error_trigger
    AFTER INSERT OR UPDATE ON test_table FOR EACH ROW
    EXECUTE FUNCTION cursor_error_function();

-- 実行
INSERT INTO test_table (num) VALUES (3);

-- 結果
-- ERROR: カーソル "error_cursor" はすでに使われています
-- CONTEXT: PL/pgSQL関数cursor_error_function()の9行目 - OPEN
-- SQL文 "UPDATE test_table SET num = 5 WHERE id = var_current_id"
-- PL/pgSQL関数cursor_error_function()の20行目 - SQLステートメント
```

# 解決策
カーソルを使わなければよい。
ループ -> カーソルと考えがちであるが、FOR INを使っても同じ処理を書くことができる。

```SQL
-- 上記で作ったトリガー・ファンクションの削除
DROP TRIGGER IF EXISTS error_trigger ON test_table;
DROP FUNCTION IF EXISTS cursor_error_function;

-- 正しく動くファンクションの作成
CREATE FUNCTION cursor_success_function () RETURNS trigger
    LANGUAGE plpgsql
    AS $$

    DECLARE
        var_current_id INTEGER;

    BEGIN
        FOR var_current_id IN (SELECT id FROM test_table WHERE num != 5)
            LOOP
                UPDATE test_table SET num = 5 WHERE id = var_current_id;
            END LOOP;

        RETURN NULL;
    END;
    $$;

-- テーブルに設定
CREATE TRIGGER success_trigger
    AFTER INSERT OR UPDATE ON test_table FOR EACH ROW
    EXECUTE FUNCTION cursor_success_function();

-- 実行
INSERT INTO test_table (num) VALUES (3);

-- 確認
SELECT * FROM test_table;

-- 結果
--  id | num
-- ----+-----
--   2 |   5
-- (1 行)
```
yarn2に移行してみる

yarn2に移行してみる。
依存モジュール丸々コミットしてしまおうというZero-Installsが目玉。

# 移行作業

ここに書いてる通り

https://yarnpkg.com/getting-started/migration


## yarnバージョン設定

```
yarn set version berry
```

何やら追加された

```ruby:package.json
  "packageManager": "yarn@3.2.2"
```

.yarn/releases/yarn-3.2.2.cjs
.yarnrc.yml
.yarn/...

これらはCommitするものなのでCommitする。


node_modules使う場合は、nodeLinkerの設定を行う。
今回は飛ばす。

## install

```
yarn install
```

なぜかnode_modulesができて
.yarnrc.ymlに
nodeLinker: node-modules
が追記された。

yarn.lockがあると互換性のためにnode-modulesができるようだ。
yarn.lockを消してやり直したらnode-modulesができなかった。

node_modulesがあること前提のモジュールがあるから互換性のために
node-modules残すということか。

node_modules見に行くのは開発ツール系だろうが、
概ね対応しているっぽい。

ツールの対応状況は以下

https://yarnpkg.com/features/pnp#native-support

## コミットするファイルを決める

install後、各種ファイルが追加された。
Zero-Installsを使うかによって、何をコミットするか決める。

https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored


今回はZero-Installsにするため、.gitignoreに以下追記。

```ruby:.gitignore
.yarn/*
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
```

さて、Zero-Installsにした場合、モジュールのファイルサイズが気になるところ。

以下パッケージがある場合でinstallでサイズ比較してみる。

```
    "@types/react": "^18.0.15",
    "@types/react-dom": "^18.0.6",
    "@typescript-eslint/eslint-plugin": "^5.30.5",
    "@typescript-eslint/parser": "^5.30.5",
    "eslint": "^8.0.1",
    "eslint-config-prettier": "^8.5.0",
    "eslint-config-standard": "^17.0.0",
    "eslint-plugin-import": "^2.25.2",
    "eslint-plugin-n": "^15.0.0",
    "eslint-plugin-promise": "^6.0.0",
    "eslint-plugin-react": "^7.30.1",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "typescript": "^4.7.4"

```

Zero-Installsの場合
.yarn/cache
31.0 MB
ファイル数: 216

Zero-Installsなし
node_modules下
98.8 MB
ファイル数: 6,440

圧縮してるからファイル数激減は当然として、サイズは3割ぐらいか。
使用するモジュールが対応してればデメリットはない気がする。

# エディタ設定

TypeScriptのコンパイルエラーが出ている。
VSCodeの設定を行う。

https://yarnpkg.com/getting-started/editor-sdks

```
yarn dlx @yarnpkg/sdks vscode
```

何やら追加された
.vscode/extensions.json
.yarn/sdks/...

.vscode/settings.json
も追記されている。

TypeScriptやらEslint関連のファイルができてる。

VSCodeでワークスペースのTypeScriptバージョンを使用するように設定。
（.tsとか開いて下にTypeScriptと出てるところをクリックして選択できる）
これでコンパイルエラーがなくなる。
裏で何してるのかはよくわからないができた。

.yarn/sdks/
はCommit推奨。

.vscode/はなんか微妙だがコミットして運用しても良いかも。

なんか初期設定が色々あるのが微妙だが、
誰かがCommitしておけばクローンやブランチ切り替え後のinstallとかもないし、
CICDも早くなりそうなので、良さげ。
python3 二次方程式 解の公式

二次方程式 $ax^2 + bx +c$ を解の公式$ \frac{-b\pm\sqrt{b^2-4ac}}{2a} $を使って解くにはsympyというライブラリを使うと簡単にできます。まずはpipでsympyを導入
```
pip install sympy
```
sympyのsolveメソッドを使って解きます
# コード
```python
from cv2 import solve
import sympy

x = sympy.Symbol('x')#文字Xを定義
a,b,c = sympy.symbols('a b c')#文字abcを定義
ex = a*x**2 + b*x + c#二次方程式

print(sympy.solve(ex,x))
```
[(-b - sqrt(-4*a*c + b**2))/(2*a), (-b + sqrt(-4*a*c + b**2))/(2*a)]と出力されていればOkです
DLP とは

## 勉強前イメージ

セキュリティ周りの用語だって知ってるけど、それ以外はわからんwww

## 調査

### DLPとは

Data Loss Prevention(データ損失防止)の略で、情報漏洩を防ぐセキュリティツールやシステムのことを指します。
通常のセキュリティツールでは全般的な攻撃は防げますが、データそのものを監視して情報漏洩を防ぐことに特化しています。
また、従来の情報漏えい対策は正規のユーザによる情報漏洩は防げません。
DLPではユーザなど関係なく、データを監視するので正規ユーザによる情報漏洩の防止も可能です。

### DLPの機能

- デバイスの制御

デバイスとはパソコンやスマホを指し、各デバイスからの情報漏洩を防ぎます。
一元でデバイスの制御をして、デバイス単位でUSBやSDなどの使用を許可/不許可したりすることができます。

- コピーの制限

データのコピーも制限できます。
コピペや画面キャプチャからも情報漏洩することもあり、細かい単位での制限ができます。

- webサイトのセキュリティ

危険なwebサイトへのアクセスも制限できます。

- コンテンツの監視

機密情報そのものの監視を行います。
不審な動きや異常を発見した際にはすぐに通知を行うことができます。

- メールの監視

メールには情報漏洩につながるリスクが多くあり、ヒューマンエラーなどが多く存在します。
DLPではメールで機密情報が含んでいるメールを送れなくすることができるため、リスクを減らすことができます。

## 勉強後イメージ

データ自体の監視ができるってことなのか・・・
じゃぁいきなりUSBメモリに数GBのデータを送ってたりすることも監視できたりするってことね。

## 参考

- [効率的なデータ保護を実現！ DLP の概要、機能、メリット、活用事例まで一挙に紹介！](https://www.topgate.co.jp/dlp)
- [DLPとは？従来の情報漏洩対策との違いから、機能、活用事例まで紹介](https://it-trend.jp/dlp/article/what_dlp)
Excel VBA H80004005 (-2147467259) オートメーション エラーのトラブルシューティング

### Excel VBA H80004005 (-2147467259) オートメーション エラーのトラブルシューティング

- 該当環境
・Windows10 Pro
・Office2019 home and bisiness

- 事の発端
22年7月中旬頃、Office2019で仕事用のVBA付きEXCELを開いたところ突然エラーが発生。他のファイルもエラーが発生したため調査し、どうやらOfficeのアップデートパッチに起因するものだと判明（22年7月のOfficeアップデート内容）。Officeを一旦アンインストール後、再インストールしたが事象がなおらない。どうやら更新プログラムのロールバックが有効と判明。

- 対応方法
1. コマンドプロンプトを右クリック。メニューから管理者モードで開く。
1. ClickToRunのフォルダまで行く。
1. 22年4月まで一旦ロールバック（16.0.15225.20204）Office2019は16.0.*で他は未確認。コントロールパネルのプログラムと機能のOfficeのバージョンに現在の適用バージョンが書いてある。更新内容の詳細はこちら（ https://docs.microsoft.com/ja-jp/officeupdates/microsoft365-apps-security-updates )
1. M$の対応が済むまでOfficeの自動アップデートを停止させる。ファイル→アカウント→Office更新プログラムで自動更新を無効にする。


- 実行コマンド
```
cd %programfiles%\Common Files\Microsoft Shared\ClickToRun
officec2rclient.exe /update user updatetoversion=16.0.15225.20204
```
コンピュータはキロバイト (KB) ではなく、キビバイト (KiB)

コンピュータは2進数で表すから キロとかは 10^3 の 1000 ではなく、厳密には 2^10 の 1024 だよ～というのは大学で教わってから知ってたけど、単位にもキロバイト (KB) ではなく、キビバイト (KiB) ていう単位があるのは知らなかった！！！

参考としてペタまで～

| n | 10^n | 名称 |  | n | 2^n | 名称 |
| :-: | :-- | :-: | :-: | :-: | :-- | :-: |
| 3 | 1,000 | キロバイト (KB) |  | 10 | 1,024 | キビバイト (KiB) |
| 6 | 1,000,000 | メガバイト (MB) |  | 20 | 1,048,576 | メビバイト (MiB) |
| 9 | 1,000,000,000 | ギガバイト (GB) |  | 30 | 1,073,741,824 | ギビバイト (GiB) |
| 12 | 1,000,000,000,000 | テラバイト (TB) |  | 40 | 1,099,511,627,776 | テビバイト (TiB) |
| 15 | 1,000,000,000,000,000 | ペタバイト (TB) |  | 50 | 1,125,899,906,842,624 | ぺビバイト (PiB) |


一般的にキロバイトとかの方が知れ渡ってて伝わりやすいし、言い慣れてるからキビバイトなんて使わないけどね～。
ちなみにクラウドサービス Microsoft Azure の ストレージサービスである Blob Storage で使われているデータサイズの単位が MiB って書いてあったのが調べたきっかけ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/fce2a9da-5800-58d5-7af7-abf8c59092c0.png)
ネットワーク未経験者のCCNA合格体験記

CCNAやっと取れた~~~ので、自分用の記録も兼ねつつ、これから受験する人に向けて書き残したいと思います。

## 受験動機
LinuCと並んで「インフラエンジニアの登竜門」らしいので、取って損はないだろうとゆるい気持ちで勉強始めました。
しかし、体感LinuCの3倍は重みのある内容でした。私のようにネットワーク系じゃない方には全然おすすめできない。。

## 受けてみて思ったこと
私が「ネットワーク」と聞いてイメージしていた、家庭にあるルーターやインターネットの話はあまり出てきませんでした。
企業規模でのネットワーク構築の話が主です。(そりゃそうだ)

勉強始めてそれに気づき(アホ)、「しばらくは使わない知識だしなー」とモチベ落ちてだらだらしてましたが…
一通りやってみると、セキュリティや誤り検出などの情報通信のもろもろが絡んできて、コンピュータサイエンスの基礎知識埋める意味でも取ってよかったと感じています。

### CCNA取るか迷ってる方へ
CCNAはネットワークの専門資格なので、IT業界でもネットワークインフラやらない人ならあまり出て来ない知識です。
つまるところ、学習の難易度がかなり高い資格です。。ネットワーク未経験なら知識の土台作りからなので…

知っていたほうが良さげな知識はたくさん身につきます。
が、迷っているなら、業務や行きたい職種により近い勉強・資格(国家資格)優先がいいと思います。
暇なときに「CCNAイージス」というサイトを覗いたり、Youtube(ウズウズカレッジというチャンネルがわかりやすいです)を見たりして、ある程度知識ついてから受験目指すのがおすすめです。

## どのように勉強したか
### 勉強時間
4ヶ月、毎日1~2時間くらい(しない日もあった)+通勤時間にping-t
推定、合計で150時間くらい

### 使った書籍・サイト
まず白本を1周、あとの100時間くらいはずっとping-t。
受験2週間前と1週間前に、白本付属の模試やりました。(白本は50問の書籍模試、102問のPDF模試が付属してます)
抜けてる知識があれば、「HSRP ネットワークエンジニアとして」[検索]、って感じで、CCNAイージスのサイトを見てました。
(白本はさっと調べるのには使いづらかったので、1周後は模試以外全く見てません。。)

白本は練習問題の解説がないので、問題演習はもっぱらping-tでした。
本で一通り勉強したいタイプなら白本はおすすめですが、書籍もタダじゃないので、評判の良い黒本のほうが合う人もいると思います。
私は使ってないので、詳しくは他の方のレビューとping-tの合格体験記調べてみてください。

ping-t模試で85%くらい安定して取れるようになったので受けに行きました。成績の推移はこんなかんじ↓
受験2週間前、ping-t模試70%、白本模試60%
受験1週間前、ping-t模試80%、白本模試80%
受験週、ほぼ毎日ping-t模試やって85%前後
(※模試の102問を30~40分で解く練習もしていました。他の方の体験記を見ると、試験時間が足りない!という報告が多かったですが、この訓練のおかげで1時間近く時間が余りました。)

以下、受験時のスコアレポート。
問題数は100問、分野ごとの正答率のみで点数は表示されませんでした。
愚直に平均すると83.7%になりますが、問題の単元ごとの割合や実際の得点も知りたいところです。
(すみません、私が絶望的に英語ワカラナイので日本語いれてます)
![ccna_score.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1919799/791e722e-3abe-0a38-1458-f90e73f3b6b8.png)

## 受験にあたって
皆言ってますが、Cisco語が普通に読みづらいです。
英語試験そのまま翻訳した感じなので、日本語の参考書やping-tに出てくる言葉とは結構違います。

とはいえ、単語拾いつつ読めば
2割 ちゃんとわかる
7割 なんとなくわかる
って程度には解けるので(※1割 マジで何言ってるのかわからん)
わりと大丈夫でした。

一応Cisco語対策として、↓の英語のCCNA問題をクロームの機能で翻訳しながら解きました。
https://www.itexams.com/exam/200-301
結構効果あります。20問くらいしかやってないですが、頭が痛くなる文章を先に味わっておくと、本試験のストレスだいぶ減りますよ。

ちなみにこの対策法、私が「Cisco語 対策」と調べて出てきた、超ありがたいブログのおかげで知りました。
登録方法から書いてるので、ぜひ読んで下さい。
[CCNA対策～Cisco語の作り方～ - Crieit](https://crieit.net/posts/CCNA-Cisco "CCNA対策～Cisco語の作り方～ - Crieit")

あとは本人確認書類2つ必要なので、前日によく確認しておくと安心です。

## おわりに
今までは会社で勉強させてもらいつつ資格を取っていたので、自分から勉強して取った達成感は大きいです。
勉強中は、仕事で時間とれなかったり、わからなすぎて体が受け付けなかったりと、結構しんどかったですが、無事取れたので結果オーライ。

CCNA目指す方、ヘビーな内容も多く心が折れるのは普通なので、何度でも立ち上がって取りにいきましょう!!
私にとってのアジャイル

「あなたの事を一言で表すと？」と問われると自分の特徴なんかを抽出する作業を楽しんで回答しますが、自分や他人の事を一言で表せるわけなんてないってことは誰しもわかっていることだと思います。

それと同じように、それ以上にアジャイルの事を一言で表すのは難しすぎるし無理だしそもそも理解していないほど端的に伝えようとしてしまうものなんだろうなと確信しはじめた矢先、ウォーターフォールと対比させてどっちとかそういうものではなく私にとってのアジャイルは仕事そのものというか「ビジネスガイド」なんだなとしっくりくる一言を見つけてしまい。

アジャイルライクな業務歴はまだ一年程度なのですが、会社に向かう道中や家までの帰り道はずっとボーっとアジャイルやスクラムのことを考えるくらいにハマっていて、最近は妄想ばかりでインプット疲れといいますか溜め疲れといいますか、そこに自身のアジリティの低さが表れているので少しづつでも書いてみたいなと。

大きな方向性というか、書きたいこと、目的ですが、
システムの現場だけでなく世の中全体がアジャイルというものを知って一人でも多くの人が仕事を楽しめるようになると良いなと。そのためには汎用性のあるアジャイルの要素を抽出、発信することで、それを受け取った各自が持ち帰り小さく一人でも実践し始めれる、再現性ある情報提供をしてみたい。といった感じです。

例えばですが、私がアジャイルに触れて最初のころに見た絵です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742874/e3f17412-0525-1141-cb68-d89d2886cf65.png)
これ、システムや製造の現場だとイメージしやすいのですが、販売、営業、医療や介護、運送、事務などの職種だとピンときづらいと思ってるんですね。少なくとも私は「メリットがわたったとて、実際に活用することはできないだろうな・・」と思ってました。
理解力のある方はここから事の本質を捉え良い部分を手元に適用できるかもしれませんが、そうじゃなければ理解がここで止まってしまって「自分には関係ないや」と思わせてしまってるんじゃないかなという印象です。もしそうだとすると非常に勿体ない。

またシステム開発目線においても、もしこの絵がせめて4のバイクで止まっていたらより良い絵になりそうだなと。「結局５で似たような車がゴールならウォーターフォールでもええやん」とまでは思わなかったものの、初めてこの絵を見つつアジャイルの説明を受けた時にその大きなメリットの一部分しか理解できていなかったように思います。

下側（Like This!）の絵の本当のメリットは早期の段階にあり、１や２の時点でズレがあれば
- 引き返しやすい
- 方向転換しやすい
- リスタートしやすい
- 中断しやすい

ズレがなければ
- 後期で話が覆りにくい
- 確信を持ちながら前に進める
- 段階的でわかりやすく集中しやすい
- 目的を見失いにくい

などなど。細かくすれば他にも色々あるでしょう。

こう考えるとどんな仕事にも共通していて「責任者の指示で部下が実行する」という、従来型の基本的な仕事のプロセスにおいても適用可能、
- まず必要最低限の動きを取ってみる
- 早い段階でそれで良いかを確認する

という至ってシンプルな話で、仕事の世界で昔から普通にやっている日報とか週報はまさにインクリメンタルでフィードバックを得るレビューや振り返りだとも思っています。これは単なるスコープの話で成果物を柔軟に定義できるかがポイントではあるのですが。

---

私にとってのアジャイルは「昔からやってることとそう変わらないが、これまで曖昧だった仕事というものの共通点を整理し定義化したもの」。もう少しだけ具体的に言うと「ズレを防ぐために小さく刻み周囲と協調しつつ進める それこそがチームワークであり仕事」というような。ここにアジャイルの本当の魅力を感じています。

アジャイルやスクラムの話になると二の次に日本企業の衰退とセットで「不確実性」という言葉が飛び出してきますが、そもそもインターネットが存在しなかった時代の方がみんな手探りで藻掻いてて遥かに不確実だったような気もしますし、また、「不確実だから～」とか「小回りが利くように～」というのも確かにそうなんですが、対"世の中の産業情勢"な説明を受けると、途端にアジャイルがプロダクト単位またはそれ以上の大きな括りに思考が持って行かれてしまう感じが否めず。そうなると現場で実践！個人でも実践！からは遠ざかってしまう気がします。

というように、ウォーターフォールvsアジャイルといった新旧対決！昭和vs令和、みたいなわかりやすい紹介がもたらす誤解というか副作用はなかなか大きいなと。

私がアジャイルに関心を持っている別職種の方へ話をするときは、次の絵の方を先に見せるほうが良いなと、この記事を書きながら思いました。そろそろ長くなってきているので、この辺で「1」とさせていただきますね。アジャイルスクラム本当面白いです。コメントフィードバックお待ちしております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742874/3421c2db-d46b-0045-083a-c66cd2b67c25.png)
Webブラウザ上で直接、コンテンツを編集できるcontenteditable属性


Notion内で、Webブラウザ上で直接、文字を編集できるのを見て、どのような仕組みで動いているのかチェックするためにソースコードを覗いてみました。

Notionはブロック単位、ブロックの集合体で、コンテンツを形成していて、個別のブロック内は、以下のようなHTMLになっていて、
```html
<div class="notranslate" (中略) contenteditable="true">

</div>
```
その中の、contenteditable属性をtrueとすることで、編集ができそうです。そこで、自分でも、ソースコードを書いてみて、編集することにしました。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>編集可能ページ</title>
    <style>
        .content{
            width:100%;
            height:100%;
            background-color:beige;
        }
    </style>
</head>
<body>
    <div class="content" contenteditable="true">

    </div>
</body>
</html>
```
ブラウザで直接、アクセスしてみると、以下のような、まっさらなブロックになっていて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/49c3a1d0-3cee-5701-c4db-e42cd3bb347d.png)
ブロックを操作してみると、直接、文字を入力できたり、ブロックの終端まで、エンターキーで改行すると、ブロックの高さがどんどん伸びたり(CSSのheight属性がパーセントなどの相対的な値の場合)、文字だけじゃなくて、画像も直接貼ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/e9d911f3-2948-9c09-5468-eead84578120.png)

何か新しいWebサービスを作るためのヒントになりそうです。:grin:

### リンク
- [contenteditable - HTML: HyperText Markup Language | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/contenteditable)
laravel Featureテストで実行時にエラー発生

# 概要

- FeatureテストにてsetUp()関数にてfreshマイグレーションとシーディングを行った時にエラーが発生したので解決までの経緯をまとめる。

# ご注意

- 本知見は[https://zenn.dev/y640/articles/qiita-20210807-1db7786d2db36cfabe05](https://zenn.dev/y640/articles/qiita-20210807-1db7786d2db36cfabe05)の記事に記載されていた内容にて筆者が体験したことを記載しております。
- 解決策は筆者の知見ではなく引用元記事の筆者様のものです。

# エラー発生までの経緯

- 任意のFeatureテストクラスを作成しsetUp()関数に下記のように記載を行った。

    ```FooTest.php
    use RefreshDatabase;

    public function setUp(): void
    {
        parent::setUp();
        
        Artisan::call('migrate:fresh --seed');
    }
    ```

# エラー

- テストコードを実行したところエラーが発生した。

    ```
    PDOException: There is no active transaction
    ```

# エラー解決までの経緯

- エラーで検索したところ下記の記事を発見した。
    - [https://zenn.dev/y640/articles/qiita-20210807-1db7786d2db36cfabe05](https://zenn.dev/y640/articles/qiita-20210807-1db7786d2db36cfabe05)
- どうやら呼んでいるトレイトがRefreshDatabaseだとダメなようだ。DatabaseMigrationsトレイトを呼んで見ると正常にテストが実行できた。

# 謝辞

- 本問題は[https://zenn.dev/y640](https://zenn.dev/y640)様のご知見により直ぐに解決する事ができました。改めてお礼申し上げます。

# 参考文献

- [https://zenn.dev/y640/articles/qiita-20210807-1db7786d2db36cfabe05](https://zenn.dev/y640/articles/qiita-20210807-1db7786d2db36cfabe05)
Microsoft Inspire 2022:Purview関連のセッション

2022年のMicrosoft InspireのPurview関連の以下の二つのセッションのメモです。

* Microsoft Purview を使ってデータを保護
* Microsoft Purview と Microsoft Priva Platforms - パートナー エコシステムに関する機会

# そもそもPurviewって何？

データに軸足をおいたガバナンス サービスです。データにメタデータをつけて管理する仕組みを提供します。

https://docs.microsoft.com/ja-jp/azure/purview/

# Microsoft Purview を使ってデータを保護

このセッションで紹介されているのはMicrosoft Purview Information Protectionです。このサービスは 以前はMicrosoft Information Protectionと呼ばれていたもので、公式のドキュメントもAzureの中ではなく、Microsoft 365の中にあります。

https://docs.microsoft.com/ja-jp/microsoft-365/compliance/information-protection?view=o365-worldwide

Purview Information Protectionでは以下のようなデータを把握し、ラベルを定義して分類し、誤って共有されてしまうこと防ぐ仕組み持っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16609/6e3ce96b-4868-19a1-a483-12494cfa9fdd.png)
※引用元は[こちら](https://docs.microsoft.com/ja-jp/microsoft-365/compliance/information-protection-solution?view=o365-worldwide)

Excelに秘密ラベルを適用した場合は以下のようになるみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16609/8165fd33-2d8f-07bc-450f-841059a82ba6.png)
※引用元は[こちら](https://docs.microsoft.com/ja-jp/microsoft-365/compliance/sensitivity-labels?view=o365-worldwide)

# Microsoft Purview と Microsoft Priva Platforms - パートナー エコシステムに関する機会

PrivaはAIを使って個人情報の検出を支援するサービスです。

https://www.microsoft.com/ja-jp/security/business/privacy/priva-privacy-management-software

アメリカではeディスカバリーと呼ばれる、民事訴訟の際に自主的に電子証拠の開示をしなければならないという制度がありますが、Purviewはこれを支援する機能（Purview eDiscovery）も提供しています。

https://docs.microsoft.com/ja-jp/microsoft-365/compliance/ediscovery?view=o365-worldwide

これらのサービスをMS製品以外にも使えるようにするにするパートナーの活動をMSは支援しているし、この分野に対するソリューションは成長していますよ、という内容でした。
git ignoreが反映されない！？

噂によるとキャッシュが原因らしい。。。

### 原因

- 以前にファイルをgitにpushしているとキャッシュが影響して反映されないとかなんとか。
- 詳しくはRefを見てください


### 手順
1. .gitignore 編集
1. キャッシュを削除
1. commit & push


キャッシュ削除する際は下記コマンドを実行してみよう
```
$ git rm -r --cached . //ファイル全体キャッシュ削除
$ git rm -r --cached [ファイル名]  //ファイル指定してキャッシュ削除
```


### Ref
- https://qiita.com/fuwamaki/items/3ed021163e50beab7154
Python: 一行で標準入力から複数行受け取り改行を取り除いて格納する


```python
import sys

lines = map(lambda s: s.rstrip(), sys.stdin.readlines())

## 確認用
print("-".join(lines))
```

### input
```
aaa
bbb
ccc
```
### output
```
aaa-bbb-ccc
```
Microsoft Certified: Azure Data Fundamentals（DP-900）資格勉強方法

AzureのMicrosoft Certified: Azure Fundamentalsに2022年6月に合格したので、勉強方法を共有します。

# 試験概要
概要まとめとしては以下3つがわかりやすくまとまっている

https://qiita.com/nvtomo1029/items/baf7d8e8ac05fe932768

https://teshi-learn.com/2021-05/microsoft-dp-900/

https://www.simpletraveler.jp/2020/09/26/microsoftazure-certificate-report-azuredatafundamentals-dp900/

# 勉強方法
日本語ベースで学習できる教材は公式のもののみ。
AZ-900（Azure Fundamentals）を取得後だとベース知識が活かせる。
また、データベースの一般的な知識があるとテスト対策となる。

## Microsoft Learn
公式にて無料で学習できる

https://docs.microsoft.com/ja-jp/learn/certifications/azure-data-fundamentals/

上記Learnの内容を半日x2回で凝縮したウェビナー
参加すると試験1回分の無料バウチャーがもらえる

https://www.microsoft.com/ja-jp/events/top/training-days/azure?activetab=a1:primaryr6

無料でウェビナー形式の問題集解説
問題も多く試験範囲を網羅しているので問われる内容を理解できていれば大丈夫

https://info.microsoft.com/JA-AzureSQL-WBNR-FY21-04Apr-14-MKTOFY21DP900PrepSessionOn-demandWebinar-SRDEM71243_LP02OnDemandRegistration-ForminBody.html
LightsailでWordpressを後からMultisite化する手順まとめ

AWS Lightsailで Wordpressブログを一つ運営していたのですが
色々あってサブドメインでマルチサイト化したいと思い、やってみています。

あちこちのサイト様を参考にさせていただいたのを、まとめています。


# ⓪ FTPソフトをインストールしておく

私はMacの「ForkLift」を使ってます。
「SFTP」接続してください。SSHキーの権限に注意です。

https://qiita.com/tomokei5634/items/9f76ae3a5e2f004f27ef

# ① wp-config.phpを書きかえ

https://help.colorfulbox.jp/manual/wp-multisite-use/

WordPressをインストールしたディレクトリ直下にある「wp-config.php」に下記の設定を追記します。

``` 
define('WP_ALLOW_MULTISITE', true);
```
書くべき場所はよくわからなかったんですが90行目近辺に書きました。。

# ② httpd-app.confを書き換えて,「.htacces」を編集可能にする
https://vanbi.com/aws-lightsail-htaccess/

/opt/bitnami/apps/wordpress/conf/以下に「httpd-app.conf」があるので、FTPソフトでダウンロードして編集しアップロードします。
httpd-app.confの11行目にある「AllowOverride None」を「AllowOverride all」に変更して保存します。

# ③ Lightsail でインスタンスを再起動する

# ④ wpconfig と.htaccessに追記する
https://help.colorfulbox.jp/manual/wp-multisite-use/

WordPress の管理画面で、「ツール」から「サイトネットワーク管理」
指示通り、プラグインを全て無効にします。
wpdonfig と.htaccessを画面にある指示通り修正し保存します。
「あれ？.htaccessないじゃん」ってなったんですが
FTPソフトで隠しファイルを表示する設定にしたら現れました。
画面下のリンクから、WordPress の管理画面に再度ログインします。

上記の手順で.htaccessを使用できるようにした後、.htaccessファイルを以下のコマンドで書き込みできるようにし、

```
chmod 666 /apps/wordpress/htdocs/.htaccess
```

上記設定後はまた権限を以下のように戻しておきます。
```
chmod 644 /apps/wordpress/htdocs/.htaccess
```

(2022/7/24追記)
よしできた！…と思ったら、サイト開けません。エラーです。で・・・

# ⑤ Amazon Lightsail の WordPress Multisite インスタンスにブログをサブドメインとして追加する
https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-add-blogs-as-subdomains-to-your-wordpress-multisite

# ⑥ サブドメインのSSL化
https://tech.omablo.com/archives/582

で、やったんですが、うまくいかず…
Really simple SSH のプラグインを使おうとしたら
DNSのTXTが違うとかで、なんやかんややってたらサイトが真っ白に…

結局、以下のドキュメントの通り手動で再度設定したら万事うまく行きました。
https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-using-lets-encrypt-certificates-with-wordpress#link-the-lets-encrypt-certificate-files-in-the-apache-directory-wordpress


今度こそ以上です！お疲れ様でした。
Anaconda 仮想環境構築

# Anaconda 仮想環境作成手順
### **【概要】**
　Anacondaで仮想環境を構築する方法を説明します。
### **【環境】**
- OS：Windows
- Anaconda ：4.12.0

## 目次
1. はじめに
2. 仮想環境新規作成手順
3. コマンドまとめ

## 1.はじめに
### root(base)環境ではダメなのか
結論、ダメではありません。
それでは、なぜ仮想環境を作成するのかと言いますと、
Pythonにはたくさんのパッケージ(ライブラリ)があります。
取り込んだパッケージのバージョンによって、動作しない場合が発生します。
> （例）
　※パッケージの名前を仮にKariLibraryとします。
　Pythonのバージョンが3.9だとKariLibraryは正常に動かない
　Pythonのバージョンが3.6だとKariLibraryは正常に動く

といったことが起きます。
そんな時にroot環境のPythonのバージョンを都度変えていると
毎回Pythonのバージョンを確認する必要や、
Pythonのバージョンに合わせてパッケージもどれなら使えるかを
確認することは面倒ですよね。何より管理が難しくなります。

そこで登場するのが仮想環境です。
PCの中に疑似的なコンピュータを作成することで、
バージョンの管理がしやすくなります。

>（例）
　仮想環境A：Pythonを3.9、WEBアプリを作成するDjangoの環境
　仮想環境B：Pythonを3.6、機械学習を勉強するための環境

このように仮想環境を作成することで、環境の切り替えだけで
すぐにその環境が使えるようになります。

それでは早速、仮想環境を作成してみましょう。

## 2.仮想環境新規作成手順

- Anaconda Promptを起動します。
※Anaconda Powershell Promptではないです。

> Anacondaのインストールは別記事に記載していますので、
良ければ参考にしてみてください。

https://qiita.com/ykpen_coffee/items/ea56b5f608a3f683be91

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739343/25931e39-9fd8-6972-ddf0-08429212473a.png)
先頭に「(base)」と書かれているのがインストール時に作成されるroot環境で、どの環境を使っているかをここで判断することができます。

- 次に仮想環境を作成するコードを入力するのですが、
入力するパターンをここでは3つ紹介します。

　■パターン①（Pythonを最新のバージョンで環境を作成）
```
conda create -n training_env python
```
-n は --name でも可。
「training_env」の部分を任意の名前に変えてください。

　■パターン②（Pythonのバージョンを指定して環境を作成）
```
conda create -n training_env python=3.6
```
「python=X.X」とすることで取り込むPythonのバージョンを指定できます。

　■パターン③（root環境のデフォルト時と同様の環境を作成）
```
conda create -n training_env anaconda
```

- 作成した環境に切り替える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739343/7c47bc75-b9f7-6ab9-0dad-c4ce64972e73.png)
作成が完了したら図のような結果が返ってきます。
返ってきた結果にも書かれていますが、
環境の切り替えにはこちらのコードを入力します。
```
conda activate training_env
# activate training_env でも可
```
実行したらプロンプトの先頭が(base)から(切り替えた環境名)に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739343/924e4593-533b-4455-88b0-e36d2344f6b7.png)
これで仮想環境の作成はできましたので、
後はお好きなように環境をアレンジしてみてください。
Windows -> スタート -> Anaconda3(64-bit) に
「Anaconda Prompt (training_env)」が新しく出来るので、
そちらを起動すると始めからtraining_envの環境に入った状態で
プロンプトを起動することができます。

### 3. コマンドまとめ
- 仮想環境作成
```
conda create -n [name] python=X.X
```
- 仮想環境削除
```
conda remove -n [name] --all
```
- 仮想環境一覧
```
conda list -e
# -e は --env でも可
```
- 仮想環境のアクティブ化
```
conda activate [name]
```
- 仮想環境の非アクティブ化(仮想環境から抜け出したいとき)
```
conda deactivate
```
- パッケージの一覧
```
conda list
```
- パッケージのインストール
```
conda install [package_name] == X.X.X
# X.X.X 部分にバージョンを指定
```
- パッケージのアンインストール 
```
conda uninstall [package_name]
```
- パッケージの検索
```
conda search [package_name]
```
- パッケージの更新
```
conda update --all          # 全部のパッケージを更新
conda update [package_name] # 指定したパッケージのみ更新

# 環境も指定する場合
conda update -n [env_name] --all
conda update -n [env_name] [package_name] 
```

終わり。
AWS: Route53 で CNAME を定義して出たエラーの対策

Route53 で CloudFront に CNAME を定義した時に次のエラーが出た時の対策です。
CloudFront に直接アクセスした時は、エラーが出ないことが前提です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/29cd37fa-02f0-b448-19da-359657c50a92.png)

CloudFront の設定を変更します。

一般 -> 設定 -> 編集

次の2つを設定します。
>代替ドメイン名 (CNAME) - オプション
>カスタム SSL 証明書 - オプション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/06e97a3a-c69d-2188-dbaf-b23a469dd3a8.png)
dockerのpullオプション


絶対に最新のdockerイメージを使いたいと思ったとき。
（事前にpullすればいいのでは？でも、忘れちゃうこともあるじゃないですか？）

下記はdocker imageが存在している場合でもpull してくれるようです。
```bash
docker run --pull always
docker create --pull always

docker build --pull
docker-compose build --pull
```

https://docs.docker.com/engine/reference/commandline/build/#options
https://docs.docker.com/engine/reference/commandline/run/#options
https://docs.docker.com/engine/reference/commandline/create/#options
https://docs.docker.com/engine/reference/commandline/compose_build/#options


下記の`--quiet-pull`はdocker imageが存在している場合pullしてくれないようです。。
※出力をしないようにするだけ。
```
docker-compose up -d --quiet-pull
docker compose run --quiet-pull  # Docker Compose V2からっぽい
```

https://docs.docker.com/engine/reference/commandline/compose_up/#options
https://docs.docker.com/engine/reference/commandline/compose_run/#options

ちなみに、`docker-compose up`の`--force-recreate`は、docker imageが存在している場合pullしてくれないので、事前にpullしておく必要がありそう。
```
docker-compose pull
docker-compose up -d --force-recreate
```

以上です。
iPhoneのカメラで縦横比を常に16:9に固定する方法

iPhoneの写真の縦横比って初期設定だと4:3なんですよね。16:9にしてもアプリを閉じると元に戻ってしまう！いちいち設定し直すのが面倒！ということで常に16:9のままにする方法を紹介します。



## 方法

`設定`アプリから`カメラ`を選択

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703946/231ef8cc-dd4e-f7bb-9fc8-38f3b32a4d81.png)


`設定を保持`を選択

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703946/1434efff-2cde-25ec-82cc-f4910bb7b333.png)


`クリエイティブコントロール`をオンにする
 
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703946/bedfb2dd-11f2-5603-4235-8b2a3b015a68.png)


これだけです。以降、カメラアプリを開いて縦横比を16:9にすればアプリを再起動しても4:3に戻ることなく16:9のままになります。なおオンにすると縦横比だけでなく他の設定も保持されます。

(もし`クリエイティブコントロール`が出てこなければiOSをアップデートすると出てくるかもしれないです。)
インラインアセンブラで使う汎用レジスタと変数について

# 汎用レジスタとは
汎用レジスタとは、CPUが処理するデータを格納する記憶装置のことだ。
8086系アーキテクチャの場合、
・アキュムレータレジスタ
・ベースレジスタ
・カウントレジスタ
・データレジスタ
の4種類の汎用レジスタが準備されている。
容量別に、各汎用レジスタの末尾にl(low),h(high)をつけると8bitなる。
同じく末尾にxをつけると16bitの汎用レジスタとして使用することができる。
転送（mov）命令などでオペランドのレジスタの値を揃えなければエラーとなるので、この知識はアセンブラをする上で基礎となる。
# 汎用レジスタと変数は同じように扱える
容量さえ揃えれば、レジスタとC言語の変数は同じように扱うことができる。
そこで注意しなければいけないのが、容量だ。
・char　　8bit
・short　 16bit
このことに気をつければ、扱い方は汎用レジスタとほとんど同じである。
# 汎用レジスタと変数の使用例
```c
#include <stdio.h>
#include <conio.h>

int main(void){
    
    char ca; //8bit

    scanf_s("%c",&ca);

    __asm{
        mov al,7
        add al,ca
        mov ca,al
    }

    printf("%c",ca);

    /*---------------------------------*/

    short sa;//16bit

    scanf_s("%d",&sa);

    __asm{
        mov ax,7
        add ax,sa
        mov sa,ax
    }

    printf("%d",sa);

    _getch();

    return 0;
    
}
```
第一オペランドは汎用レジスタを記述したほうが良い。
理由としては、第一オペランドに変数を書くとエラーになってしまう命令があるからだ。
それを事前に防ぐために、第一オペランドには汎用レジスタを記述する癖をつけておいたほうがいいと思う。
そして、変数の容量を変数名で判断できるようにするために、ハンガリアン記法という、変数の型の頭文字を、変数名の頭文字にするという記法を使うことを推奨する。
【GitHub Actions】指定した時刻に処理を定期実行

**GitHub Actions**で処理を**定期実行**させる設定手順
今回はリポジトリに作成した**Python**スクリプトを実行する

## 1.リポジトリ作成
`Public`と`Private`のどちらで作成しても問題ない
※`Private`は無料枠に制限があるので注意

## 2.Pythonスクリプトの作成
今回、定期実行する`Python`スクリプトを作成する
ルートディレクトリに`sample.py`以下の内容で作成

```py
import datetime

# 現在時刻を出力する
print(datetime.datetime.now())
```

## 3.Pythonライブラリ設定ファイルの作成
**ルートディレクトリ**に`requirements.txt`を以下の内容で作成する

```
datetime >= 4.5
```

## 4.GitHub Actions設定ファイルの作成
1. **ルートディレクトリ**に`.github/workflows/`フォルダを作成する
1. yamlファイル`sample.yaml`を作成し、以下の内容に編集する

```yaml
name: Sample

on:
  schedule:
    - cron: '*/10 * * * *'
  workflow_dispatch:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.8'
          architecture: 'x64'
      - name: Install dependencies
        run: pip install -r requirements.txt
      - name: Run Python
        run: python sample.py
```

### `schedule`トリガーイベント
**GitHub Actions**の定期実行をする場合、`schedule`トリガーイベントを使用する
`cron`の値は、実行する時間を書く
今回は10分毎に実行するサンプルを作成した
```
*/10 * * * *
```

## 実行結果の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/c1cffb22-4b3e-c0a1-d00a-ee67027e6ccd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/b39f3ce9-5de8-8fae-1b65-fb735751dbe3.png)

## 今回作成したリポジトリ
https://github.com/rararapi/schedule
RailsのTransactionについてのメモ

## ActiveRecord::Base.transaction
複数のSQLが発行されるときに、すべてのアクションが終わったときにDBを更新する。

## 具体的には
以下のようなブロック内に処理を書いていく。

```ruby
ActiveRecord::Base.transaction do
  # 処理
end
```
例えばインスタンスメソッド内で
```ruby
ActiveRecord::Base.transaction do
  users.each do |user|
    user.update!
  end
  self.save!
end
```
これですべての処理の保存と更新を一括で行うことができる。
Cannot start Docker Compose application. Reason: fork/exec /Applications/Docker.app/Contents/Resources/bin/docker-compose-v1: permission denied の対処法

2022/07/23現在、Docker Desktop for Mac を最新版にアプデしたらエラーメッセージが出てコンテナが起動しなくなった。
```
Cannot start Docker Compose application. Reason: fork/exec /Applications/Docker.app/Contents/Resources/bin/docker-compose-v1: permission denied
```

公式Githubのコメントに、問題を解決したカスタムビルドがアップされている。（M1 Mac、Intel Mac、Windows の三種類）

https://github.com/docker/for-mac/issues/6400#issuecomment-1192440405

自分はこちらをダウンロードしたら動くようになった。
直ってるようなので、近々修正版が配信されると思います。
Pythonで、ジェネレータを継承して新たなジェネレータを作る

## 環境
Python 3.7.13

## クラスの場合

以下のような、2から10までの偶数を返すジェネレータがあるとします。

```python
class Even():
    def __iter__(self):
        yield 2
        yield 4
        yield 6
        yield 8
        yield 10

even_gen = Even()
for i in even_gen:
    print(i)
```

```:出力
2
4
6
8
10
```

この`Even`クラスを継承して、2から10までの偶数に加えて1から9までの奇数も返す`EvenOdd`クラスを実装したいとします。
`super().__iter__()`でスーパークラス側のgenerator-iteratorオブジェクトを得て一度回し、そのあと（あるいはその前に）サブクラス側の実装をします。以下のようになります。

```python
class EvenOdd(Even):
    def __iter__(self):
        yield from super().__iter__()
        yield 1
        yield 3
        yield 5
        yield 7
        yield 9

evenodd_gen = EvenOdd()
for i in evenodd_gen:
    print(i)
```

```:出力
2
4
6
8
10
1
3
5
7
9
```

`yield from`を使わずに書くと下記のようになります。

```python
class EvenOdd(Even):
    def __iter__(self):
        super_gen = super().__iter__()
        for i in super_gen:
            yield i

        yield 1
        yield 3
        yield 5
        yield 7
        yield 9
```

## 関数の場合
先ほどは2から10までの偶数を返す`Even`クラスを定義しましたが、同様に`even()`関数を考えてみます。ジェネレータは関数で定義するほうが一般的かもしれません。

```python
def even():
    yield 2
    yield 4
    yield 6
    yield 8
    yield 10

even_gen = even()
for i in even_gen:
    print(i)
```

この`even()`関数を利用して、あらたに1から9までの奇数も返すようにした`even_odd()`関数は下記のように実装できます。

```python
def even_odd():
    yield from even()
    yield 1
    yield 3
    yield 5
    yield 7
    yield 9

evenodd_gen = even_odd()
for i in evenodd_gen:
    print(i)
```

## 参考
- [PEP 255 – Simple Generators \| peps\.python\.org](https://peps.python.org/pep-0255/)
- [6\. 式 \(expression\) — Python 3\.9\.12 ドキュメント](https://docs.python.org/ja/3.9/reference/expressions.html#yieldexpr)
【初心者向け】なぜBeanなのかについて考えてみた

# 最初に
この記事は初心者がJavaBeansの理解を深めるために書くものです
よくBeanとは倉庫であると言った説明があるのですが、個人的には豆だと思い記述します。
具体的な書き方は書かない、具体的にどう書くかは諸先輩方のほうがよっぽど良い記事があるのでそちらにおまかせします。


## なぜBeanなのか？
役割としてはデータをメモリで保管しておくのが目的のクラスです。
よく倉庫みたいなものと言われてます。
しかし本当に倉庫ならRepositoryとかWarehouseとかStockroomとかの名前のほうが良さそうです。
しかし現実としてはBean(豆)です。
名前は読み手に誤解を与えず正確な名前であるべきです。
なぜRepositoryでは無くBeanなのでしょうか？Repositoryのほうがわかりやすそうです。
そこでBeanになる要件に着目します。

## Beanの要件とは
<ol>
<li>privete修飾子をインスタンス変数につける
<li>getter setterがある
<li>コンストラクタはPublicを付与する。
<li>引数無しのコンストラクタにしてjava.io.Serializableを実装できるようにする。
</ol>
他にも細かい規則はありますが重要なのは上の4つオブジェクト指向でデータを扱う最も基本的な形を考えれば当たり前です。

では上の4つの要件が豆で説明できるのかを考えてみます。
イメージしてほしいのがさや付きの豆です。
<ol>
<li>サヤに入れた豆が出してみたらゴルフボールだったって事なんて起こり得ないですよね。
インスタンス変数にprivete修飾子を付与して外部から勝手にデータを変更させなくする事で実現できそうです。
<li>さやがクラスで豆がインスタンス変数（データ）です。
豆は当然さやから出し入れできます。
外部からprivete修飾子を付与したgetter setterなんかのアクセッサがそれにあたります

<li>豆とサヤなので当然持ち歩く事ができどこででも何もなくても出し入れできるようにしないとダメですね。
コンストラクタはpublic修飾子を付与どこからでも何も無くてもアクセスできるようにします
<li>豆は食べたりする以外に、売ったり、大量にある豆を保管したりする必要があります。
つまりデータとしてサーバーに保管するなどネットワーク経由でやり取りしやすい形にできないとダメなのです。
java.io.Serializableを実装してデータのやり取りをし易い形にできるようにする。またSerializableを実装して使用する場合引数無しのコンストラクタが必要になるのでコンストラクタは引数無しが要件に含まれているのです。
</ol>

今までの話は倉庫でも似たような説明できそうですよね。
でも倉庫だとするとBean自体で長期保管（保存）できるはずです。しかしBeanにはそのような要件はありませんあくまでメモリ上に一時的に保管するにとどまります。
豆だと一時保管はできるかもしれませんがサヤに入れておいて置けば腐るか虫や鳥に食べられていずれなくなります。
豆を保管したければキチンと処理をしてしかる場所に保管する必要があります。
Beanの情報を長期保管して起きたければ同様にキチンと処理をしてサーバーなりファイルなりに保管する必要があります。

つまり倉庫より豆のほうがよりBeanを正確に表しているからBeanだったって事ですね。
## 余談
Javaの名前の由来はコーヒーから名前が来ていると言う説があります。
じゃあBeanはコーヒー豆？実は遊び心でつけた説も・・・ま、まぁコーヒー豆で説明できそうだし（笑）