OmniAICreator/Qiita-1.07M huggingface dataset:
纏めていたリソースからDBリソースのみを別ディレクトリに管理する

## はじめに
データベースエンジニアとして仕事をしているだいちです。
この度転職をして、データベースエンジニアとなりました。
今現在、仕事として任されているタスクの中でTerraformを触ることがあるので
対応した流れを纏めていきます。

### 見るべき人
- Terraformを使う人
- Terraformに興味ある人
- Terraformに詳しい人←ご教授お願いします。

## 前提
Terraform ver1.0以上


## やりたいこと
インフラのリソースをすべて一つの`main.tf`にまとめていた中から、
DBリソースだけを取り出して別ディレクトリで管理したい。

具体的には

```
# 元々のディレクトリ構造
├── prod
│   ├── common
│   └── prod
│       ├── main.tf # このファイルに全てのリソースが書かれている
│       └── など

# 以下のように変更したい
├── db
│   └── prod
│       ├── common
│       └── prod
│           ├── main.tf # DBリソースだけ
│           └── など
├── prod
│   ├── common
│   └── prod
│       ├── main.tf # DBリソースだけ削除
│       └── など
```

## やり方
### 使うコマンドについて
#### `import`について
参考：[Terraform/import](https://www.terraform.io/cli/import)
##### 説明
簡単に説明すると実際に稼働しているAWSサービスの設定をTerraformに取り込んでくれる。
importするリソースによって与える情報は変わってくるのでドキュメントを参考に使用する。

#### `state list`について
参考：[Terraform/state/list](https://www.terraform.io/cli/commands/state/list)
##### 説明
現在terraformで管理しているリソースを一覧で確認できる。

#### `state show`について
参考：[Terraform/state/show](https://www.terraform.io/cli/commands/state/show)
##### 説明
terraformで管理しているリソースの設定を詳細に確認できる。

### DBリソースの分割
#### 元のterraform管理しているリソースを確認する
以降の作業にて必要になるのでリソースを予め確認する。
`terraform state list` or `terraform state show {該当リソース}`
#### 元のコードをコピーする
既に環境自体は出来ているため、DBリソースだけを分割するのでコードは丸コピーで良いはず。
ただし、DBを作成するのに利用している他のサービスがあればそちらもコピーが必要になる。
#### importを実施する
`db/prod/prod`でimportを実施する。
`terraform import {リソース} {リソース特定情報}`
リソース特定情報は利用しているサービスによって、`id`だったり`name`だったりするので
[Terraform|Registry](https://registry.terraform.io/)にて確認する
#### 差分の確認をする
`terraform plan`
実際の環境とコードを照らし合わせて差分を確認します。
基本的にはコードも環境も変えていないので差分はでないはず。

### 遭遇した想定していなかった状況
既に環境は出来ていて、コードも丸コピしたにも関わらず
DBの再構成が差分として出てきました。[こちら](https://qiita.com/tsubasaogawa/items/82dee51e1fe835fb63b3)を参考に `password`をignoreすることで差分は無くなりました。
なぜなのかというところに関しては明確に理解したいところ、他にも想定しない差分が出てくることが多々あったので都度知見を纏めたいと思います。

## まとめ
Terraform自体コードは見たことはあったものの実際にいじることは初めてだったので、ひとまずの対応として完了させることが出来ました。
ただ、想定していない差分が出てきてignoreで除外したけど、最善の方法とは思えず。
もっと勉強して状況にあったベストな対応の引き出しを増やしていきたいです。
jQuery：スマホ時に1回目タップでオーバーレイ発生、2回目でリンク先へ飛ぶ方法

パソコンでリンク画像をhoverすると黒くオーバーレイが出てくる動きを
そのままスマホでするとうまく動きません。
タップしてしまうのでそのままリンク先へ飛んで行ってしまいます。

そこで、1回目タップでオーバーレイ発生、2回目でリンク先へ飛ぶ処理を書いてみました。

CSSの設定は参考に。

```css
.overlay {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 2;
    background: rgba(0,0,0,0.7);
    opacity: 0;
    transition: all 0.5s;
}
.overlay_opacity_dark {
	opacity: 5;
}
.overlay_opacity_zero {
	opacity: 0;
}
````



```javascript
$(function () {

	//ユーザーエージェントを取得
    	let ua = navigator.userAgent;

  	//スマートフォン用の記述
    	if ((ua.indexOf('iPhone') > 0 || ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0 && ua.indexOf('Mobile') > 0) ||ua.indexOf('Android') > 0){
		 
	 //スマホの時1回目のタップでオーバーレイ2回目でリンク先へ。touchstartを使う
			$('.product').on("touchstart",function() {
					

					//オーバーレイのclass".overlay_opacity_dark"がある場合＝２回目のタップの場合
					if($(this).children('.overlay').hasClass("overlay_opacity_dark")){
						
						//オーバーレイで暗くなっているところを元に戻す
						$('.overlay_opacity_dark').each(function(){
							$(this).removeClass('overlay_opacity_dark');
						});
					
					//１回目タップの場合
					}else {

						//タップした箇所以外に暗くなっているところは元に戻す
						$('.overlay_opacity_dark').each(function(){
							$(this).removeClass('overlay_opacity_dark');
						});
						
						//暗くなるclassを追加。「return false」でリンク先へ飛ばないようにする
						$(this).children('.overlay').addClass('overlay_opacity_dark');
						return false;
					}
			});
    	} else {

		  // PC用（addClass、removeClassを使わない直接CSSを変える記述ver。単純なhoverでOK）

			$('.products > .product > .woocommerce-LoopProduct-link').hover(
				function() {
					$(this).children('.overlay').css('opacity','5');
				},
				function() {
					$(this).children('.overlay').css('opacity','0');
				}
			);     
    	}
});
```
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その030

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: アプリケーションと活動
生産性とコラボレーションの学習

にある練習問題3問目をご紹介します

問題はこちらです

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/LrQIJovTp6o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

![０３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/878d7e12-1c49-6c6d-0f79-a28721d6f199.png)

正解はBとDです

Bについて

Lightning アプリケーションがデスクトップと電話で有効になっている場合、アプリケーションのデスクトップバージョンのナビゲーションタブがモバイルのナビゲーションメニューに同期されます。したがって、ユーザーが Lightning アプリケーションのデスクトップバージョンのタブを変更する権限を持っていれば、モバイルナビゲーションメニューに変更が反映されます。 

詳細はこちらのTrailheadをご確認ください

https://trailhead.salesforce.com/ja/content/learn/modules/salesforce1_mobile_app/salesforce1_mobile_app_navigation


Dについて

コンパクトレイアウトはパソコン画面だけでなく

コンパクトレイアウトでは、Salesforce モバイルアプリケーションでのレコード表示方法も制御されます。会社で Salesforce モバイルアプリケーションを使用している場合、スペースが限られ、レコードのすばやい認識が重要なモバイル画面でも、ユーザが必要な情報を確認しやすくなります。

詳細はこちらのTrailheadをご確認ください

https://trailhead.salesforce.com/ja/content/learn/modules/salesforce1_mobile_app/salesforce1_mobile_app_compact_layouts

https://trailhead.salesforce.com/ja/content/learn/modules/lex_customization/lex_customization_compact_layouts
リーダブルコードまとめ(第3章:誤解されない名前)

# 第3章:誤解されない名前
## 概要
本章のメインテーマは、「誤解される名前に気をつけろ」です。誤解されないようにするために、「名前が他の意味と間違えられないだろうか？」ということを自問自答すべきであることを伝えている。

### まとめ
最善の名前とは、「自分が書いたコードを読む人が自分のいとを正しく理解してくれる名前」である。つまり、誤解されない名前である。そのような名前を命名するためには、反対の立場、あるいは批判的な立場に立って誤解されない名前であるかを考える必要があるし、それを習慣化させる必要がある。

### 学んだ点
・誤解(他人との認識の相違になりそうな危うい命名)をできる限りでさける必要性があること
・fillerという文字を使いがちだが、「選択する」なのか「除外する」なのかわからない曖昧な単語である。selectやexclude等のより具体的な単語を用いることがベターである。
・命名する際は、場合に応じて単位等を活用すると理解しやすい命名ができる。
・限界値を決めるときは、「max」「min」を使用する。
・範囲を指定するときは、「firsr」「last」を使用する。
・包含/排他的範囲には、「begin」「end」を使用する。(英語には、ちょうど値を超えた時を表す簡潔な単語がないらしいです。)
・ブール値の変数やブール値を返す関数の名前を選ぶときんは、trueやfalseの意味を明確にする必要がある。
・ユーザーの期待に合わせる。

### 感想と振り返り
自分自身が変数命名する時、周りにある似たような属性？の変数を参考にして命名しています。しかし、その開発環境では、適した名前であることはしばしあっても、別のプロジェクトにアサインされた場合に、その潰し的な考えが効かないかもしれないので、変数に命名する際は常に「他人から見て自分の意図が正しく理解されるか？」ということを念頭に置きたいと思います。すでに存在する変数の名前もより正しい命名方法があるのでは？のような考えも持っておきたいですね！
いい記事を書くために

# なぜアウトプットするのか？
アウトプットすることで知識の定着につながり、体系的に深く理解することができる。
ブログを書く理由としてはこれだけで大丈夫だと思っていた。

でもそれでは、いい加減な記事になったり、人の役に立てないことに気がついた。
自分が試行錯誤したことが誰か他の人のためになるのならば、少しだけでも時間を割いて人に読まれることを前提にした記事を書くべきだと感じた。

人に読まれることを前提にするため、構造や枠組みをしっかりと考えなければならず、目次やタイトルなども粒度を合わせたりしなければならない。

これらの作業で、自分の理解がより深まることが最近の気づきであった。
そのため、何かアウトプットをする時は出来る限り人の役に立つことを心がけるべきだと感じた。

何より自分のためにしていることが回りまわって人のためになっていると感じることが出来ればよりアウトプットしたいという欲求にもつながる。

良いスパイラルを起こすためにできる限り、誰かに読まれてその人の理解につながることを前提としてアウトプットを行うこと。

### 役に立つ記事を書くためにで書かれている基本的なことは最低限意識
* 具体的で簡潔なタイトルをつける
* 環境や前提条件を説明する

などは最低限記載する
これはあるかないかで読みやすさが大きく変わってくる。
BIOSすら起動しないPCはグラフィックボード（増設ボード）を外すと上手くいくかも

# やったことの記録

1. 半年ほど電源を入れてなかったWindows10を起動して、WindowsUpdate適用後、再起動。
1. BIOSが起動しなくなる。（メーカーのロゴすら出ない）
1. 正常に映るモニターに差し替えても復旧せず。（モニターが原因ではない）
1. キーボード、マウス、モニターのみ接続した状態にしても復旧せず。
1. 上記からさらに『電源ケーブルのみ接続した状態』にしても復旧せず。（物理的に外部接続するものを最小限にしてもダメ）
1. 本体の電源コードを抜いて、15秒ほど電源ボタン押して電荷飛ばしても復旧せず。
1. BIOSのリセットボタンを10秒ほど押して、BIOSリセットしても復旧せず。
1. でも上記をやったら、電源ボタン押した時に長めのビープ音が1回鳴った。（少し状況変化）
1. メモリ2枚を一旦外して、再度セットし直しても復旧せず。
1. **グラボを外したら復旧した。** （原因はグラボだった）

# まとめ

PCが起動しない時、プリンターなどの **接続を最小限にして起動してみる** という方法がよくある。
だがそれ以外にも **グラボなどの増設ボードを外す** のも **接続を最小限にする** 方法の一つとしてある。
（頭のすみで覚えておくと役立つかも）
ConoHa VPS の AlmaLinux9 でルートログイン禁止にしようとしてはまった話

## 結論
`/etc/ssh/sshd_config.d/01-permitrootlogin.conf` の `PermitRootLogin` を `no` にして、sshd サービス再起動する。

## 解説
これまで root での SSH ログインを禁止するために編集するファイルは `/etc/ssh/sshd_config` だった。
![01_sshd_config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/f42e0a7e-34a9-b934-f6b3-64f8dce93b7a.png)

しかしRHEL9からは、 `ssh_config.d` というディレクトリが作られ、そこの中に `PermitRootLogin` を設定するだけのためのファイルが配置されるようになった。
![02_ssh_config.d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/3c88630d-0f75-a3e5-bcf2-0624d2989c44.png)

そのため、いくら `/etc/ssh/sshd_config` で `PermitRootLogin` の値を変更しようとも、その後から読み込まれる `01-permitrootlogin.conf` で上書きされてしまっていた。
![03_permitrootlogin.conf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/8d0a6d27-288a-d14f-73f3-539de23be85c.png)


## そもそも
そもそもの話、RHEL9 からは、デフォルトでルートのパスワードログインは禁止されている。
だが ConoHa VPS だとサーバ作成時に、root パスワードが必須になっている。
そして `01-permitrootlogin.conf` の `PermitRootLogin` が `yes` と設定されている。
コントロールパネルのコンソールから操作するためなのだろう。
(そろそろ鍵必須でいいんじゃないか？)
残業している人がいないかAIがチェックするアプリを作りたい



# Teachable machineは無料の監視カメラになるのか

こんにちは。
今回、社内で常駐しているベンダーさんの執務室に監視カメラがない自部署の課題に対して
Teachable machineを使って解決できないか試してみました。

そもそも何故カメラが設置されていないのかというと、
ベンダーさんの執務室が元会議室を改造して使っているためなのですが、
万が一、自分の知らぬところでサービス残業やトラブルが発生したら大問題です。
でも勤務状況をチェックするための監視カメラの設置予算がない…

そこで、機械学習モデルを簡単に作成できる[Teachable Machine](
https://teachablemachine.withgoogle.com/)を使えば無料の簡易監視カメラができるのではないか？という仮説に基づき、今回作成を行ってみました。

完成がコチラ。
![ezgif.com-gif-maker (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/1a46ca3d-5a89-21ab-b927-6fc42293a05f.gif)
`ミニチュアハウス`＝`執務室`
`羊の置物`＝`人`
と見立てて、執務室内に人がいる場合は「残業している者がいる」という
結果を出力しています。


この結果を定期的に会社携帯に通知できないか試してみます。


<br>
<br>
<br>

ちなみに…流石に実際の執務室を撮影することはできないので
実家で眠っていたシル●ニアファミリーで代用しております。
![IMG_7629.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/541b5ca9-ce82-db99-79ab-2028a9b53878.jpeg)

# 1.今回使用したもの
* Teachable Machine
* Node-RED
* WEBカメラ(iPadにアプリをインストールしWEBカメラ化)

# 2.Teachable Machine

まず[Teachable Machine](
https://teachablemachine.withgoogle.com/)のサイトにアクセスします。
画像プロジェクトから「残業者あり」と「残業者なし」の二つのクラスを作成。
500枚程度撮影した後、トレーニングボタンを押下し、
モデルをエクスポートします。

![スクリーンショット 2022-09-20 22.05.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/6e5993ef-7147-9192-3428-d063357b1eca.png)


# 3.Node-RED

次に、Node-REDを使用してTeachable Machineを動かします。
作成にあたり、以下のノードを追加しました。
* node-red-contrib-teachable-machine
* node-red-contrib-browser-utils
* node-red-contrib-image-output
* node-red-contrib-usbcamera

# 4.動かしてみよう！

追加したノードから「camera」のノードを「Teachable Machine」のノードにつなげてデプロイ。
問題なく判定できました。

![nodered1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/374024b4-e99e-60b9-4578-a15131eba984.png)

しかしながら、業務中にNode-REDを立ち上げて撮影するのは不可能です。
そのため、「inject」ノードから定期実行を設定し、
実行を受けた「usbcamera」ノードを通じて判定をしようとしたところ
問題が発生（下記）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/d702819a-ff14-c618-4005-9a3c32b3520b.png)

Teachable Machineが動かないッピ…

![baby_boy09_question.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/ad6fe2a6-6973-ec05-5e4d-ea9b2f689c0d.png)

Teachable Machineが「ready」の状態から微動だにしないため
ログを確認したところ「"Error: SOI not found"」というエラーが出ておりました。
「usbcamera」のノードで取得した画像を認識してくれていない？ように見えます。
まだ解決できていないため、引き続き調査中です。


# Teachable machineは無料の監視カメラになりそう！

ここまで作ってみて、私自身がNode-REDを使いこなせていないだけで
Teachable Machineは無料の監視カメラになり得そうな
希望のようなものは見えたような気がします。
また、結果をTeamsやLINEに送ることもできそうです。

Node-REDにこだわらずTeachable Machineとアプリの組み合わせをこれからも勉強していきたいと思います。
【一般】フィルタマッピングを使ってみる

### はじめに ###
フィルタマッピングとは、フィルタとしての使用頻度の高いフィールド値のセットをグループ化する機能です。 
例えば、ある経理データベースに対してクエリを作成するにおいて、すべての収益勘定科目コードでフィルタをかけたい場合、ひとつひとつ全ての収益勘定科目コードを指定するのではなく、それらを**収益**と呼ばれるフィルタマッピングでひとまとめにしておき、フィルターとして指定します。
### フィルタマッピングの作成 ###
では、実際に作成してみます。
製品として**SunSystems**を使用します。Account Codeに対してフィルタマッピングを作成します。
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから`クエリビルダ`を起動します。
**製品**には`SunSystems`、**Business Unit**は`PK1`、**テーブル**には`Chart of Accounts`を選択します。
`Account Type`と`Account Code`が既定のフィルターとして表示されます。
ここでは、`Account Code`にフィルターマッピングを作成します。
Account Code右隣りの`...`ボタンを押して、索引ダイアログを開きます。勘定科目コード一覧が表示されるので、**収益**に関するコードを全て選択します。選択した状態で右クリックメニューを開き、`フィルタマッピング-作成`を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/228e4a48-c315-ddbd-6d5c-4800c353e3f3.png)
フィルタマッピングダイアログが開きます。`コード`や`グループ`には初期値が設定されます。これらは使用前であれば変更可能です。
`説明`にも初期値が設定されていますが、これも自由に変更できます。
`マッピング`には、先ほど選択した**収益**に関する勘定科目コードが表示されています。
`ルックアップコードパス`には、このフィルタマッピングがどの**製品**の、どの**テーブル**に対し、さらにはどの**フィールド**に対し使用されるかが指定されています。高度なフィルタマッピングを作成する場合等は、ここを編集することも可能です。
今回はこのままで。`適用`ボタンを押して保存し、`OK`ボタンでダイアログを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/339967db-abd8-e1f0-d748-f85b29c747e0.png)
索引ダイアログの勘定科目コード一覧に作成したフィルタマッピングが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6203f43b-152a-6572-0114-9c52611349c6.png)
### フィルタマッピングの使用と検証 ###
では追加されたフィルタマッピングを早速使用します。
追加されたフィルタマッピングをダブルクリックすることで選択できます。`OK`ボタンで確定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3a130f4a-ba5f-fbb0-1a94-71a727826e8f.png)
フィルタマッピングがフィルタとして指定されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/025a08bf-c338-75b4-4eb7-1be3d51c542d.png)
では出力アイテムを設定して、クエリ結果を検証してみます。
`Account Type`、`Account Code`、`Description`を出力アイテムとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b0ad3214-794e-e4f0-697c-5051219a57f1.png)
`プレビュー`ボタンでクエリ結果を取得します。
フィルタマッピングとしてグループ化した勘定科目コードが返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/76659ef8-5c82-d110-780b-55a7d7d2fd3a.png)
Sharperlightエンジンにより作成されたSQL文も見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/dbc1ea9c-6cb1-4557-f257-9465b6837ab8.png)
WHERE句に正しく設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bac44ecc-a57a-7ba2-cd0c-e7acd2092145.png)

いかがでしたか？フィルター値のグループ化、是非使用してみてくださいね。
では、失礼します。
AWS Organizationsの組織からメンバーアカウントを削除できなかった件

当記事は、2022年6月頃にAWS Organizationsの組織からメンバーアカウントを削除できない状況に遭遇し、解決するまでの経緯を示したものです。

# 前置き
### AWS Organizationsの用語
* スタンドアロンとは
AWS Organizationsに所属していない状態のこと。

* スタンドアロンアカウントとは
AWS Organizationsに所属していないアカウントのこと。
※例えば、AWS Organizations上で作成したメンバーアカウントは、そのアカウント自体に支払方法(クレカなど)は登録はされていないので、そのメンバーアカウントをスタンドアロンにする(AWS Organizationsから削除する)には、それと同時に支払方法を登録する必要がある。

### 前提
当事の削除対象のメンバーアカウントは、AWS Organizations上で作成したものであり、削除前の時点でメンバーアカウント自体に支払方法は登録していないアカウント。

# 困った点
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_accounts_remove.html

上記公式ドキュメントの中の「組織からのメンバーアカウントの削除」の「AWS Management Console」の「組織からメンバーアカウントを削除するには」の手順を実施するなかで、支払方法が未登録なためエラー(想定通り)となり、5のaの「失敗したアカウントにサインインします...」の手順に従いサインインしたところ、なぜか単にAWS Organizationのトップ画面へ遷移するのみで5のbの手順へ進めず、困り果てた。

# 解決方法
別手段として、同ドキュメント内の下部の「メンバーアカウントとしての組織からの登録解除」を実施すれば、正常に組織からメンバーアカウントを削除でき、スタンドアロンアカウントとすることができた。

(まさか別手段が存在するとは思わず、1時間くらい苦戦してしまった)
[Rails]特定のカラムの値を取得(pluck)

# Pluckメソッド
指定したカラムの値を配列で返してくれます。
```ruby
モデル名.pluck(取得したいカラム名)
```

【例】usersテーブル
| id | name    | bounty    |
| -- | ------- | --------- |
| 1  | ルフィ    | 30億      |
| 2  | バギー   | 31億8900万 |
| 3  | ティーチ  | 39億9600万 |
| 4  | シャンクス | 40億4890万 |


上記のような`users`テーブルから`name`カラムの値だけ取得したい場合、`pluck`メソッドを用いると便利です。`User`モデルを指定し、引数にカラム名`name`を渡します。

```ruby
User.pluck(:name)

=> ["ルフィ", "バギー", "ティーチ", "シャンクス"] # 返り値
```
また、引数に複数のカラムを指定することもできます。
```ruby
User.pluck(:name, :bounty)
=> [["ルフィ","30億"], ["バギー","31億8900万"], ["ティーチ","39億9600万"], ["シャンクス","40億4890万"]] # 返り値
```
複数カラムを指定した時の返り値は、**二次元配列**になっています.
Linuxサーバー構築3（テキストエディタ）

<h5>1.viエディタを新規作成

コマンド　vi vitxet.txt
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847607/bc6c2afa-1af1-6475-cb6b-3050bf0181b1.jpeg)
入力すると下の画面みたいになる
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847607/7b1bab42-4341-5ca9-c765-dcf11a320f96.jpeg)


【2つのモード】
・コマンドモード
・インサート（入力）モード
※Escキーを押すとコマンドモードになる

[インサートモードへの切り替えコマンド一覧]
i	カーソルの前にテキストを入力する
a	カーソルの後にテキストを入力する
ｌ （大文字アイ）	行頭の最初の文字にカーソルを移動し、その直前にテキストを入力する
A	行末にカーソルを移動し、その直後にテキストを入力する
o （小文字オー）	カレント行の下に空白行を挿入し、その行でテキストを入力する
O （大文字オー）	カレント行の上に空白行を挿入し、その行でテキストを入力する

<h5>2.viエディタを保存・終了する

【保存方法】
編集中に上書き保存する方法はコマンドモードで:wと入力する
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847607/c809e2df-5328-0486-9a6e-4f240e2003fc.jpeg)
最下段に書込みと表示される
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847607/c80bb9a7-75c0-5635-850d-a885c782c98d.jpeg)

【終了方法】
コマンド
:q	ファイルを保存せずに終了する（編集した場合は保存したかどうかの確認が入る）
:q!	ファイルを保存せずに終了する（確認は入らない）
:wq	ファイルを上書き保存して終了する
ZZ	ファイルを上書き保存して終了する（:wqと同じ）

<h5>3.カーソルの移動

[コマンド一覧]
h	一つ左へカーソルを移動する（左矢印キーと同じ）
l（小文字エル）	一つ右へカーソルを移動する（右矢印キーと同じ）
k	一つ上へカーソルを移動する（上矢印キーと同じ）
j	一つ下へカーソルを移動する（下矢印キーと同じ）
0（数字ゼロ）	行の先頭へカーソルを移動する
^	行の先頭へカーソルを移動する（ゼロと同じ）
$	行の末尾へカーソルを移動する
H	画面に表示されている行のうち一番上の行にカーソルを移動する
L	画面に表示されている行のうち一番下の行にカーソルを移動する
gg	ファイルの先頭行にカーソルを移動する
G	ファイルの最終行にカーソルを移動する
n（任意の数字）G	ファイルのn行目にカーソルを移動する
:n（任意の数字）	ファイルのn行目にカーソルを移動する（nGと同じ）

<h5>4.ページを移動

[コマンド一覧]
Ctrl+f	次のページへ移動する
Ctrl+b	前のページへ移動する
gg	ファイルの先頭行にカーソルを移動する
G	ファイルの最終行にカーソルを移動する
Ctrl+g	現在カーソルの位置の行数、桁数、全体行の情報を表示する

<h5>5.コピー・切り取り・貼り付け

[コマンド一覧]
x（小文字エックス）	一文字を切り取る（Delete）
X（大文字エックス）	一文字を切り取る（Backspace）
dd	一行を切り取る
yy	一行をコピーする
p（小文字ピー）	カーソルの次の文字または次の行に貼り付ける
P（大文字ピー）	カーソル位置の文字またはカーソル位置の行に貼り付ける
u	切り取りや貼り付けの操作をひとつ取り消す

<h5>6.文字列の検索・置換

[検索コマンド一覧]
/（文字列）	カーソル位置から後方に向かって指定した文字列を検索する
?（文字列）	カーソル位置から前方に向かって指定した文字列を検索する
n	次の候補を検索する
N	前の候補を検索する
:noh	検索で見つかったもののハイライト表示を解除する

[置換コマンド一覧]
:s /検索文字列/置換文字列/	現在のカーソル位置の行の検索文字列を一つ置換文字列に置換する
:s /検索文字列/置換文字列/g	現在のカーソル位置の行の検索文字列をすべて置換文字列に置換する
:s /検索文字列/置換文字列/gc	現在のカーソル位置の行の検索文字列をすべて置換文字列に置換する
検索文字列に対してそれぞれ置換するか確認する
:%s /検索文字列/置換文字列/g	ファイル全体の検索文字列をすべて置換文字列に置換する
:%s /検索文字列/置換文字列/gc	ファイル全体の検索文字列をすべて置換文字列に置換する
検索文字列に対してそれぞれ置換するか確認する
「こんなときどうすればいいの...？」 シーン別 Gitコマンド まとめ

## はじめに
gitにまつわる  「ああしたい! こうしたい!」 をシーン別に一問一答形式でまとめました。
最初は少ないですが、少しずつ増やしていく予定です。
掲載基準は使用頻度ではなく、自分がよく使うものや、忘れがちなものなどです。

※ 理解が浅く誤った内容を含んでいる可能性もございますがご容赦下さい。

## 【シーン１】 作成済みのローカルブランチ名をあとから変更したい！
- 間違った名前でブランチを作ってしまった・・・そんなときはこれ

```:回答
git branch -m ＜変更前の名前＞ ＜変更したい名前＞
```
```:(例) test1ブランチの名前をtest2ブランチに変更する 
git branch -m test1 test2
```


## 【シーン2】 直前にしたコミットのコミットメッセージを修正したい！
- 上書きして修正できます
- コミットメッセージを記入途中に間違ってEnterを押して、あっ！ ってなったときによく使います
```:回答
git commit --amend -m "上書き修正したいコミットメッセージ"
```

## 【シーン3】 git add と git merge を取り消して編集前に戻したい！
- コンフリクト解消のためにコードをいろいろ編集したけどマージをやめたい、というときに使用
- stash apply したときに、ステージングされつつマージもされていてコンフリクトしていたときに、やっぱり戻したい！ってなったときに使いました
```
git reset --hard HEAD
```


## 【シーン4】 不要になったローカルブランチを削除したい！
```:回答
git branch -d ＜削除したいローカルブランチ名＞
```
```:(例) test1ブランチを削除する
git branch -d test1
```
↓
上記で怒られたときは、ローカルブランチを強制削除する
```:回答
git branch -D ＜強制削除したいローカルブランチ名＞
```

## 【シーン5】 リモートに存在するブランチを ローカルに持ってきたい！
- ローカルに存在していないときに使います
```:回答
git checkout -b ＜ローカルで使いたいブランチ名＞ origin/＜ローカルで使いたいリモートブランチ名＞
```
```:(例)リモートに存在する test1ブランチ を ローカルに持ってくる
git checkout -b test1 origin/test1
```
↓
上記コマンド後、 「 git is not a commit and a branch 」 と怒られた場合は
以下でリモートの最新情報を取得してから実施する
```
git fetch --prune
```

## 【シーン6】 直前のコミットを取り消し、git add された状態に戻したい！
- コミットするファイルが他にもあった場合や、ファイルの修正をしたい場合など
```
git reset --soft HEAD^
```

## 【シーン7】 間違えて git push した リモートブランチを消したい！
- タイポしたときや不要になった場合など
```:回答
git push origin :＜削除したいリモートブランチ名＞
```
```:(例)リモートにある test1ブランチ を削除する
git push origin :test1
```


#### （参考にさせていただいた記事）
https://qiita.com/shungo_m/items/4218e70751375b4bfeec
Wordpress【WooCommerce】セット販売商品の商品画像を表示させるjQuery



①「商品データ」を「グループ化された商品」にする

②「関連商品」の「セット販売商品」「アップセル」に同じ商品を入力

③javascript記述。

＜js概要＞
アップセル商品画像が商品ページの下部に表示されるので、そのa要素をコピーして、セット販売商品にも画像を表示させる

④CSSで整えて完了！


```javascript
$(function(){
			
	//商品画像横の「セット商品」のIDを取得
	let grouped_product_id_nums = [];
		
	$('.woocommerce-grouped-product-list > tbody > tr').each(function(){

		//ID名（.ex）"product-1111"を、"post-1111"に変えて配列に追加する
		
		grouped_product_id_nums.push( "post-" + $(this).attr("id").slice(8));	
	});		
	
	
	//先ほど取得した「セット商品」のID番号と一致するclass名"post-1111"の子要素（a要素に画像が含む）を配列に追加していく
	let sells_array = [];
			
	grouped_product_id_nums.forEach( num =>{
				
		sells_array.push($('.up-sells > ul > .' + num ).children('a'));	
	});		
	
	

	//「セット商品」に新しくtd要素を追加		
	$('.woocommerce-grouped-product-list > tbody > tr').prepend('<td class="grouped-product-list-image-link"></td>');		
	
	
	//先ほど新しく追加したtd要素に「アップセル」のa要素をコピーして追加していく
	//clone処理しないと元のa要素が消えてしまう

	let $links = $('.grouped-product-list-image-link');		
	
	for (let i = 0; i < $links.length; i++) {
				
		sells_array[i].clone().appendTo($links[i]);	
	}		
	
});			
```
【MySQL】「空白を含んだデータを検索・除去したい」

# はじまり

人間さん「む、靴のサイズを使ったシステムで何かエラーが出たぞ」
人間さん「サイズ値が数字ではないって言われてる」
人間さん「どれどれ、データを見てみますか」
人間さん「う～ん、なにやら半角と全角スペースが入ってるデータがあるからこれが原因か」

shoesテーブル
| id | name | size |
|:-:|:-:|:-:|
| 1 | スニーカー |` `25|
| 2 | 運動靴 |23` `|
| 3 | サンダル |24|
| 4 | スパイク |`　`26|
| 5 | 下駄 |22`　`|

# 空白を検索しよう

人間さん「空白入りの検索ってどうやるんだろう？」

いぬ先生「いくつか方法があるから紹介するよ」

## 正規表現を使うパターン
### 空白検索

```sql
SELECT * FROM `shoes` WHERE `size` REGEXP '[ 　]';
```

いぬ先生「REGEXP を使って正規表現で空白を検索する方法だよ」
いぬ先生「 [] の中に半角スペースと全角スペースを続けて入力することで」
いぬ先生「いずれかが含まれている値を検索する」

### 数字以外を検索

```sql
SELECT * FROM `shoes` WHERE `size` REGEXP '[^0-9]'; 
```

いぬ先生「余談ではあるけど、これは数字以外を検索するもの」
いぬ先生「なので半角スペースや全角スペースはもちろん、記号や全角文字もヒットする」
いぬ先生「数字以外は望まないようだから、これで不正なデータを検索するものいいかも」

## LIKE句を使うパターン

```sql
SELECT * FROM `shoes` WHERE `size` LIKE '% %' OR `size` LIKE '%　%';
```

いぬ先生「これはシンプルな検索だね」
いぬ先生「そしていずれも半角・全角を含んだデータが抽出される」

| id | name | size |
|:-:|:-:|:-:|
| 1 | スニーカー |` `25|
| 2 | 運動靴 |23` `|
| 4 | スパイク |`　`26|
| 5 | 下駄 |22`　`|

# 空白を除去しよう
## 半角スペースの除去

人間さん「データを精査したいから空白を除去しよう」
人間さん「TRIM を使うといいってことかやってみよう」

```sql
UPDATE `shoes` SET `size` = TRIM(`size`);
```

| id | name | size |
|:-:|:-:|:-:|
| 1 | スニーカー |25|
| 2 | 運動靴 |23|
| 3 | サンダル |24|
| 4 | スパイク |`　`26|
| 5 | 下駄 |22`　`|

## 半角・全角スペースの両方を除去

人間さん「あれ？半角スペースは除去されたけど全角スペースが消えてない」

いぬ先生「TRIMはそのままだと全角スペースは除去できないよ」
いぬ先生「全角スペースを半角に置き換えてからTRIMを使おう」

```sql
UPDATE `shoes` SET `size` = TRIM(REPLACE(`size`, '　', ' ');
```

| id | name | size |
|:-:|:-:|:-:|
| 1 | スニーカー |25|
| 2 | 運動靴 |23|
| 3 | サンダル |24|
| 4 | スパイク |26|
| 5 | 下駄 |22|

人間さん「おぉ整った！」
ｃ＃演算式：【X?.x】.cs　の用例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509696/1b56a698-1305-9c7e-8430-1f953f704b05.png)

```ｃ＃演算式：【X?.x】.cs　の用例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class SampleModel
    {
        public string id { get; set; }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            SampleModel sampleModel = null;
            Console.WriteLine("|" + sampleModel?.id + "|");
            try{
                if (string.IsNullOrWhiteSpace(sampleModel?.id))
                {
                    Console.WriteLine("1111");
                }
            } catch(Exception ex){
                    Console.WriteLine(ex);
            }
        }
    }
}
```

>Onlineツール： https://rextester.com/
【UWSC】楽天MarketSpeed2を自動起動したい

今さら感のスクリプトです。

使い方
1. ２ヶ所自分の環境に合わせて改変してください。
exec() -> マケスピ２のインストールパス
         （デフォルトなら「ユーザー\AppData\Local\MarketSpeed2\Bin\」辺り）
sendstr() -> 楽天証券のログインパスワード

2. ログイン画面で「ログインID保存」をしておいてください。

わかる人だけ使用してください。
このスクリプトを使用して出たいかなる損害も保証いたしませんので自己責任でお願いします。
アップデート時には誤動作する可能性があります。

```c#
//マケスピ２が起動してなかったら起動する
if getId("MarketSpeed2") < 0 then
    Ms2Exec()
    HomeWindowClose()
endif

//ここから関数
procedure Ms2Exec()
    exec("インストールパス\MarketSpeed2.exe")
    //ログイン
    LoginWindowId = -1
    while LoginWindowId < 0
        LoginWindowId = getId("MARKETSPEED II ログイン")
        sleep(0.5)
    wend
    sendStr(LoginWindowId, "password")
    sckey(LoginWindowId, vk_ENTER)
fend
procedure HomeWindowClose()
    //ホーム画面クリア
    HomeWindowId = -1
    while HomeWindowId < 0
        HomeWindowId = getId("ホーム")
        sleep(0.5)
    wend
    sckey(HomeWindowId, vk_alt, vk_F4)
fend

```
WSL(Ubuntu)にOpenMXをインストール without Intelコンパイラ

  

## 目的

OpenMXという密度汎関数理論(DFT: Density Functional Theory)計算の国産アプリがあります。基本的にHPC環境を想定したLinux上で動くアプリですが、最近ではWSLでも動きます。

[OpenMXの公式](http://www.openmx-square.org/)ではIntel OneAPIを利用する方法が紹介されていますが、ここでは、Ubuntuのaptで配布されているパッケージでインストールする方法をここに記載します。

前提とするOpenMXのversionは3.9.9です。

個人メモのようなものです。

## 方法

以下のコマンドでパッケージをインストールします。


```
sudo apt update
sudo apt upgrade

sudo apt install build-essential
sudo apt install gfortran

sudo apt install libopenmpi-dev openmpi-bin 
sudo apt install libscalapack-openmpi-dev
sudo apt install libblas-dev
sudo apt install liblapack-dev
sudo apt install libfftw3-mpi-dev libfftw3-dev

```

  

## コンパイルコマンド

`openmx3.9.9/source/makefile`を次のように編集します。


```
CC = mpicc -O3 -fopenmp -march=native
FC = mpif90 -O3 -fopenmp -march=native
LIB = -lscalapack-openmpi -lblas -llapack -lfftw3 -lgfortran -lmpi_mpifh
```

## まとめ

やったぜ！
cscの作法 その278

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
SetWindowsHookEx使ってください。

# 方針
マウスやる。


# サンプルコード

```
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

class MyHook {
	[DllImport("user32.dll")]
	public static extern IntPtr CallNextHookEx(IntPtr hHook, int nCode, IntPtr wParam, IntPtr lParam);
	[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
	static extern IntPtr SetWindowsHookEx(int idHook, delegateHookCallback lpfn, IntPtr hMod, uint dwThreadId);
	[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
	[return: MarshalAs(UnmanagedType.Bool)]
	static extern bool UnhookWindowsHookEx(IntPtr hhk);
	[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
	static extern IntPtr GetModuleHandle(string lpModuleName);
	delegate IntPtr delegateHookCallback(int nCode, IntPtr wParam, IntPtr lParam);
	IntPtr hookPtr = IntPtr.Zero;
	public void Hook() {
		using (Process curProcess = Process.GetCurrentProcess())
		using (ProcessModule curModule = curProcess.MainModule)
		{
			hookPtr = SetWindowsHookEx(14, HookCallback, GetModuleHandle(curModule.ModuleName), 0);
		}
	}
	private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
		if ((long) wParam == 0x0201) 
		{
			var p = Cursor.Position;
			Console.Write(p.X);
			Console.Write(", ");
			Console.WriteLine(p.Y);
		}
		return CallNextHookEx(hookPtr, nCode, wParam, lParam);
	}
	public void HookEnd() {
		UnhookWindowsHookEx(hookPtr);
		hookPtr = IntPtr.Zero;
	}
}
class SampleKeyHook {
	static void Main(string[] args) {
		MyHook myHook = new MyHook();
		myHook.Hook();
		Application.Run();
		myHook.HookEnd();
	}
}





```

以上。
cscの作法 その277

# 概要
cscの作法、調べてみた。
SetWindowsHookEx使ってみた。

# 参考にしたページ

https://qiita.com/okuhiiro/items/ab768819fe47c0ebba78

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>cd csc2

>csc hook0.cs

```


以上。
超便利なLWC開発ツール：quicklwc

今回紹介したいのはVSCODE EXTENSIONでインストールできるquicklwcというツールです。
下記がインストールのURLです！とりあえず試してみて！
https://marketplace.visualstudio.com/items?itemName=mingxuan-tian.createlwc


LWCの開発をもっと簡単にして、使い方もとても簡単です。覚えるコマンドは一つだけ，createlwc（またはlwcも可能）

主な機能は下記の通りです。

１．XMLファイルを自由に設定できる
　　選択リストでどこに表示するかを決めて、XMLファイルがそれなりに作成します。
　　また、recordpageが選択された場合、対応されるオブジェクトの名前を入力する必要があります。ご注意ください。
<img src="https://github.com/singlebat/quicklwc/blob/main/normal.gif?raw=true" />

２．親子関係のLWC作成は容易くなりました
　　親子関係のLWCを作る時、どうやって親から子にパラメータを渡すとか、どうすれば親から子のメソッドを呼ぶとか、いろいろ調べる方もいるかもしれません。だから、今回はすぐ使える親子関係のLWCを作ってみてください。
　　①親から子を呼ぶ
　　②子から親を呼ぶ
　　③親から子に値を渡す

対応される箇所を見つけ、名前を編集するだけでいいです！

<img src="https://github.com/singlebat/quicklwc/blob/main/pc.gif?raw=true" />

３．LMS（lightning message service）も複雑な設定がいらん！
　　もし２つのLWCで通信をしたい時、LMSを導入する必要があります。
　　そこでLMSを作成するには、またいろいろ調べるかもしれません。
　　もう、そういうくどい設定情報が覚えたくない！すぐ使いたい！

　　で、そこで下記の機能が助かるかもしれません。
　　①message channelの名前と保存箇所(パラメータ名)を入力
　　②受け取る方のLWCを作り
　　③発信方のLWCを作り

　　それで、上記のパーツが全部つながる！本当に保存したい値をサンプル値に入れ替えて、終わりです。

　　<img src="https://github.com/singlebat/quicklwc/blob/main/channel.gif?raw=true" />
【iphone Safari】safariメニューバーの表示・非表示切り替えでfooterの場所を変更する方法

自分自身の備忘録として記載します。
開発したアプリケーションをiphoneのsafariで表示させた場合、
safari下部のメニューバーがスワイプによって、表示されたり表示されなかったりします。

その表示・非表示によって、フッターが画面下部に固定されず、
メニューバー分、浮き上がって表示されてしまったので、その問題をCSSで解消する方法です。


## ■開発環境
OS：windows10
Laravel 8.83.14
Vue.js 2.6.12

## ■確認端末
iphone12 mini

## ■解決方法
1\. 表示する高さをheight 100vhで、デバイスの高さ全体に指定
2\. その状態で、body全体にheight: -webkit-fill-available;を指定
3\. footerは、position:fixed;　bottom:0でページ下部に固定

```app.css
body{
height: -webkit-fill-available;
}
.body-container{
 height: 100vh;
}
.body-container__footer{
position:fixed;
bottom:0;
}
```

これでメニューバーの表示・非表示に連動して、footerが浮かずに表示領域下部に固定されるようになりました。

参考にしたサイトは以下です。
[CSSのみ：height 100vhとiPhone safariメニューバーの問題は-webkit-fill-availableで解決](https://vow.design/webdesign/css-height100vh-fill-available/)
Seleniumで使用するドライバのバージョンアップを自動化する

# はじめに
スクレイピングなど何らかの目的でSeleniumを使用している場合は、ドライバのバージョンアップが課題です。

ブラウザのバージョンをあげた場合は、互換性を保つためにドライバのバージョンもあげる必要があるため、保守作業としてドライバのバージョンアップが煩雑になりやすいです。

本記事では、以前書いた[ルーチンワークはPythonにやらせよう　Seleniumで勤怠処理を自動化する](https://qiita.com/Brutus/items/caec20b979db6d49a29a)を例に、ドライバのバージョンアップを自動化する方法について記載しています。

## executable_path
本記事の環境についてSeleniumは4.4で、ブラウザはchromeを使用しています。

前提としてSeleniumを使用する場合は、使用するブラウザに対応するドライバを設定する必要があります。
Selenium 4では、[executable_path has been deprecated, please pass in a Service object](https://www.selenium.dev/documentation/webdriver/getting_started/upgrade_to_selenium_4/#executable_path-has-been-deprecated-please-pass-in-a-service-object)の通りにドライバの設定方法が変更されています。

従来のSelenium 3の書き方の場合は、以下のような警告が出力されます。

```python
/Users/workman/Documents/kintai/kintai.py:19: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  browser = webdriver.Chrome(executable_path=driver, chrome_options=options)
```

また`chrome_options`の設定方法も現在は推奨されていないため、同様に警告が出力されます。

```
/Users/workman/Documents/kintai/kintai.py:19: DeprecationWarning: use options instead of chrome_options
  browser = webdriver.Chrome(executable_path=driver, chrome_options=options)
```

上記公式のリンクを参考にしながら、以下のように修正します。
`Service object`と、`options`を使用してそれぞれ設定します。

```python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService

service = ChromeService(executable_path=＜chrome driverのパス＞)
browser = webdriver.Chrome(service=service, options=options)
```

:::note
推奨されるSelenium 4の記述に修正することで、警告が出力されなくなります。
:::

## webdriver_manager
ドライバのバージョンアップを行うためには、ブラウザのバージョンチェック及び、[Downloads](https://chromedriver.chromium.org/downloads)から同じバージョンのChromeDriverのダウンロードが必要です。

自動化する場合は、自前で実装するか、既に存在するライブラリを使用するかの対応が必要です。
本記事では[**webdriver_manager**](https://github.com/SergeyPirogov/webdriver_manager)というライブラリを使用することで、Seleniumで使用するドライバのバージョンアップを自動化しています。

webdriver_managerは、使用するWebブラウザのバージョンに合わせて最新のドライバをダウンロードします。
対応するブラウザはChromeだけでなく、Firefoxなどのブラウザにも対応しています。

使い方も簡単です。
まずはpipでwebdriver_managerをインストールします。

`$ pip3 install webdriver-manager`

最新のドライバは`ChromeDriverManager`クラスの`.install()`で、ダウンロードできます。
以下は`new_driver`を最新のドライバとして設定する例です。

```python
from webdriver_manager.chrome import ChromeDriverManager

new_driver = ChromeDriverManager().install()
service = ChromeService(executable_path=new_driver)
browser = webdriver.Chrome(service=service, options=options)
```

:::note
webdriver_managerはプログラム実行時に、ホームディレクトリ配下に`.wdm/`という隠しディレクトリを作成し、最新のドライバはこの`.wdm/`ディレクトリ配下に保存されます。保存するディレクトリは`ChromeDriverManager`のpath引数で指定できます。

動きとして同ディレクトリに生成される`drivers.json`をメタデータとして参照し、ドライバのダウンロードが行われてるようです。
:::

# おわりに
課題に対するソリューションが既に存在する場合は、使わない手はありません。

webdriver_managerに感謝にします。
お母さんでもわかるpositionプロパティ

# 経緯
positionプロパティを使っていると、「あれ？これpaddingやmarginでもいいんじゃない？」と思うことが何度かありました。そこでそれぞれの**使い道について**記事を書きたいと思います。

## static
これは何も指定をしていないデフォルト状態。
もし使用するとしたら**打ち消し**をしたい時とかです！

## relative
[使用例]
* paddingやmarginの影響を受けたくない
* 要素を少しだけずらしたい
* 謎に埋まらない隙間を埋める時
* 「absolute」「sticky」の基準にしたいとき
* 余白の外側へ飛び出すデザイン

飛び出すデザイン例
<img width="600" alt="スクリーンショット 2022-09-21 8.49.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782070/de842129-9d62-cece-bac8-97a446a722f4.png
">

## absolute
relativeを設定した親タグの中で自由に設置できる（なければbodyが基準になる）。

* 「画像」と「テキスト」を重ねる
* 中央寄せ

```index.html
<div class="wrapper">
    <div class="inner"></div>
</div>
```

```style.css
.inner{
    top:0;
    bottom:0;
    right:0;
    left:0;
    margin:auto;
}
```
<img width="600" alt="スクリーンショット 2022-09-21 9.25.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782070/30d68923-d0b4-7d8a-9553-792b75c4264e.png
">

## fixed
ウィンドウに固定したい要素があるのなら必須。
[使用例]
* ヘッダー
* トップボタン
* バナー
* コンテンツ
↓
z-index
width 100%
margin(padding:top)　を一緒に使うと便利！

## sticky
fixedと似ているが、基準をrelativeにしたいとき

## まとめ
使用頻度は多くないものの、使いどきを見極めれば便利なものばかりだということを知りました。
余白では再現できない、細かな動き等をpositionを使って再現していきたいと思います。
Linux オープンソースについて

●オープンソース
プログラムのソースコードを公開し、誰でも自由にソフトウェアの改良や再配布（再頒布）をすることができるという考え方。

1. 再配布が自由である
2. ソースコードを入手できる
3. ソフトウェアの改変や派生物の作成ができ、元と同じライセンスを適用できる
4. 差分の配布と適用を許可する場合においては、ソースコードの改変を制限できる（著作物の完全性の維持）
5. 利用する個人やグループを差別しない
6. 利用する分野を差別しない
7. ライセンスの権利は再配布された全ての人に適用され、追加のライセンス契約を必要としない
8. ライセンスの権利は特定の製品の一部として限定されない
9. 共に配布される他のソフトウェアを制限しない
10.技術的に中立である

ソフトウェアにおけるライセンスとは、ソフトウェアの利用者が遵守するべき事項（およびその文書）のこと。上記の条件を満たすライセンス（オープンソースライセンス）には様々な種類があり、オープンソースライセンスを持つソフトウェアがオープンソースソフトウェア（OSS）。

OSSの特徴：

・著作権の表示
OSSは著作物であり、派生物（著作物を改変したもの）にも適切な形で著作権の表示を保持する。

・無保証である
著作者はソフトウェアの動作について保証しない。

・開発、メンテナンスの継続
OSSは利用者や開発者のコミュニティがメンテナンスをすることで、修正や新機能の開発を継続する。


●プロプライエタリソフトウェア
オープンソースソフトウェアに対して、プログラムやソースコードの利用に際して、秘密保持契約の締結や利用料の支払いが必要などの制限がかけられているものを「プロプライエタリ（私有の）ソフトウェア」という。Microsoft WindowsやOracle Databaseなど。

●コピーレフト
・著作物の利用やコピー・再配布、改変を制限しない
・派生物（著作物を改変したもの）についても利用やコピー・再配布、改変を制限しない
・コピー・再配布の際はソースコードなど全ての情報を入手可能とする
・同じライセンスを著作物および派生物にも適用し、明記する


一度コピーレフト型のライセンスを用いたソフトウェアを利用すると、その後の派生物はすべて同じライセンスを適用しなくてはならない。コピーレフトの考え方に対して、派生物に対して許容的な「非コピーレフト型」のライセンスも存在する。


●オープンソースライセンス
代表的なオープンソースライセンス

・GPL（GNU General Public License）
GPLはFSFによって管理・運用されておりLinuxはGPLv2。

・AGPL（GNU Affero GPL）
AGPLは、ネットワーク越しのソフトウェアの利用でも、利用者はソースコードの開示を要求できる。

・LGPL（GNU Lesser GPL）
主にライブラリ用に作成。

・MPL（Mozilla Public License）
Mozilla Foundationによって作成。

・BSD License
BSD（Berkeley Software Distribution）ライセンスはカリフォルニア大学によって作成。

・MIT License
MIT（Massachusetts Institute of Technology：マサチューセッツ工科大学）で作成された、BSD系のライセンス。

・Apache License
Apacheソフトウェア財団（ASF）によって作成された、BSD系のライセンス。


●パブリックドメイン
著作物に対して著作権や特許権などの知的財産権が発生していない状態、または失効した状態のこと

●フリーソフトウェア
フリーソフトウェアとは、ソフトウェアの利用・改変・配布などが自由に行えるソフトウェアのこと。
無償のソフトウェアは「フリーウェア」、有償のソフトウェアは「シェアウェア」

●FOSS/FLOSS
「FOSS（Free/Open Source Software）」や「FLOSS（Free/Libre and Open Source Software）」は、自由にソースコードの入手、改変が行えるソフトウェアを総称したもの。
オープンソースソフトウェア、フリーソフトウェアはFOSS、FLOSSに該当。


●オープンソースコミュニティ
オープンソースソフトウェア（OSS）の開発や改善に共通の関心を持ち、共同開発や情報交換を行う人々の集まりのこと。様々なコミュニティが存在し、メンバーは開発者、利用ユーザ、企業などで構成。

●コミュニティへの参加
基本的に誰でも参加できる。意見を交換する手段として、メーリングリストや掲示板・フォーラム、チャットなどが用意。また、イベントやトレーニングが各地で開催されることもあり、他のコミュニティメンバーと直接会って交流することも可能。

●コミュニティでのオープンソースソフトウェアの開発
オープンソースコミュニティでは多数のメンバーがソースコードを変更、共有して開発を行う。
主なバージョン管理システムには、CVSやSubversion、GitやMercurialなど。

●オープンソースコミュニティの例
Linux Foundation、GNUプロジェクトなど。

・Linux Foundation
Linuxだけではなく様々なオープンソースの技術の発展や活用を目的とする非営利の共同事業体。Linuxカーネルの開発者リーナス・トーバルズが参加。

・GNUプロジェクト（グヌープロジェクト）
自由なオペレーティングシステムを開発する目的で、当時MITにいたリチャード・ストールマン（フリーソフトウェア財団の創設者）によって立ち上げられた。

●オープンソースエコシステム
OSSを自社製品に組み込んだ企業がバグ修正やソースコードの公開を行うことによってOSSは利用者が求める機能を実装し広く使用されるようになる、といった循環のこと。
行政区域データのgeojson

行政区域データの軽量なものが欲しかったので、[こちら](https://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-N03.html)を加工して[作成しました](https://github.com/misawa2048/GeoJson_administrative_district)。
![GeoJson_administrative_district](https://github.com/misawa2048/GeoJson_administrative_district/blob/master/ss_japan.png?raw=true)
【JavaScript】if文の中でgotoしたい


こういうコードがあったとする。
これをスッキリとさせたい。（今はa, b, cしかないが、後々d, e, f…などと追加されたとき面倒だから）

```javascript
if (a.isHoge111) {
	a.hoge111();
}
else if (b.isHoge111) {
	b.hoge111();
}
else if (c.isHoge111) {
	c.hoge111();
}
else if (a.isHoge222) {
	a.hoge222();
}
else if (b.isHoge222) {
	b.hoge222();
}
else if (c.isHoge222) {
	c.hoge222();
}

if (a.isHoge333) {
	a.hoge333();
}
else if (b.isHoge333) {
	b.hoge333();
}
else if (c.isHoge333) {
	c.hoge333();
}
else if (a.isHoge444) {
	a.hoge444();
}
else if (b.isHoge444) {
	b.hoge444();
}
else if (c.isHoge444) {
	c.hoge444();
}

if (a.isHoge555) {
	a.hoge555();
}
else if (b.isHoge555) {
	b.hoge555();
}
else if (c.isHoge555) {
	c.hoge555();
}
else if (a.isHoge666) {
	a.hoge666();
}
else if (b.isHoge666) {
	b.hoge666();
}
else if (c.isHoge666) {
	c.hoge666();
}

return;
```

もしJavaScriptにgoto文があれば次のように書けるのだが…ないので無理

```javascript
const list = [a, b, c];

for (const x of list) {
	if (x.isHoge111) {
		x.hoge111();
		goto FUGA;
	}
}

for (const x of list) {
	if (x.isHoge222) {
		x.hoge222();
		goto FUGA;
	}
}

FUGA:

for (const x of list) {
	if (x.isHoge333) {
		x.hoge333();
		goto PIYO;
	}
}

for (const x of list) {
	if (x.isHoge444) {
		x.hoge444();
		goto PIYO;
	}
}

PIYO:

for (const x of list) {
	if (x.isHoge555) {
		x.hoge555();
		return;
	}
}

for (const x of list) {
	if (x.isHoge666) {
		x.hoge666();
		return;
	}
}

return;
```

しょうがないのでこう書く。

```javascript
const list = [a, b, c];

(() => {
	for (const x of list) {
		if (x.isHoge111) {
			x.hoge111();
			return;
		}
	}

	for (const x of list) {
		if (x.isHoge222) {
			x.hoge222();
			return;
		}
	}
})();

(() => {
	for (const x of list) {
		if (x.isHoge333) {
			x.hoge333();
			return;
		}
	}

	for (const x of list) {
		if (x.isHoge444) {
			x.hoge444();
			return;
		}
	}
})();

(() => {
	for (const x of list) {
		if (x.isHoge555) {
			x.hoge555();
			return;
		}
	}

	for (const x of list) {
		if (x.isHoge666) {
			x.hoge666();
			return;
		}
	}
})();

return;
```

終わり。
Amazon Transcribe とは

## 勉強前イメージ

音声をなんかってサービスだった気がする・・・
最近似たようなサービス調べてるから。。

## 調査

### Amazon Transcribe とは

AWSのサービスで自動で文字起こしができるサービスです。
Amazon Transcribeは音声・動画ファイルをアップロードしてASRという音声認識の技術を使って音声をテキストに変換します。

Transcribeを使うことで音声データの文字起こしはもちろんのこと、会議の議事録や動画の字幕を作ったりもすることが出来ます。
もちろん他のAWSサービスと連携させることができ、
Amazon Connect(コールセンターシステム) と組み合わせて通話記録の文字起こしをしたりすることも出来ます。

Amazon Transcribeの使い方としては以下を行うことで文字起こしが完了します。
Transcribeで作成したファイルはJSONで出力されるようです。

1. s3バケット作成
2. バケットに音声・動画ファイルのアップロード
3. Amazon Transcribeのjobを作成

## 勉強後イメージ

ややこしくなってきたからまとめる。
こんな感じかな？

- Amazon Lex → 音声やテキストを使った会話形のインタフェースを構築できるサービス
- Amazon Polly → テキストから音声に変えてくれるサービス
- Amazon Transcribe → 音声からテキストに変えてくれるサービス

## 参考

- [機械学習の力で音声データから文字起こしができるAmazon Transcribeを解説](https://business.ntt-east.co.jp/content/cloudsolution/column-160.html#:~:text=%E3%81%AE%E8%A8%98%E9%8C%B2%E3%82%92-,Amazon%20Transcribe%E3%81%A8%E3%81%AF,%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%AE%E3%81%8C%E9%AD%85%E5%8A%9B%E3%81%A7%E3%81%99%E3%80%82)
- [Amazon Transcribeを徹底解説！導入すべき3つの企業](https://business.ntt-east.co.jp/content/cloudsolution/column-294.html#section-2)
特定のバージョンのnodeをインストールしたDocker環境を用意する方法

各バージョンのnodeのインストール方法は、[nodesource/distributions: NodeSource Node.js Binary Distributions](https://github.com/nodesource/distributions)で記載されています。

```shell
# Using Ubuntu
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs

# Using Debian, as root
curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
apt-get install -y nodejs
```

ただこの方法は、仕事の関係で**ちょっと古いマイナーバージョン**が使いたいときに使えません。必ず最新のマイナーバージョンがインストールされるからです。

## 直接バイナリを取得する

上記の場合は、https://nodejs.org/dist から直接欲しいバージョンをバイナリで取得しましょう。

たとえばv16.0.0であれば、 https://nodejs.org/dist/v16.0.0 から取得できます。各CPU、OSにあったtar.gzがあるはずです。

tarファイルを解凍すると、binなどが入っているので、これを適当なところに移します。  
シンボリックリンクを貼ってもいいでしょう。

## Dockerfile

v16.0.0を使えるDocker環境の作成例をひとつ挙げておきます。

```
FROM ubuntu:18.04

RUN apt update && apt install -y wget
RUN wget https://nodejs.org/dist/v16.0.0/node-v16.0.0-linux-x64.tar.gz \
  && tar xvf node-v16.0.0-linux-x64.tar.gz \
  && mv ./node-v16.0.0-linux-x64/bin/node /usr/bin/node \
  && mv ./node-v16.0.0-linux-x64/bin/npm /usr/bin/npm \
  && mv ./node-v16.0.0-linux-x64/bin/npx /usr/bin/npx \
  && mv ./node-v16.0.0-linux-x64/lib/node_modules /usr/lib/node_modules \
  && mv ./node-v16.0.0-linux-x64/share/doc /usr/share/doc \
  && mv ./node-v16.0.0-linux-x64/share/man /usr/share/man \
  && mv ./node-v16.0.0-linux-x64/share/systemtap /usr/share/systemtap

ENTRYPOINT ["/bin/bash"]
```

## その他の方法

[Node.js のインストール（ソースから） - Qiita](https://qiita.com/silverskyvicto/items/a57b6296ff3238b1547c)で紹介されているような方法もありますが、`make`コマンドの実行が長時間かかります。

この記事の方法であれば解凍するだけなので時間は相当短いです。

## 感想

このインストール方法はググっても上手くみつからず、そのため記事に残しておくことにしました。

その背景には、node側が「最新のマイナーバージョンを利用する」ことを前提にしたいのかもと感じました。

というわけで特別な理由がないかぎりは最新のマイナーバージョンを利用できるよう、メンテナンスをきちんとしましょう。
Cacheの超簡単解説

# Cacheとは
- サーバとブラウザーとの通信を効率的にするための情報技術。
- ブラウザーがWEBサイトに初めてアクセスした場合、staticファイル（image, html, css, javascript）はコピーを保存し、再度同じWEBサイトにアクセスした場合、ブラウザーは保存されたstaticファイル利用する。
- Cacheは満了期間が定まってないため、手動で削除する必要がある。

# Cacheの利点
ネットワークトラフィクが減らし、webサイトを素早くレンダーリングすることができる。

# Cacheの弱点
staticファイルが更新されてもブラウザーはコピー本を使用するため、古いままの場合がある。

# cachebuster(キャッシュバスター)
Cacheの弱点を回避するために行われるのが`cachebuster`である。
cachebusterは、静的ファイル名を変更することで、古いファイルを読まないようにする方法。
やり方としては以下のお通りである。

```html:html
<link href="https://example.com/css/style.css?ver=210615" rel="stylesheet">
```

`style.css`のファイル名の後ろに`?`と共に別名を付けることで、以前cacheに保存されたファイルを無視して、最新の静的ファイルをダウンロードして読み込むようにする。
webでのクッキー（Cookie）の簡単解説

# クッキーとは
- HTTPヘッダーに含まれるテキストファイル。
- keyとvalueとして構成されており、名前、値、満了期間、パスなどの情報がある。
- 満了期間があるため、時間が経つと自動的に削除される。
- Cookieはwebサイトにアクセスする際に取得する。


# Cookieの利点
ユーザーの利用状況（閲覧数やログイン情報）などを記録するすることができる。

# Cookieの弱点
誰でもcookie情報を修正することができるので、セキュリティーに弱い
（safariでは1日で消す方針に変更）

# クッキーレスとは
クッキーにはユーザーがアクセスしたwebサイトの名前とパスが記録され、第３者も閲覧することができるため、主に広告配信などに利用されていたが、ユーザーの行動を同意なく閲覧することができるため、近年はクッキーを使わない方向に変わりつづある。
SyncTubeでみんなでチャットしながら足踏みオンライン散歩会ができるPGM

<h3>SyncTubeでみんなでチャットしながら足踏みオンライン散歩会ができるPGM</h3>
SyncTubeでみんなでチャットしながら足踏みオンライン散歩会ができるPGMをpythonで作りました。

<hr>
githubURL: https://github.com/NanjoMiyako/WalkingWithChats

<hr>
スクリーンショット
![scnshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/1cebf126-9919-9575-91c7-ccf23238e2df.png)
(github上にスクリーンショットがあります)

<hr>
使い方<br>
まずPGMにpytest9.pyに書かれている、g_ConsoleX, g_ConsoleYの部分を
スクリーンショットの①の部分に合わせます

次にコマンドラインからpytest9.pyを以下のコマンドライン引数で呼び出します.

python pytest9.pyのURL 足踏み閾値％(ex:0.5) スクリーンショットの➁(まるに)のX座標 スクリーンショットの➁(まるに)のY座標

あとは足踏みで動いた瞬間に「散歩を開始しました」とチャットで自動入力し、
差分が一定以下になったときに「休憩中です」とチャットで自動入力します。

<hr>
使用したサイト<br>
<a href="https://sync-tube.de/">SyncTube</a>

<hr>
参考サイト<br>
<a href="https://sagantaf.hatenablog.com/entry/2017/10/18/231750">Python〜pyautoguiで日本語入力する方法 - sagantaf<a><br>
ASP.NET CoreウェブアプリでRazorページを追加したけどブラウザーに表示できないリンク切れになってしまう

ASP.NET Coreウェブアプリで、すでにページが表示できているのだけど、
Razorページを追加したら、ビルドして実行でページを見ていっても他のページからのリンクができてない。
ブラウザーに表示できないリンク切れになってしまった。
リンクの上でホバーすると、ブラウザーはリンク先をそのページ自身と表示してくる。。
なんで？？？

‥ソリューションに乗っているほかのページのファイルと、なんかvs右下隅の表示が違う気がする。
schtmlのプロパティが違う？

「ビルドアクション」が当該ページは「なし」だが、出るページは「コンテンツ」だった。
変えてみてビルドしたら見られるようになった。
開発チームに参加し、GitHubからプロジェクトファイルをcloneするまでの流れ

# 目的

開発チームに参加し、GitHubからプロジェクトファイルをcloneするまでの流れをまとめました。
具体的には下記項目の説明をします。

+ 共同編集者のアクセス権をもらう
+ プロジェクトフォルダをcloneする

:::note info
本記事は
[新規プロジェクト立上げ時にGitHubにプロジェクトフォルダ全体を共有する方法](https://qiita.com/ysk91_engineer/items/a87f95fbf76018963782)の続きです
:::

# 手順

## GitHubのアクセス権を付与してもらう

まずはGitHubのアクセス権を付与してもらい、レポジトリに参加しましょう。
レポジトリのオーナーにGitHubに登録した自分の
`username`, `full name`, `email`
のいずれかを伝えるとアクセス権が付与されます。

### アクセス権付与の仕方(レポジトリオーナー向け)

GitHubにレポジトリを作成したら、共同作業者にアクセス権を付与しましょう。
GitHubでレポジトリ>setting>Collaboratorsから
Manage accessの欄にある**Add people**のボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/8b8e98ab-e78c-ed1f-8dbf-c8cf64ed7458.png)

ボタンを押すと`username`, `full name`, `email`の記入を求められますので、GitHubに登録した相手の情報を記入します。

:::note warn
注意
>GitHub では、24 時間以内にリポジトリに招待できる人数に上限があります。 この上限を超える場合は、24 時間待つか、コラボレーションする人数の多い Organization を作成してください。
[コラボレーターを個人リポジトリに招待する(GitHub Docs)](https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository)
:::


## 自分のPC上にプロジェクトファイルをcloneする
参加したレポジトリの**Code**ボタンからHTTPSを選択し、URLをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/7cb0db83-34b4-ec00-db39-360d515b11b0.png)

コピーしたURLを使用してターミナル上で下記を実行します。

```terminal
git clone <コピーしたURL>
```

これで、ローカル上にプロジェクトファイルが生成されます。


# まとめ
今回は、前回の記事に引き続き、GitHubからプロジェクトファイルをcloneする手順を紹介しました。

今後の流れは
+ 新しくブランチを切り、編集内容を親ブランチにマージする
+ 異なるブランチで同一ファイルを編集したときの対処法
について説明する予定です。
BootCampでWindowsをインストールする手順

# Windowsインストール前の環境
Mac mini late 2014

内蔵HDD 1TB
MacOS High Sierra 10.13 500GB
Windows10 500GB

増設SSD 500GB
MacOS Monterey 12.6 500GB

# 今回のインストール
増設SSD 500GBのうち、200GBをWindows10用に割り当ててBootCampでインストールした

# 作業手順

1.Macを増設SSDで起動

2.Windows10をダウンロードする

https://www.microsoft.com/ja-jp/software-download/windows10ISO

Windows10(multi-edition ISO)
日本語

Win10_21H2_Japanese_x64.iso

3.内蔵HDDにすでにあるWindows10を削除する
BootCampアシスタントを起動して、
「Windows10またはそれ以降のバージョンを削除」にチェックを入れて、「続ける」をクリック
すでに、内蔵HDDにWindowsがインストールされているので、これを削除しないとSSDにWindowsをインストールできない。
注意：増設SSDのMontereyで起動している場合でも、復元をすると、内蔵HDDのWindowsが削除されてしまう

4.Windows10とWindowsサポートソフトウェアをUSBメディアに書き込む

16GB以上のUSBメディアをMacに差し込む

BootCampを起動し、
一番上の
「Windows10またはそれ以降のインストールディスクを作成」をチェック

「続ける」

次に、
インストールするisoを選択する
右の選択マーク^をクリック
![スクリーンショット 2022-09-21 7.03.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2617993/0ecc2e5e-45da-d565-244e-d85cd1b51629.png)
「選択…」をクリック
![スクリーンショット 2022-09-21 7.06.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2617993/2759a2fd-c4fa-44c9-7e96-91fad8939a3b.png)
Win10_21H2_Japanese_x64.isoを選択して、
「開く」をクリック
(デフォルトだと、windows.isoが選択されている。
これは、BootCampが決めたwindowsのファイルだと思われる。
これを使ってやってみたところ、Windowsセットアップの途中で、画面への出力信号がなくなってセットアップを中断せざるをえなくなった）

保存先ディスクがUSBメディアであることを確認して、「続ける」

すると、USBメディアがフォーマットされて、
Win10_21H2_Japanese_x64.isoと
Windowsサポートウェア
がUSBメディアに書き込まれる

5.Windows10のインストール
作成したUSBメディアをMacに差し込む
BootCampアシスタントを起動し、
3番目の
「Windows10またはそれ以降のバージョンを削除」のみにチェックを入れて
「続ける」をクリック
(この項目は、Windows領域が既にある場合は、Windows領域削除の処理に進み、ない場合には、Windowsパーティション領域のサイズ設定の処理へと進む）

Windowsに割り当てるパーティションのサイズを決める。

あとは、インストール開始
指示に従う
ハードワークとは、Labor とは

[ハードワークで人は成長するか - SaaS企業で働くプロダクトマネージャーのブログ](https://www.blockchainengineer.tokyo/entry/hard-work-meaning)

> キャプチャは800枚以上になっていたと思いますが、結局パフォーマンスモニタのキャプチャは使いませんでした。課題設定も方法も誤っていました。これは一例ですが、このプロジェクトでは翌朝まで打鍵をすることや、翌朝まで印刷をすることなどの指示が何度も続きました。一連のプロジェクトで私はハードに働きましたが、スキルが成長した実感はありませんでした。成長したと思えるスキルはキャプチャをずれずに取る力とマウス操作くらいではないでしょうか。

この場合は Work ではなくて Labor なのではないだろうか、というポエムです


## Work と Labor (そして Task、Job、Business、Responsibility ...) の違い

[「work」と「labor」の違い | 世田谷徒然日記](https://ameblo.jp/chikarablog/entry-10008962060.html)

> もともと語源はギリシャ語から来ていて、前者の「work」は創造的な仕事でたとえば意匠をこらして壷を作る仕事のようなものをさすらしい。
一方、後者の「labor」は単純労働を意味するらしい。たとえば、壷をただただひたすら磨く仕事のようなものをさすらしい。

[What is the difference between "labor" and "work"? : AskWomen](https://www.reddit.com/r/AskWomen/comments/31tfww/what_is_the_difference_between_labor_and_work/)

> Labour carries with it the connotation of physical work, a job that requires strength or lots lifting.
> Work is just work, it's something that you do in exchange for a wage.

[仕事を表す英語 “work” “job” “task”をどうやって使い分ける？仕事に関連した便利な英語フレーズ紹介！ | English Lab（イングリッシュラボ）┃レアジョブ英会話が発信する英語サイト](https://www.rarejob.com/englishlab/column/20190530/)

> 「work」は仕事・働くこと全体を意味する単語で、Jobよりも広義の仕事を意味します。目標を成し遂げられる事柄に使われる単語で、肉体的・精神的な労働・努力を表現するのに使われます。
> laborは、骨の折れる作業や労働というイメージで使われる名詞と労力を発揮するといった意味の動詞と形容詞があります。

[Labor versus work - Sasha Dichter's Blog](https://sashadichter.com/2012/02/02/labor-versus-work/)
> **Work is an intended activity that is accomplished through the will.** A labor can be intended but only to the extent of doing the groundwork, or of not doing things that would clearly prevent the labor.  

Labor ではなく本当に Hard work ならば、「成長」するのかもしれない。
もっとも、「成長」についても定義しないとならないのかもしれない... 

## 参考

[「理科系の作文技術」を読んだので、その要点 - Qiita](https://qiita.com/e99h2121/items/dd57fd2374d7e9e0726a#%E3%82%82%E3%81%A3%E3%81%A6%E3%81%BE%E3%82%8F%E3%81%A3%E3%81%9F%E8%A8%80%E3%81%84%E5%BB%BB%E3%81%97) ... 「もってまわった言い廻し」

以上です～
STM32G071とAL12832AWWBでデモ(Adafruit SSD1306,Adafruit GFX)(SSD1306(128x32))


いろいろ(ちなみSTM32G031で試したけど失敗

x たまにリセットが失敗する。電源を入れ直すと治る


x ライブラリのインストール方法は、めんどいので省略
x サイズは、約55KB


x NUCLEO-G071RB
x AL12832AWWB-H-U02です。(秋月)

x リセット端子は、10kΩを通して3.3Vに接続する


目的
OLEDのテスト


![o_con787.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f40a99cb-5774-49e7-debf-2f942a5bf8e0.jpeg)


![i2c_oled_9701_uno_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c6787759-518b-3202-34bb-670715adaca4.jpeg)



![o_con785.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3ae4f6b1-6c56-23c3-f2e0-1c970f7030be.jpeg)



![o_con786.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/35fb54ab-e831-ae9c-60d2-dd0e7ab52742.jpeg)