OmniAICreator/Qiita-1.07M huggingface dataset:
正規表現　忘却録

自分用の忘却録です。
参考やコメントはご自由に



# （半角）数字
\dで検索をかけれる
例えば
012-3456-789
という電話番号は以下のようにすると検索できる

```
\d\d\d\-\d\d\d\d\-\d\d\d
```

![スクリーンショット 2022-04-25 9.59.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331535/1ff70f0e-c385-b5a2-469d-72cbc7df1e17.png)

だけどいっぱい\dって書きたくないよね
なので条件付きの検索方法で回避しよう
また、条件付きの検索は以下に示す

## {}による文字量指定検索
\d{n,m}で検索が可能(引数はnだけでもok!)
範囲はn以上m以下の文字数を検索する事ができる。（引数がnだけの場合だとその数しか検索がかからない）
先程の電話番号を{}を使って検索をすると

![スクリーンショット 2022-04-25 10.03.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331535/051549ab-1cc9-d5ef-a7d9-a6cf1212af4d.png)


```
\d{2,4}\-\d{3,4}-\d{3}
```

じゃあ海外のサイトでよく見る電話番号の形式だとこれはどう？
012(3456)789
この形式たまに見ますよね
このままだと丸括弧が邪魔でいい感じの検索結果が貰えない...
![スクリーンショット 2022-04-25 10.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331535/22082f1e-48d2-d6b4-87c9-b84e34447acd.png)
じゃあどうすんの？
他の条件検索を使いましょう！

## [　]を使った文字列の検索
[a, b, .....n] (n = ∞)
検索したい文字列を[　]の中に入れることによって[ ]内に含まれている文字列を検索をする事が可能です。
ということで以下のように検索をする

![スクリーンショット 2022-04-25 10.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331535/09bf3990-82cc-c99c-8077-782f86b186d7.png)

両方できたー

## [ ]の注意
[ ]内の　`-`の取り扱いには注意をしてください
[0 - 9]と[-09],[09-]を例にします
[0 - 9]だと０から9までの数字を検索する事ができ、[-09],[09-]だと0,9,-の検索をしてしまい範囲が異なるので注意

## 文章の途中で二回目以降省略されても大丈夫なように
よく本や説明文を読む際に以降を◯◯とすると記載があると思うが今回二回目以降の記載をできればなんか良さそうじゃない？？
例えば以下の文章を使う

```tex
今日は晴れています
休日の今日は予定がなくゴロゴロとします
IO社の田中さんと有名なカフェ+モカーのカフェ・モカを飲みに行きます
IO社は最近忙しそうだから約束の時間がずれないと良いのだが...
カフェモカ楽しみ！
```

今回の文章ではカフェ・モカと二回目にカフェモカと記載がある
カフェ・モカとカフェモカ両方検索をかけたい場合`・`をどのようにするかが問題だ

そこで?を使った検索で回避する
n？ (n: string)
？を使うことによってnがある時とない時を両方検索する事ができる

![スクリーンショット 2022-04-25 11.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331535/d982a854-626c-59b4-8dac-42b1c68cf69d.png)

```
カフェ[・]?モカ
```

これで全てのカフェ・モカを見逃さない！
だがカフェモカは取れたが店名(カフェ+モカ-)が取得できてない。よくないね
だからこれも取得するようにする

```
カフェ[・ +]?モカー?
```

これでok

だけどもうちょっと短くしたい時(特に[　]の中身)
一文字の際には便利なメタ文字があるのだ！！　 

```
カフェ.?モカー?
```
.を使うことによってなんでもいいので一文字入る文字まで検索してくれる！
カフェとモカの間に一文字何か入る際は使うと便利そう！

一文字以上の場合は？？
`+` を使って回避する！

## 連続の文字を検索

例えばこんな文章から検索をかけたい場合
カフェモカモカモカモカモカモカ
モカが後ろに続く時って毎回モカを描きたくないし'.'を繋げて曖昧な文字を検索するわけにもいかない！
そんな時に先程の`+`が使える！

![スクリーンショット 2022-04-25 14.58.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331535/4f8c8f01-a947-20ac-3e40-6c7ac1fe0e25.png)

```
カフェ[モカ]+
```
これで同じ文字列を簡単に検索できる！

じゃあ中間の複数文字がある場合と無い場合の両方が可能性としてある場合は？
と感じるかもしれない。
そこでもう一つの連続に対してのアプローチとして`*`がある！
以下の文字列を使う
カフェモモモモモモモモモモモモモモモモモモモモモモモモモモカ

モへの情熱がある文章を検索したい！逆にモが抜けている
カフェカ

こんな時に使える！
```
カフェモ*カ
```


![スクリーンショット 2022-04-25 15.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331535/e2357dbc-a568-9369-2ae4-d23d05937a66.png)

## 連続した形式の検索 

文字列じゃなくて同じ形式が連続している場合使えるようになればこれ実践的じゃない？
以下の文章を使いましょう！！

```
<menu>カフェモカ</menu>
<menu>チャイ</menu>
<menu>コーヒー</menu>
<menu>緑茶</menu>
```
<menu></menu>がありますね。この連続を使って商品名を検索していきます。

` >.+< `で解決！（両サイドに><があるのが気になる）

今日は以上
Mac  githubのSSH設定

今回はgithubの公式ドキュメントに沿った形でSSH設定を行っていきたいと思います。
設定し終えれば、githubでSSH通信が使える様になります。

# 前提
使用端末はMacで、githubの初期設定は済んでいる事。

# SSH設定の手順

### 1. まずは、sshキーが存在しているかをターミナルで確認する
```
$ ls -al ~/.ssh
```

### 2. sshキーを作成する。“”の中に自分のメールアドレスを入力する。
```
$ ssh-keygen -t ed25519 -C "your_email@example.com"
```
入力後、以下が出力されればSSHキーが作成されています。
> Generating public/private algorithm key pair.

### 3. プロンプトに「ファイル名の置き場所とパスフレーズをどうする?」と聞かれますが、こだわりがなければ全てEnter押せばOK。
> Enter a file in which to save the key (/Users/you/.ssh/id_algorithm): [Press enter]
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]

### 4. ssh-agentを起動する。
```
$ eval "$(ssh-agent -s)"
```

### 5. ~/.ssh/configがデフォルトの場所に存在するかを確認する。(存在していれば6.は飛ばして良い。)
```
$ open ~/.ssh/config
```

### 6. 先程の5.で`The file /Users/you/.ssh/config does not exist.`と帰ってきた場合はファイルを作成する。
```
$ touch ~/.ssh/config
```

### 7. ~/.ssh/configを開き、以下のようにファイルを更新する。
```
Host *
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_ed25519
```

### 8. 秘密鍵をssh-agentに追加する。パスフレーズを追加していない為、`-K`オプションは付けない。
```
$ ssh-add ~/.ssh/id_ed25519
```

### 9. pbcopyコマンドでssh公開鍵をコピーする。
```
$ pbcopy < ~/.ssh/id_ed25519.pub
```

### githubの操作編

#### 10. github.comでプロフィール画像をクリックしてSettingsを開く。次にSSH and GPG keysを開きNew SSH keyをクリックする。
#### 11. title欄は好みの名前でKeyの欄にはpbcopyでコピーしたものをペーストで貼り付ける。

### ターミナルに戻る

#### 12. ssh接続テストをする。
```
$ ssh -T git@github.com
```

以下のように自分の名前が帰って来ればOK！
> Hi username! You've successfully authenticated, but GitHub does not
> provide shell access.

お疲れ様でした！

# 参照
公式githubドキュメント
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/about-ssh
[Zabbix]アクションの本文にマクロやトリガー条件式を記述し、発報後のメールで展開する

# ●はじめに
統合監視ツールのZabbixを使い、アクションの本文にマクロやトリガー条件式を記述し、発報後のメールで展開する方法を学習したのでメモします。
たとえば取得したディスク使用状況をメールに展開したり、トリガー評価時の1時間前のデータをメール本文に含めて比較する、といったことも可能になります。

# ●環境
|項目 |詳細 |
|:-:|:-:|
|ホストOS   |macOS Monterey 12.2.1   |
|仮想化ソフト   |VMware Fusion 12.2.0   |
|ゲストOS   |Alma Linux 8.5   |
|Zabbix ver   | 5.0.21  |

# ●設定箇所/書式

**1.設定箇所**
[左ペイン] - [設定] - [アクション] - [任意のアクションを押下] - [実行内容タブ] - [実行内容の追加を押下] - [メッセージのカスタマイズにチェック]
![スクリーンショット 2022-04-25 14.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/a97d281b-63e0-832c-a0f4-730a88e53381.png)


**2.書式**
```bash
# 書式
{マクロ}
{ホスト名:アイテム[].関数()}

# 例
{ITEM.VALUE3} //取得した監視アイテムを展開。数値が付くとトリガー条件式内のN番目に記載されているアイテムを指定できる。
{host1:vfs.fs.size[C:,used].last(#3)} //host1のCドライブのディスク使用量のうち、最新値から数えて3番目のヒストリデータを展開
```
※使用できるマクロについては、[Zabbix公式ドキュメント](https://www.zabbix.com/documentation/2.2/jp/manual/appendix/macros/supported_by_location)をご参考ください。

# ●設定例

**■月曜15:00時点のディスク使用量と14:30時点の使用量を週次で自動送信する**
- ホスト名：Win2019
- アイテム：vfs.fs.size[C:,used]
- トリガー：time関数、dayofweek関数
<br>

**1.トリガー**
```bash
({Win2019:vfs.fs.size[C:,used].time()}>150000  //15:00:00になったら発報
and
{Win2019:vfs.fs.size[C:,used].time()}<150100)  //15:01:00を越えたらトリガー条件式が偽になる
and
{Win2019:vfs.fs.size[C:,used].dayofweek()}=1　 //毎週月曜日
```
![スクリーンショット 2022-04-25 14.49.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/a59ce828-2b03-7603-6162-11bab830e265.png)

**2.アクションのメッセージ**
```bash
【ディスク使用量】
■ホスト名：{HOST.HOST} 　//ホスト名をマクロで指定
Cドライブ：{Win2019:vfs.fs.size[C:,used].last()}  //15:00時点のディスク使用量（トリガー評価時点の最新値）
Cドライブ：{Win2019:vfs.fs.size[C:,used].last(#1,30m)}  //14:30時点のディスク使用量（トリガー評価時点から30分遡った時点の最新値）
```
![スクリーンショット 2022-04-25 14.44.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/68837d43-b857-cefa-1c70-71f322dc306f.png)
※トリガー条件式のN番目を指定するタイプのマクロ（ITEM.VALUE<1-9>など)は、最大9個までしか展開できませんが、トリガー条件式を併用すればさらに多くのアイテムを展開することもできます。
※また、トリガーに記述していないホストやアイテムでも、アクションのメッセージにトリガー条件式として記述すれば、複数ホスト/アイテムをまたいでメールに展開することが可能です。

**3.メール確認**
![スクリーンショット 2022-04-25 15.04.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/de3b02c3-803c-9dfa-48e8-b243e9da75ad.png)


# ●まとめ
統合監視ツールのZabbixを使い、アクションの本文にマクロやトリガー条件式を記述する手順を紹介しました。
トリガー評価時とそれより前のデータを比較したり、ベンダーに週次でディスク使用状況を自動送信する、という使い方もできると思います。

手順に誤り等ございましたら、ご指摘頂けますと幸いです。
この記事が少しでも皆様のお役に立てれば嬉しいです。


# ●参考
・Zabbix統合監視実践入門
・[Zabbix公式ドキュメント](https://www.zabbix.com/documentation/2.2/jp/manual/appendix/macros/supported_by_location)
Bronze DBA 第10章 -2まとめ

AWR(自動ワークロードリポジトリ)
パフォーマンス診断の話。
データベースでは、診断するために定期的にスナップショットを保存している。

#  スナップショットとは？
任意の時点のシステム状態に関する統計サマリーデータ。
デフォルトは
保存期間：8日間
間隔：60分毎

格納場所：SYSAUX表領域のAWR
間隔は、EMCCまたはPL/SQLパッケージで変更可能。

# ADDMとAWRの関係
ADDMはデータベース全体のアドバイザの役割がある。
AWRは、ADDMがアドバイスするために診断するためのINPUT情報「スナップショット」を取得してくる。

# ADDMの種類

| 項目 | 説明 |
|:--|:--|
| ADDM  |  従来型 |
|  リアルタイムADDM | 影響を与える一時的な問題をリアルタイムで検出  |
|  最新のADDM結果  |  過去5分間の結果 |

診断結果の最新度
ADDM <<  リアルタイムADDM　<< 最新のADDM結果

# アドバイザ

| アドバイザの種類 | 代表 |
|:--|:--|
|  全体のアドバイザ | ADDM  |
| パフォーマンスアドバイザ  | SQLチューニングアドバイザ等  |
|  その他のアドバイザ | セグメントアドバイザ等  | 

# SQLチューニングアドバイザ
どんなチューニング？
・SQLプロファイルの作成/変更
・新しい索引の作成
・オプティマイザ統計のリフレッシュ
・SQLの再構築

SQLチューニングアドバイザを実行できるソース
・過去1時間に実行された最もリソースが集中していたSQL文
・AWRに記録されたSQL文
・STS(SQLチューニングセット)
　→指定した一連のSQL文と関連するメタデータを1つのデータベースオブジェクトにしたもの

# メモリーアドバイザ

| メモリー管理モード | 使用できるアドバイザ |
|:--|:--|
|  自動メモリー管理 | メモリーアドバイザ  |
| <font color="Red">自動共有</font>メモリー管理 | <font color="Red">SGA</font>またはPGAのアドバイザ  |
|  <font color="Red">手動共有</font>メモリー管理 | <font color="Red">バッファキャッシュ</font>またはPGAのアドバイザ  |
クラウドIDE

現在、プログラミングスクールでAWSを使っているのですが、他にもクラウドIDEを使おうかどうか迷っています。
直近、緊急ではありませんが、検討しています。

# 主にPCで利用
（現在）AWS・Cloud９
（検討）Paiza Cloud

# PC・他端末共用
（検討）codeanywhere

# PC以外のみ
利用できるIDE不明

検討ポイントとして、利用料金などがあります。
AWSはインスタンス（EC2など）ごとに料金がかかりますが、
Paiza Cloudなどは基本料金です。

インターフェースが日本語でない点はAWSとcodeanywhereは同じです。

おすすめのものがあれば、教えてほしいです。
出来るだけ早くcaffe環境を作る方法


ディープラーニングモデルをPyTorchで作りたいのに参考論文がcaffeでしか作っていないお悩みの学生向け
caffe環境を作りサンプルを実行、ネットワークモデルを可視化したいとき用
実行環境はWindows10

<br>


1. WSL2(Ubuntu 18.04 LTS)をインストール

2. 下記コマンドを実行

```
sudo apt update
sudo apt upgrade
sudo apt install caffe-cpu
```
インフラエンジニアの仕事について

## 概要
インフラエンジニアの仕事について、概要や知っておくべきことのまとめです。
インフラについて携わった事が無い方や、ITエンジニアなりたての方向けに出来るだけ簡単に説明しております。

## リンク
- [インフラエンジニアとは](https://qiita.com/mj69/private/4352e9fe3d03cdcfd576)
- [ITインフラを構成する要素](https://qiita.com/mj69/private/a4a06d9240b96e7c18fd)
- サーバ　(後日掲載予定)
- ネットワーク　(後日掲載予定)
- ストレージ　(後日掲載予定)
- 仮想化　(後日掲載予定)
- コンテナ　(後日掲載予定)
- クラウド　(後日掲載予定)
    - AWS
    - Azure
    - GCP
【Rails】レコードを配列の順番に並び替える

# 初めに

## 環境

Rails 7.0.2
Ruby 3.1.1

## やりたいこと

配列の順番にレコードを並び替える。

# 本文

通常 where に配列を渡して、レコードを取得すると id 順に並び替えられて取得されます。
ですが`in_order_of`を使用することで配列の順番に並び替えられます。

```ruby
arr = [11,2,4,6,8,1]

users = User.where(id: arr)
# puts users.ids -> [1,2,4,6,8,11]


users = User.where(id: arr).in_order_of(:id ,arr)
# puts users.ids -> [11,2,4,6,8,1]
```

ちなみに `Rails 7.0.0`になってから追加されたメソッドでデータベースが `Mysql` や `postgresql` でも関係なく動きます。

# 参考

[in_order_of - Rails ドキュメント](https://railsdoc.com/page/in_order_of)

[ソースコード - Github](https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/activerecord/lib/active_record/relation/query_methods.rb#L429)
VSCodeのDocker（拡張機能）のタブで表示されるイメージ名やコンテナ名などの指定

### つまづいた点
VSCodeのCONTAINERSやIMAGESに表示される名称を、自分の思うような名称にしたかったが、うまくできなかった。
下図の赤枠に表示される名称のことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/76cf960f-ce6b-6577-c57d-970a46d24057.png)

### ディレクトリ
デスクトップにproject-nameというフォルダを作成し、そこにDockerfile、docker-compose.ymlを配置。
```shell:
oono:~/Desktop/project-name
$ tree
.
├── Dockerfile
└── docker-compose.yml
```

#### Dockerfile
```Dockerfile
FROM rdeleo/centos7-php7.4-cli:latest
```
イメージを指定しているだけ。

#### docker-compose.yml
```yml
version: "3"

services:
  app:
    build: ./
    # イメージ名を指定
    image: my-image-name
    # コンテナ名を指定
    container_name: my-container-name
    ports:
      - "80:80"
    stdin_open: true
```

`image`でイメージ名を指定。
`container_name`でコンテナ名を指定。

よくわかってなかったですが、`image`には指定名称が入るんですね。
プルするイメージの指定かと思っていました。
（buildの記載があるときは`image`でイメージ名の指定になる？）


### ビルドとコンテナ起動
```shell
$ docker-compose up --build
```

下図のようにdocker-compose.ymlで指定したイメージ名とコンテナ名が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/b13f95ea-9b05-3f7f-59a0-82961db63cbe.png)

CONTAINERSの表示については変更ができるみたいです。
コンテナ名がわかりやすく表示したかったので、
Docker拡張機能の設定＞Containers: Label
を`ContainerName`に設定しています。
たぶん標準はプロジェクト名（作業フォルダ名）になっているかと思います。

んでプロジェクト名って作業フォルダのフォルダ名なので、Dockerfileとかで指定するのかなって思っていろいろ調べてたけど時間の無駄だったという話でした！！

設定箇所としては下図を参考にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/ffde6904-eaa7-1af1-dc0a-5dc81744cfc0.png)
SSH接続できない（トラブルシューティング）

まずは備忘録として書きます。
Linux上でのSSH接続ができなかったので投稿させていただきました。

# SSH接続を拒否された場合に確認する項目（大まかに）
 FWに通信をはじかれていないか
 ネットワークの経路情報が正しいか
 SSHに関連するパッケージをインストールしているか
 外部への通信状況はどのようになっているか

FWに通信をはじかれていないか
firewall-cmd [options]
で確認
※firewalldサービス
/usr/sbin/firewalld デーモンfirewalld
/usr/lib/firewalld/ /etc/firewalld/ 設定ファイルが格納されているディレクトリ
firewall-cmd /usr/bin/firewall-cmd 設定コマンド
firewall-config GUI設定ユーティリティ

iptables [options]
※firewalld,firewall-cmd,firewall-configはPythonで書かれている

sudo ufw status
※FWで許可や拒否している通信を確認
sudo ufw allow ssh
ssh接続に使う22番ポートが許可されていない場合は許可

##・ネットワークの経路情報が正しいか
ping,tracerouteなどでネットワーク状況を確認

##・SSHに関連するパッケージをインストールしているか
サーバ側、クライアント側でインストールされているかを確認

##・外部への通信状況はどのようになっているか
ip a
ipconfig
nmap
nmtui→nmcil→vim /etc/network/interfaces
などで確認

何か訂正やご質問がありましたら、何なりとお申し付けください。
ありがとうございました。
絶対覚えとけ！Gitコマンド集&用語集

Git、GitHub初心者の私がまず初めに学んだ「Gitコマンド集&用語集」になります。
実際のタスクの基本的な進め方に沿って、コマンドを紹介していきますので、これさえ見ればとりあえず基本はOKではないのかなと思います。

## リモートリポジトリからローカルリポジトリにクローンする
まずは、リモートリポジトリからローカルリポジトリにクローンを行います。
Githubに上がっている大元のソースをローカルリポジトリにクローンします。

`git clone [ここにクローンする元のURL]`

**● リポジトリ（repository）とは？**
ソースコードや変更履歴、コメントなどを一括して保管する場所。
リポジトリには、自分のPC上に作る「ローカルリポジトリ」と、
「GitHub」などのWebサービス上に作る「リモートリポジトリ」がある。

**● clone とは？**
Github上にあるソースなどを複製すること。


## ブランチの作成
タスクを行うブランチを作成します。

`git switch -c 新しいブランチ名`


**< 切るブランチの指定がある場合 >**
①最新のリモートリポジトリの情報をダウンロードする
⇒自分以外の他の人が修正・改修している可能性があるので、リモートリポジトリとローカルリポジトリを同じ状態にする必要がある。

`git fetch`

②最新の情報をローカルリポジトリにmergeします。

`git pull origin develop`

※特定のブラントのみをpullする場合は、
`git pull origin ブランチ名`


③指定のブランチから切る
`git switch -c 切るブランチ名 origin/切るブランチ名`
※`origin`とは、リモートリポジトリを指します。

④新しいブランチを作成する
`git switch -c 新しいブランチ名`

**● ブランチとは？**
コミット履歴の流れを枝分かれさせるための機能のこと。
さらにわかりやすく説明すると...
修正・改修する際に、自分以外の人も修正・改修を行えるように、別環境（ブランチ）を作成する。
後々、修正したもの（分けたブランチ）を、大元のブランチ（ベースブランチ）に合体（merge）します。


## リモートリポジトリにpushする
タスクが完了しましたら、リモートリポジトリにmergeする

①修正・改修の内容をステージングエリアに追加します。
`git add .`

②修正・改修の内容をリポジトリに保存します。
`git commit -m "ここにメッセージを記載"`

③リモートリポジトリのブランチ履歴を更新します。
`git push origin ここにブランチ名`
=`git push origin HEAD`

**● Gitのステージングについて**
Gitは、以下の3つのステージがあります。
修正・改修を行うと、`作業ディレクトリ`から`ステージングエリア`にあげ、ステージエリアから`gitレポジトリ`にあげます。

**作業ディレクトリ（ローカル）**：全てのファイル
↓
**ステージングエリア**：作業ディレクトリから、git add で追加されたファイルが格納される。
↓
**gitリポジトリ（リモート）**：ステージングエリアから、git commit でコミットされたファイルが格納される。

## Pull Requestを行う
pushを行うと、GitHub画面画面に`Compare & pull request`ボタンが表示されるので、PRを作成してください。

**● Pull Request（プルリクエスト）とは？**
Pull Requestとは、本体への反映を他の開発者に依頼する機能になります。




以上が、基本的なGitコマンド集&用語になります。
後々、ここにコンフリクトが起きた際のコマンドでの対応方法についても記載する予定です。

用途別によく使うコマンドを以下にまとめました。

## ★用途別に使えるコマンド

**ブランチの一覧を確認したい！**
`git branch`

**ブランチを削除したい！**
`git branch -D 削除するブランチ`

**pushの履歴を確認したい！**
`git log`

**直前のcommitを取り消したい！**
`git reset --hard HEAD^`

**ブランチとブランチの差分を確認したい！**
`git status`

**指定のリモートリポジトリのブランチと、ローカルリポジトリの差分を埋めたい！**
`git pull [ここにリモートリポジトリのブランチ名`

## Non Fast Forwoardとは？
ある「ブランチ A」というブランチ の内容と master の内容を活かしつつ、それらをマージして新たな合流地点を作る、そうした作業が Non Fast Forward のマージです。

`git merge ここにブランチ名 --no-ff`


## まとめ

ただコマンドを羅列するだけでは、「いつこのコマンドを使えばいいのか？」イメージがしにくいのではないかと思い、実際の制作の流れに沿ってコマンド＆用語を紹介しました。
CSS - !importantの挙動に関して

# はじめに
CSSを見ていると使われている`!important`の挙動について、前回詳細度についてまとめた際に`!important`も関わってくる部分ではありますので、まとめておきます。

前回の記事→[CSS適応の優先順位（詳細度）について](https://qiita.com/heppohepo/items/9ec333e3bdb38815e941)

今回も動作確認のためにこちらのサイトを使用します。→　[JS Bin](https://jsbin.com/)

## !importantについて
>`!important` ルールがスタイル宣言で使われたとき、それが宣言リストのどこであっても、この宣言は CSS 内で作られたその他の宣言を上書きします。

引用:[!importantの例外](https://developer.mozilla.org/ja/docs/Web/CSS/Specificity#!important_%E3%81%AE%E4%BE%8B%E5%A4%96)

つまり`!important`は最強ということですね。
ただ最強であるが故に使いどころは選んだ方がいいみたいです。
CSSリファレンスには`!important`を使用する前に詳細度を上げることを考えましょうと書かれています。
実際に使用する場面としては
・ページ固有の CSS が外部の CSS(ライブラリー等)を上書きする場合。
・詳細度の中では最強のインラインスタイルの上書きをする場合。
・高い詳細度のものを上書きする場合。
・ウェブアクセシビリティの確保。
などが挙げられるようです。

それでは実際に試してみます。

#### 1
![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632871/99ba7c18-6491-3471-e882-2abc5308464d.png)
詳細度は同じクラスセレクターを指定していますので、後に書いた方が適応されますが、`!important`が使用されていますので、先に書いた方が適応されています。

#### 2
![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632871/10585fd2-43eb-e2a7-88ec-9f1dc9cb3367.png)
親要素に`!important`を使用しても継承で上書きはされないようです。

#### 3
![test3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632871/fd6d7c09-cc66-678c-fd78-20c3d5e6b000.png)
`!important`でインラインスタイルのスタイルを上書き出来ています。


# まとめ
時々見かけていた`!important`ですが、用法用量を守って正しく使用することが大事だと思いました。
Google Colaboratoryでインデント幅を変更する

## Pythonのインデントとは？
Google Colaboratoryデフォルトのインデントは「2」になっています．
しかしPythonでは，[PEP8の規定](https://peps.python.org/pep-0008/#indentation)において「4」が通例となっているので，設定で変更しましょう．

## 変更方法
① 設定を右上の歯車アイコンから開きます
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313937373539352f32393662303935622d383039642d373031322d353833302d3435366635316262653336652e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977595/c3f1bc7c-8a86-5951-a143-ddb5c72fb6e7.png)

② `編集者`タブの`インデント幅(スペース)`を「4」にして，`保存`したら設定完了です．

![墨_スクリーンショット 2022-04-25 135107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977595/d5ef2e76-0d7c-db8d-96ca-89ddcdccce7d.png)
BigQueryで秒数を時分秒に変換する

# この記事はなに？
例えば、`3752`という秒数の整数値を持つカラムを、`1時間2分32秒`に変換するSQLの書き方を紹介した記事になります。

秒数に限らず応用できるので、ぜひご活用ください。

# 結論

秒数を表す`seconds`というカラムに、`3752`という値が入っているとします。

```sql
SELECT 
  seconds
FROM
  `project.dataset.table`
```

| seconds |
| :-- |
| 3752 |

これを`1時間2分32秒`に変換するには[MAKE_INTERVAL関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/interval_functions#make_interval)と[EXTRACT関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/interval_functions#extract)を使います。

```sql
SELECT 
  seconds,
  CONCAT(
    EXTRACT(HOUR FROM MAKE_INTERVAL(SECOND => seconds)), '時間', 
    EXTRACT(MINUTE FROM MAKE_INTERVAL(SECOND => seconds)), '分', 
    EXTRACT(SECOND FROM MAKE_INTERVAL(SECOND => seconds)), '秒'
  ) AS format_seconds
FROM 
  `project.dataset.table`
```

| seconds | format_seconds |
| :-- | :-- |
| 3752 | 1時間2分32秒 |

# 解説

[MAKE_INTERVAL関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/interval_functions#make_interval)は、年、月、日、時、分、秒を表す整数値を渡すと、INTERVALオブジェクトを返してくれます。
引数はすべて省略可能なので、今回は秒を表す整数値のみを渡すことにしました。

[EXTRACT関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/interval_functions#extract)は、INTERVALオブジェクトから、指定した日時形式の値のみを抽出してくれます。
今回は、`1時間2分32`の形式で出力したかったため、3つのEXTRACT関数の結果をCONCATで結合させています。


# おわりに

今回の記事を書くにあたり、INTERVAL関数の存在を初めて知りました。
60や3600で割って、愚直に計算するよりもスマートになっていいですね。
この記事が1人でも多くの人の役に立てば幸いです。
ここまで読んでくださりありがとうございました！
ProxmoxでHAの環境構築する際によく見る動画

https://youtu.be/n2hGOVIILEg

https://youtu.be/ItwQ5n3PTjQ

HAの環境構築するのに苦戦している
３台あるノードの1台を落として、VMのマイグレーションはできるが起動しない
ProxmoxでHAの環境を構築されておられる方、ご教授お願い致します
統計的推定と検定をPythonで解く「統計的仮説検定（2標本の平均の差の検定、対応のあるt検定」(2022.4.25)

# 背景
今回は[谷合(2018.10.5)、Pythonで理解する統計解析の基礎、技術評論社](https://gihyo.jp/book/2018/978-4-297-10049-0)を参考に対応のあるt検定についての記事を書きました。推定と検定を通して、結局は統計検定量をどのように算出するかの問題だと思っています。もう少し詳しく簡潔に表現できる様にしたいです。

前回の記事
[統計的推定と検定をPythonで解く「統計的仮説検定（1標本の平均の検定）」(2022.4.23)](https://qiita.com/tan0ry0shiny/items/7c74ba8151157f28127b)
# 問題
Aさんのクラスでは最近、筋トレをすると集中力が向上すると評判です。疑い深いＡさんは自身も筋トレを始める前伊、本当に筋トレに効果があるのか確かめてみる事にしました。そのため、まずＡさんは友達20人に1週間筋トレをしてもらい、その前後で集中力を測るテストを受けてもらいました。このデータからどのような検定を行えば、筋トレが集中力テストに有意な差を出すか確かめることができるでしょうか。

# 解答
## どういう問題か（問題の分類）
対応のある2標本の平均値の差の検定です。これは２つの対応のある標本(同じ母集団から抽出したと考えられる標本)が本当に同じ母集団から抽出されたかどうかを知りたいです。これを知るには２つの標本分布の差が正規分布に従うかどうかを見れば良さそうです。

# どのように解けるか（解法）
筋トレに集中力を向上させる効果があるかどうかは、筋トレ前と筋トレ後の集中力テストの平均点を比較すれば良さそうです。そのため、$\mu_{before}$を筋トレ前の集中力テストの平均点、$\mu_{after}$を筋トレ後の集中力テストの平均点として、次のような仮説検定を行う事を考えます。このような検定が平均値の差の検定です。

*帰無仮説：$\mu_{after}$-$\mu_{before}=0$
*対立仮説：$\mu_{after}$-$\mu_{before}≠0$
## どのように解けるか(Python)
まず、元となるデータをGitHubから取り込みます。これは「[『Pythonで理解する統計解析の基礎』のサポートページ](https://github.com/ghmagazine/python_stat_sample)」です。
```Python
!git clone https://github.com/ghmagazine/python_stat_sample.git
```
データを読み込みます。
```Python
import pandas as pd
training_rel = pd.read_csv('data/ch11_training_rel.csv')
print(training_rel.shape)
training_rel.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/0ed0c433-a63d-373a-1fd8-47611a90fc22.png)

今回はデータに対応があるため、個々のデータで差を考える事ができます。
```Python
training_rel['差'] = training_rel['後'] - training_rel['前']
training_rel.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/1c486eb4-cd90-aeb5-1778-ac3f353f070c.png)

もし筋トレが集中力テストに与える影響がないのであれば、その差はランダムにばらつき平均が0の分布となっているはずです。そのため、この仮説検定は差の平均を$\mu_{diff}$として

*帰無仮説：$\mu_{diff}=0$
*対立仮説：$\mu_{diff}≠0$
と言い換えることができます。
　さらに、その差がそれぞれ独立に同一の正規分布に従っていると仮定できると、この検定は母分散がわからない場合の正規分布の母平均の検定、すなわち1標本のt検定に帰着できます。
　ここまでわかれば、1標本のt検定はscipy.statsのttest_1samp関数で計算出来ます。
```Python
t, p = stats.ttest_1samp(training_rel['差'], 0)
p
```
p値が0.040となります。
p値が有意水準を下回ったため、「p = 0.040 ゆえ（有意水準 5%で）有意差はない」となり帰無仮説は棄却となりました。筋トレは集中力に有意な差をもたらすようです。

# どのように解けるか（解法）
筋トレをしたら､テストの点数が上がるかどうかを統計的に知りたいです｡筋トレに効果があったら､筋トレ前後でテストの点数が違うはずです｡つまり､筋トレ前後のテストの点数の確率分布が異なる事を統計的に求めたいです｡これは筋トレ前後のテストの点数の差がない､つまり､μ=0を棄却することで求めます｡
この時､自由度19に従うt分布の有意水準5%で帰無仮説が棄却されます｡この時の臨界値は$t=1.729$です。次にt値を求めます。
$$
t=\frac{\bar{X}-\mu}{\sqrt{s^2/n}}
$$
$$
t\fallingdotseq2.204
$$
t値が臨界値より大きい為、帰無仮説は棄却されます。手計算ではt値を求めて検定を行うことになりそうです。

# 参考
[谷合(2018.10.5)、Pythonで理解する統計解析の基礎、技術評論社](https://gihyo.jp/book/2018/978-4-297-10049-0)
# 感想
対応のあるt検定は平均の差を求める事で1標本の平均の検定になるという認識を持ちました。また、自分の理解のスピードが遅いのと、知識同士の繋がりを作るのが難しく、書けば書くほど遅く、雑になります。その辺をどうすれば良いかも考えて書き続けようと思います。
VRoidStudioで美少女になろう！　かんたんバ美肉のすすめ


近年、メタバースやVRの技術が急速に普及し、バーチャルキャラや配信者などを目にする機会も増えてきました。
PCを持っていれば誰でも真似できるのですが、機材や準備が高度なイメージがあり、ハードルの高さを感じる方も多いのではないでしょうか。
そんな方向けに、かんたんにできるバ美肉（バーチャル美少女受肉）の方法をざっくりご紹介します。
これであなたもバーチャル美少女！　もちろんイケメン男子にもなれます！

:::note info
もくじ
VRoidStudioでモデルをつくる
モデルをVRMで出力する
チャットやゲームで遊んで美少女生活！
:::

# １．VRoidStudioでモデルをつくる

まずは自分の分身（アバター）を作りましょう。
Win/Mac両対応の3Dキャラクター制作ソフト「VRoid Studio」をインストールします。
マニュアルや動画が充実しているので、インストール手順や操作方法は割愛します。

ソフトを開いて「新規作成」→ベースの体型（男女）を選択します。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149621/176e47a7-cca0-c41c-88fe-6b77adde0522.png)
するとこのような画面が出てきますので、画面左のプリセットから好みのパーツを選択していきます。
画面右でパラメータを操作して細かく調整したり、テクスチャを差し替えたりすることもできるので、作れるキャラクターの幅は無限大です。
プリセット以外にも、VRoidユーザーが無料or有料で顔や服のテクスチャを配布していることがありますので、着せ替えを楽しむこともできます。
理想の美男子・美少女を作りましょう。

# ２．モデルをVRMで出力する

ある程度完成したらVRM形式でエクスポートします。
VRMとはVR向けアバターのフォーマットのことで、これを他のアプリやゲームに読み込ませることで、自分の分身として使用できるようになります。

画面の右上にある矢印アイコンから「VRMエクスポート」をクリックします。
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149621/00f1e61c-8681-14b6-3d91-46a98e87e8f5.png)
するとVRMに組み込む情報入力画面が出てきますので、タイトル・作者名を入力し、
他の項目も必要に応じて記入した後「エクスポート」を押します。
エクスポートが完了したら、選択したフォルダにVRMファイルが書き出されているかと思います。
これでアバターの完成です。早速遊んでみましょう！

# ３．チャットやゲームで遊んで美少女生活！

VRMインポートに対応しているツールやゲームにVRMを読み込ませて、自分のアバターを使うことができます。
対応している主なツールをざっくりご紹介します。

#### チャット・会議
- VRChat（無料）
- TEATOR（ブラウザ・無料）
#### トラッキング・配信
- Kalidoface（ブラウザ・無料）
- Animaze by FaceRig（Win・有料）
- 3teneFREE（Win/Mac・無料）
#### ゲーム
- Valheim（Win/Linux・有料）
- クラフトピア（Win・有料）

などなど色々なツールがありますので、やりたいことに合わせて探してみるのも楽しいかもしれません。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149621/5d502bf6-93c9-22b7-a590-5acc3f6e2333.png)
↑このような感じで自分のアバターでゲームの世界に入れます（画面はクラフトピアのものです）

# まとめ

PCさえあれば、VRoidでかんたんに3Dアバターが作れます！
機能は制限されますがスマホ版アプリもあり、PCがない方でもモバイル端末で美少女に変身することもできます。

みなさんもVRoidでバーチャル美少女になりましょう！
vue cliにTailwind .cssを導入する

# vue cliにTailwind .cssを導入する
vue cliを使って農場の公式サイトを作ろうとしていたときに、デザインに凝りたいと思ったので、tailwindを導入して実装してみました。自分用のメモとしてここに残しておきます。

versionなどは以下の通りです。
```
@vue/cli 5.0.4
tailwindcss: ^3.0.24
```

# 目次
[1.Tailwindをインストールする](#1-Tailwindをインストールする)
[2.postcss.config.jsを設定する](#2-postcss.config.jsを設定する)
[3.tailwind.cssを設定する](#3-tailwind.cssを設定する)
[4.tailwind.config.jsを設定する](#4-tailwind.config.jsを設定する)
[5.立ち上げて確認](#5-立ち上げて確認)


## 1.Tailwindをインストールする
私はyarnでインストールしましたが、npmでもインストールできるので調べてみてください。
```
yarn  add tailwindcss --dev
```


## 2.postcss.config.jsを設定する
```
 touch postcss.config.js  
``` 

```JavaScript:postcss.config.js  
const tailwindcss = require('tailwindcss');
const autoprefixer = require('autoprefixer');

module.exports = {
    plugins: [
        tailwindcss,
        autoprefixer,
    ]
}
```

## 3.tailwind.cssを設定する
assets/css/tailwind.cssファイルを作る。
```css:
@tailwind base;
@tailwind components;
@tailwind utilities;
```
作ったファイルをmain.jsにインポートする。
```
import '@/assets/css/tailwind.css'
```
## 4.tailwind.config.jsを設定する
```
touch tailwind.config.js  
```

```JavaScript:tailwind.config.js  
module.exports = {
  content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
  darkMode: 'media',
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
}
```

## 5.立ち上げて確認
```
yarn serve
```
試しにtailwindで書いて、確認してください。
以上、シンプルですがよければ参考にしてください。
VScodeのDartFormatがコードを汚す件

## 概要
VScodeでのFlutter開発中にDartプラグインを使ってファーマット整形
↓
滅茶苦茶な改行コードの完成

## 解説
### Dart Formatが悪いのか？
何も考えずに「Dartプラグインをインストール」して、「.vscode/settings.jsonにDart設定を記述」したら、以下キャプチャのようなコードが目の前に現れて「えっ？」ってなりました。特に三項条件演算子周りの記述が読み辛くなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953297/01b0b20a-e8c1-9a81-31e6-175fff7f3a93.png)

### 原因
各所にカンマがついていないのでフォーマット結果が汚くなる様です。
- [Code Formatting](https://docs.flutter.dev/development/tools/formatting#using-trailing-commas)
- [Dart Format is weird in vscode](https://stackoverflow.com/questions/63185093/dart-format-is-weird-in-vscode)

## まとめ
フォーマットを整形したい気持ちが先行して、公式ドキュメント参照を忘れていたことが原因でした。
可読性を大切にするエンジニアでありたいです。
MacのVSCodeでC言語の環境構築する際に役に立ったサイト

https://jpdebug.com/p/151056

https://www.l08084.com/entry/2019/12/09/203814

https://www.sejuku.net/blog/24965

https://qiita.com/NakamoriSuganuma/items/065327042ad14c490be3

https://gabekore.org/vscode-c-mac

https://qiita.com/nishina555/items/e23d73067a5cac182a63
RustでHeroku Postgresに接続する方法

## 環境

```toml:Cargo.toml
tokio = { version = "1.17.0", features = ["full"] }
tokio-postgres = "0.7.5"
openssl = "0.10.38"
postgres-openssl = "0.5.0"
```

## 問題

https://docs.rs/tokio-postgres/latest/tokio_postgres/

tokio-postgresのDocumentを参考にプログラムを書くと、とりあえず以下のようになる。

```rust
use dotenv::dotenv;
use std::env;

async fn connect_to_database() -> Result<tokio_postgres::Client, Box<dyn std::error::Error>> {
    dotenv().ok();
    let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
    let (client, connection) = tokio_postgres::connect(&database_url, tokio_postgres::NoTls).await?;
    tokio::spawn(async move {
        if let Err(e) = connection.await {
            eprintln!("connection error: {}", e);
        }
    });
    Ok(client)
}
```

*(ここではdotenvについては触れない)*

ローカル環境のデータベースにならこれでも接続できるが、Herokuにデプロイして実行してみると以下のようなエラーが発生する。

```shell
Error: Error { kind: Tls, cause: Some(NoTlsError(())) }
```

どうやら、SSL/TLSの設定をしなければならないようだ。
おそらく`tokio_postgres::connect`の第2引数に指定すればいいのだが、一体何を指定すればいいのだろうか。

## 解決

いろいろ調べた結果、最終的に接続に成功することができた。

### 手順

1. `openssl`と`postgres-openssl`を追加する
1. Heroku上で実行する際にSSL証明書を作成するようにする
1. 以下のコードで接続ができる
```rust
use dotenv::dotenv;
use std::env;
use openssl::ssl::{SslConnector, SslMethod, SslVerifyMode};
use postgres_openssl::MakeTlsConnector;


async fn connect_to_database() -> Result<tokio_postgres::Client, Box<dyn std::error::Error>> {
    dotenv().ok();
    let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
    let mut builder =
        SslConnector::builder(SslMethod::tls()).expect("unable to create sslconnector builder");
    builder
        .set_ca_file("tmp/ca.crt")
        .expect("unable to load ca.cert");
    builder.set_verify(SslVerifyMode::NONE);
    let connector = MakeTlsConnector::new(builder.build());
    let (client, connection) = tokio_postgres::connect(&database_url, connector).await?;
    tokio::spawn(async move {
        if let Err(e) = connection.await {
            eprintln!("connection error: {}", e);
        }
    });
    Ok(client)
}
```

SSL証明書の作成は以下のコマンドで行なった。

```shell
openssl genrsa -out ./tmp/ca.key 2048 && openssl req -new -key ./tmp/ca.key -out ./tmp/ca.csr -subj '/C=JP/ST=Tokyo/L=Shibuya-ku/O=Oreore CA inc./OU=Oreore Gr./CN=Oreore CA' && openssl x509 -days 3650 -in ./tmp/ca.csr -req -signkey ./tmp/ca.key -out ./tmp/ca.crt
```

**(このコマンドはHeroku上で行う)**

#### 参考

https://rikuga.me/2017/12/24/oreore-ca-and-ssl-cert/

## おわりに

Rust、SSLの知識が何もない状態で見様見真似でやったのでもっと良い方法がきっとある。
【Windows】Bluetoothマウスの動き出しが遅い問題

# 事象
Bluetoothマウスを操作したときに、マウスを動かしてからポインタが動き出すまでにラグがかなりあるという事象に悩まされました。
毎回マウスをほんの少しの間操作していなかっただけで、次に触った時に動き出しに時間がかかります。

調べたところ、「電力の節約のために、コンピューターでこのデバイスの電源をオフにできるようにする」という設定をOFFにすればよいことが分かりましたが、その記事に書いてあった場所に「電力の節約のために〜」の設定するタブがなくて解決に時間がかかったので備忘録として残します。

# 対処方法

## 1. デバイスマネージャを開く
スタートボタンから「でばいす」と検索してデバイスマネージャを開きます。
![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/1b3a2b4d-dee6-953d-a3e3-df0b6cd96db7.png)

## 2. 「Bluetooth」の中から現在接続しているマウスを探す
自分はMX Master 3 for Macというマウスを利用しているので、それをBluetoothの中から探します。
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/9b7fc8cc-815c-3791-2c33-6eeb73567572.png)

## 3. 右クリックからプロパティを開く
![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/d7c7bdb6-8184-2491-43ff-55a668c94abd.png)
![スクリーンショット (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/bce63f85-5120-e869-92eb-6daa09572576.png)

## 4. 赤枠部分に「電源の管理」タブがあるか確認する
赤枠部分に「電源の管理」タブが
- ない場合 → 5.へ
- ある場合 → 7.へ

自分はここに「電源の管理」タブがなくて困りました。
![スクリーンショット (11)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/cbe8120e-ba91-2beb-dc87-946e0e17b5b4.jpeg)

## 5. 「表示」タブからデバイス（接続別）を選択する
プロパティを閉じ、「表示」タブから「デバイス（接続別）」を選択します。
このとき**接続しているマウスを選択した状態**で「デバイス（接続別）」を選択してください。
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/87634255-5e91-757e-22b4-77e6057b0787.png)

## 6. 接続しているマウスがぶら下がっているデバイスを探してプロパティを開く
自分の環境では「USB ルート ハブ (USB 3.0)」でしたが、環境によって違うと思います。
最悪、接続しているマウスがぶら下がっている元を全部開いてみて「電源の管理」タブがあるものを探せば良いと思います。
![スクリーンショット (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/f450cdf6-4711-3c5a-27a9-59b937253e3c.png)

## 7. 「電力の節約のために〜」のチェックボックスをのチェックをはずす
「電力の節約のために〜」のチェックを**外します**。
このチェックを外しておくことでPCが勝手にマウスの電源を切ることを防ぎ、毎回の動き出しに時間がかかる現象をなくすことができます。
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/64119fbc-3858-9fd0-7e5e-e6e31cf40657.png)
【総括】1年間、1日1話を毎日読んで書いた感想

## 前書き

ちょうど1年前に始めた修行。
致知出版社[『1日1話、読めば心が熱くなる365人の仕事の教科書』][1]を毎日1ページづつ読んで、その感想文を書く。
本日でその修行を修了したので、修行の締めくくりとして感想を書くことにした。
日々の感想文についてはQiitaでもその一部を紹介してきたが、このテーマも本日で最後である。

[1]:https://www.amazon.co.jp/1%E6%97%A51%E8%A9%B1%E3%80%81%E8%AA%AD%E3%82%81%E3%81%B0%E5%BF%83%E3%81%8C%E7%86%B1%E3%81%8F%E3%81%AA%E3%82%8B365%E4%BA%BA%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E8%97%A4%E5%B0%BE%E7%A7%80%E6%98%AD/dp/4800912474

## 本題　1年間の修行を終えて。

### -今の率直な気持ち
　2021年4月26日に始めた、本の記事を1日1話1ページずつ読んでその感想を書く修行。
　本日をもって【12月31日】まで無事に完走した。
　今の率直な気持ちは、完走したという達成感と安堵感、そして、明日からはもう出来ないのかという喪失感の３つの気持ちが入り混じっている。

### -修行を始めたきっかけ

　思えば一年前、本屋でこの本を見かけた時に直感で今の修行を思いついた。
　修行というのは言い過ぎかもしれないが、毎日続けて「読む・学ぶ・書く」を続けようと思ったわけだ。

　当時はコロナ禍ではじまったリモートワークも1年が過ぎ、リモートワークにおけるライティングスキルやアウトプットスキルの重要さを感じていた。
　ちょうどその頃この本に出逢い、これからの新しい働き方において、コミュニケーションのネタにもなるだろうと考えて思いったった訳である。

### -一年間続けてみて

　一年間毎日続けてみて（途中何度かまとめて書いたことはあったけれども）一番印象に残ったことは、やはり、この本の魅力であった。
　毎日、毎日、著名な先人たちによるコトバはどれも魅力的であった。
　既に自分が知っている方も居れば、この本で初めて知った方も居た訳だが、どの方のコトバも、私は先人たちのコトバに魅了されていたと思う。
　1ページという読みやすい分量の記事も毎日読み進めるには負担は少ない。むしろ物足りないくらいだった。

　私は記事を読んだ後に、その方のことをネットで調べ、その方の経歴や活躍などを学ぶようにした。
　そうすると、更にその人の魅力が分かり、記事にかかれている背景についても深く知ることができた。
　だから修行といっても全然苦にならず、毎日飽きもなく続けられたと思う。
　
　私の人生の中で初めてではないだろうか。一年間継続して土日も休まず何かを続けたということは。
　この感想文は私の毎日の日課になっていた。
　平日は朝のルーティンワークの一環として、土日も平日と同じように決まった時間に、朝書くようにしていた。
　途中、何かしらの用事で書けない日があったが、そういう時はその日の午後に書いたり、別の日にまとめて書いたりした。
　
　おかげで、一年間規則正しい生活が送れ、無病息災で過ごすことが出来た。
　自身の人生観や家族との日々の話題にも潤いが出た。
　ライティングスキルやアウトプットスキルも少しは向上したという実感はあるが、自分が一番に得られたと思えるのは、この本に出逢えたということに尽きる。
　あらためて 致知出版社には感謝したいと思う。
　そして、この記事を読んで少しでも興味を持っていただいた方には自信を持って推薦したい本である。

### -おわりに
　明日からはこの日課の修行は無くなるが、しばらくは冒頭に述べた達成感と安堵感、そして喪失感を噛み締めながら、次は別の修行をやってみようと思う。
　この修行が終わったらやろうと決めていた英語で日記を書いてみる修行だ。

　一日一話の修行はまたいつか本屋でネタと出会ったらやってみたい。
　致知出版社さんは、この本の続編の一日一話シリーズも出されているし、他にもいろいろな偉人さんの一日一話シリーズを出版されているのでネタには困らないのである。


（参考）

https://online.chichi.co.jp/item/1247.html

https://online.chichi.co.jp/item/1261.html

https://online.chichi.co.jp/category/BOOK10/
UnityでHMSのAnalytics Kitを使用する方法

Unityのオフィシャルドキュメントにしたがって、HMSのAnalytics Kitを実装しましたが、うまくいきませんでした。

<b>Analytics Kit (HMS)</b>
https://docs.unity.cn/cn/Packages-cn/com.unity.huaweiservice@2.3/manual/analyticskit.html

```
2022/04/06 11:40:52.159 3747 3747 Error HiAnalyticsSDK createInstance=> Stop report! Instance init failed: _openness_config_tag
2022/04/06 11:40:52.159 3747 3747 Error HiAnalyticsSDK createInstance=> Stop report! Instance init failed: _openness_config_tag
2022/04/06 11:40:52.159 3747 3747 Error HiAnalyticsSDK createInstance=> Stop report! Instance init failed: AGC_TAG
```

どうやらagconnect-services.jsonが正しく読み込まれていないようです。

# 解決策
UnityがGithubで提供している[AfterBuildToDo.cs](https://github.com/Unity-Technologies/HuaweiServiceSample/blob/master/Assets/HuaweiService/Editor/AfterBuildToDo.cs)をプロジェクトのAssets/Editor/に置けばよいです。
（Unityのオフィシャルドキュメントにこれの記載が漏れています！！）
はじめてのGitとpush

　あくまで独学でプログラミングを学んでいる限り、Gitはなかなかご縁がありません。一方で、何かとGitやGitHubの存在は目にする機会も多いので、いずれは使うことになるのだろうということもわかります。

　実は、複数のパソコンでいろいろ作業をしていることもあり、勉強するための端末がその時間が取れたときでまちまちという点に悩んでいました。なので、ひとりGitで学習の進捗に合わせて写経したプログラムを共有できたらなあとは思っていたので、『ゼロから作るDeep Learning』を勉強し始めたのに合わせてGitも使ってみようと決断したわけです。

　まあ、この用途からすればGoogle DriveでもOneDriveでもDropboxでもBOXでも、ファイル共有ができれば十分ではあります。が、どうせ触ってみたかったので、生意気にもGitでやろうと。生意気にも。

　Git、GitHubについては、オンラインのコンテンツで勉強できないかなといろいろ見てきましたが、どうもきちんと学べる感じがしませんでした。途中まではできても、pushのところがうまくできなくてリモートリポジトリが作れなかったり、branchのところをあまり学べないままにpushすることになってしまったりして、うまく行きそうな感じがしない。

　書籍については、ちょっと前のタイトルになってしまうと「仕様が変わってしまっていて、●ページから先に進めない」といったレビューも見かけたので、確かに難しいんだろうなあと。特にGitHubについては、わかっている人には問題なく付いていける仕様変更も、これから学ぶビギナーにとってはテキストと相違があるのはアジャストしにくい。なかなか書籍で対応するのが難しい分野でもあります。でも、[『いちばんやさしいGit＆GitHubの教本』の第2版](https://honto.jp/netstore/pd-book_31458844.html)がちょうど3月に出たところなので、いいタイミングかなと思いました。

　GitHubのアカウント自体は持っていたので、
- Gitをあらためてインストールし、
- ローカルリポジトリを作って
- ステージングエリアにファイルとディレクトリを登録して
- ファイルの差分を確認して
- ファイル（とディレクトリ）をコミットする
というところまで、本を見ながらやってみました。リポジトリの中身は自分が共有したいファイルとディレクトリも含めてなので、本の通りではありませんが。

　ちょっと戸惑ったところもありました。この書籍に従うと、いったんローカルのリポジトリを作ってコミットするところまではやりますが（Chapter3まで）、その次はサンプルとして用意されているリモートリポジトリをforkしてあれこれするという内容になっています（chapter4～7）。なので、自分の手元のファイルをpushしたかったんですが、それがストレートにできる構成にはなっていなかったのが、戸惑った原因かな。

　ただ、GitHubの準備のところではSSH Keyの生成（ローカルでやる）や、GitHubへの登録について説明されていたので、実はやりたかったことのために必要なことは済むように構成されていました。あとはGitHub上でリポジトリを作ってみればまっさらのリポジトリのページに「
~~~
git remote add origin git@github.com:makostagram/********.git
git branch -M main
git push -u origin main
~~~
って入力するんだよ」とご親切に書いてあったので、無事にリモートにpushすることができました。はじめてうまくいったよ……。

　今まで、なぜか`git branch -M main`をちゃんと解説してくれているドキュメントに行き当たれなかったので、これをやらずにpushばかりしてたんだということが、うまくできて初めてわかりました。何だろう、読解力が低いのかなー。

　でも、1行目と3行目はただただそのまま打ち込んだだけですけどね。まあ、日本語に訳すと
~~~
リモートリポジトリにoriginを追加するよ。追加先はgit@mako...../.......gitね
mainっていうbranchを-Mする（作る）よ
originをmainブランチとしてpushするよ
~~~
ということかなあと理解しましたが…。このあたりの位置付けとオプションの意味は、これから勉強します（汗。

　まだまだ穴だらけではありますが、これで写経も複数のパソコンで継続的にできるようになりました。さて、いろいろやってみるぞー。
Bronze DBA 第10章 -1まとめ

# 勉強ポイント1
oracleには「ADDM」という名前の自己診断エンジンがある。

# 自己診断とは？
* データベースのパフォーマンス状態
→パフォーマンスとは遅いか？速いか？速度的なところ。
→速度基準は「メトリック」を使用している
* 診断前に事前に「スナップショット」を取得している
# メトリックとは？
「すでに定義されている特定のシステム属性の統計セット」
さらに分かるように噛み砕くと、「目標に到達するためにどれだけ苦労するかの数値」
※参考リンクではさらに分かりやすく図解している。

# 勉強ポイント2
EM Express(Enterprise Manager Database Express)というツールを使って、データベースの状態やワークロードを監視できる。

EM画面で開いたときの配置イメージ↓
```
ステータス　　　　パフォーマンス　
　　　　　　　　　　　　　　　　　　　　リソース
　　　　　　　　　　　　　　　　　　　　SQL監視
```


| セクション | 表示内容 |
|:--|:--|
| ステータス  | データベースの状態の概要  |
|  パフォーマンス | アクティブセッション情報  |
|  リソース | 過去1年分のリソースの使用率  |
|  SQL監視 |  SQLのアクティビティ(CPUまたはI/O時間を5秒以上の消費が監視対象となる) |

# ワークロードとは？
CPU使用率や、CPU効率のこと。



# 参考リンク
https://wa3.i-3-i.info/word12366.html

https://www.otsuka-shokai.co.jp/words/workload.html
UIDについて

## 環境
Ubuntu20.4

## 記事
ログインしている自分のユーザー名とユーザーID（UID）は次のようにして調べることができます。
```
$whoami
$id [ユーザー名]
```

登録されているユーザーの一覧は次のようにして調べることができます。先頭１列目がユーザー名で、２列目のxはパスワードなのだが、xとしか表示されません。３行目がUIDです。因みに、パスワードは/etc/passwdでは管理しておらず、/etc/shadowで暗号化して管理しています。
```
$cat /etc/passwd
```

上記のコマンドだけでの表示では、随分と見づらいため、ユーザー名とUIDだけ、awkで抜き出して表示すると分かりやすく表示することができます。
```
$cat /etc/passwd | awk -F ':' '{print $3 " " $1}' | sort -n
```

さらにもう少し見やすくしてみます。ユーザー名は左寄せのままで、UIDを右寄せして表示します。表示を整形する場合は、printの代わりにprintfを利用します。
```
$cat /etc/passwd | awk -F ':' '{printf "%4s" " " "%-20s\n", $3, $1}'| srot -n
```

ユーザー一覧をみると、一般ユーザーのUIDは1000から連番で作成されていることがわかります。UIDの0～999はシステムで予約されている番号となります。ほほほぼ固定されたUIDがシステムから割り当てられます。一般ユーザーに割り当てられるUIDの範囲は、/etc/login.defsで定義されています。/etc/login.defsで設定されている、UID_MIN、UID_MAXの値が、UIDの範囲となります。
```
$cat /etc/login.defs | grep UID
```

自分の環境では、デフォルトで次のように設定されています。UID_MINの値を変更すれば、割り当てられるUIDを変更することができます。しかし、あまり触ることはないでしょう。
```
UID_MIN                  1000
UID_MAX                 60000
```
OSS-DB 資格取得を目指して

## バックアップリストア
ディレクトリーによるバックアップ
ファイルやOSをコピーするための標準的なコマンドを使用する、リストア方法はコピーしたディレクトリ、ファイルを元の位置に戻すだけ
## 論理バックアップ
Postgresqlサーバが稼働した状態で実施する。論理バックアップは、ディレクトリーによるバックアップと異なり、CPUアーキテクチャやOSが異なる環境にリストアできる。

スクリプト形式　psqlコマンド
バイナリ形式　　pg_restoreコマンド

論理バックアップには設定ファイルが含まれない、postgresql.confファイルやpg_hba.confファイルなどは別途コピーが必要。

SQLのコピーコマンドは、テーブルとファイルの間で、データをコピーする際に用いる。
COPY テーブル名　TO {'ファイル名' | stdout};

## PIIR(Point-In-Time-Recovery) 障害発生時の直前を含む任意の時点に復旧するためのリカバリー手法。PIIRによるバックアップはデータベースクラスタディレクトリと、WALログをコピーすることで行う。WALログはトランザクションログと呼ばれる。

データベースクラスタディレクトリもコピーをベースバックアップ
WALログのコピーをアーカイブログと呼ぶ。
Herokuへのデプロイがfatal: the remote end hung up unexpectedlyで失敗した件

いつも通りRailsアプリをHerokuにデプロイしようとすると、以下のようなエラーが出た。

```
>> git push heroku master
Enumerating objects: 67, done.
Counting objects: 100% (67/67), done.
Delta compression using up to 16 threads
Compressing objects: 100% (50/50), done.
Writing objects: 100% (54/54), 23.86 MiB | 311.00 KiB/s, done.
Total 54 (delta 17), reused 22 (delta 4), pack-reused 0
error: RPC failed; HTTP 504 curl 22 The requested URL returned error: 504
send-pack: unexpected disconnect while reading sideband packet
fatal: the remote end hung up unexpectedly
Everything up-to-date
```

Writtingにやたら時間がかかるし、なんかゴミファイルが溜まっているのかな？
`fatal: the remote end hung up unexpectedly`というエラーなのでネットワーク関連の問題かと思ったが、最近ネットワークの設定を変更した心当たりもない。
`Everything up-to-date`という紛らわしい文字があるのでデプロイ出来てそうな気もするが、サイトには反映されていない。

Heroku gitからのデプロイなので公式ドキュメントをあたってみると、

:::note alert
Heroku アプリの Git リポジトリは、デプロイのみを目的にしています。このリポジトリからの複製は機能として正式にはサポートされておらず、最後の手段としてだけ試行する必要があります。このリポジトリをアプリの正規の “オリジン” リポジトリとして使用しないでください​。代わりに独自の Git サーバー、または GitHub などのバージョン管理サービスを使用してください。
:::

ということで、どうせバージョン管理としての機能はロールバック目的くらいにしか使われないので、個人アプリ程度なら一旦今までのデプロイ履歴など消えてもいいからリセットしてみようかな、と。

Herokuの場合はheroku-repooという専用の拡張機能からリポジトリのリセットができる。
https://devcenter.heroku.com/ja/articles/git#reset-a-git-repository

```
heroku plugins:install heroku-repo
heroku repo:reset --app アプリの名前
```

```
Resetting Git repository for ⬢ アプリの名前... done
```

一瞬でできた。
何事もなかったかのようにデプロイに成功した。
個人開発して2年くらいになるけど、なんかあんまりよくわかってないなぁ。
Prism コードサンプル学習：22-ConfirmCancelNavigation

# Prism コードサンプル学習：22-ConfirmCancelNavigation

## はじめに

以下の記事の続きです。
<https://qiita.com/mngreen/items/5493d8c16245e2fc36e4>

## 22-ConfirmCancelNavigation

本サンプルは、他ビューへの遷移する前に本当に移動するかを確認するダイアログを表示するサンプルになります。
他ビューへ遷移する前に確認したいビューのVMにIConfirmNavigationRequestインターフェイスを実現し、ConfirmNavigationRequestメソッドを以下のサンプルコードの通り実装することでビューの遷移をキャンセルできます。
以下のサンプルの場合、引数のcontinuationCallbackにbool値を渡すことでビューの遷移がキャンセルできています。

```cs
...

namespace ModuleA.ViewModels
{
    public class ViewAViewModel : BindableBase, IConfirmNavigationRequest
    {
        ...

        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {
            bool result = true;
            if (MessageBox.Show("Do you to navigate?", "Navigate?", MessageBoxButton.YesNo) == MessageBoxResult.No)
                result = false;
            continuationCallback(result);
        }

        ...
    }
}
```

今回のサンプルでは、continuationCallbackにbool値を渡すことでビュー遷移をキャンセルしていますが、そのアクションにどういった処理が渡されているか分からないため、その部分を読み進めようと思います。
利用箇所を探すと[RegionNavigationService. RequestCanNavigateFromOnCurrentlyActiveView](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/RegionNavigationService.cs#L146)メソッドと[RegionNavigationService.RequestCanNavigateFromOnCurrentlyActiveViewModel](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/RegionNavigationService.cs#L191)メソッドで利用されていることが分かりました。
アクティブなビューすべてに問い合わせ終わるまで繰り返し、最終的には[ExecuteNavigation](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/RegionNavigationService.cs#L175)メソッドが呼び出されることでビューが遷移する仕組みのようです。もし、キャンセルされた場合は呼び出しがreturnされ、この処理が呼び出されません。
ちなみに呼び出しの入口は[DoNavigate](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/RegionNavigationService.cs#L116)メソッドとなっていそうです。
呼び出しを整理すると以下の順になると思われます。
RequestNavigate -> DoNavigate -> RequestCanNavigateFromOnCurrentlyActiveView -> RequestCanNavigateFromOnCurrentlyActiveViewModel -> RequestCanNavigateFromOnCurrentlyActiveView -> RequestCanNavigateFromOnCurrentlyActiveViewModel -> ...

## おわりに

今回は、IConfirmNavigationRequest.ConfirmNavigationRequestメソッドを実現し、ビュー遷移をキャンセルするサンプルを見ていきました。
この機能を活用すれば、編集中のビューから別ビューに遷移しようとしたときにユーザーの通知できそうです。
いまいちこれまでのサンプルではすべてのアクティブなビューに問い合わせる処理の意味合いがわからなかったのですが、今回は腹落ちしました。
次回、[23-RegionMemberLifetime](https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/23-RegionMemberLifetime)について見ていこうと思います。
LaravelとHubspotをAPI連携してみる

こんにちは、名古屋のスタートアップでエンジニアしているfujitaです。
今回は、LaravelとHubspotをAPIで連携する方法について解説します。

## Hubspotとは？
Hubspotとは、マーケティングをはじめとした、顧客管理が簡単に行えるツールです。
Hubspotには、さまざまな機能があり、営業やマーケティングなどに役立つツールです。機能についてはHubspotの公式ページをご覧ください。
[Hubspot公式](https://www.hubspot.jp/)


## 今回の実施すること

今回は、Laravel側で新規会員登録をしたら、HubspotのAPIを使って、Hubspotのコンタクトを作成したいと思います。Hubspotのコンタクトとは、お客さんの情報のことです。

![スクリーンショット 2022-04-25 10.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628086/d2a36cb4-8867-1e1a-fe86-6e79c9e934a8.png)

では、手順について解説します。
### 手順1 HubspotのAPIキーの取得
まず初めにHubspotのAPIキーの取得です。APIキーは、Hubspotの管理画面から「設定」→「連携」
→「APIキー」から発行することができます。
![スクリーンショット 2022-04-25 11.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628086/bdb0ca21-ab68-0396-d5a1-9fb6696a3c99.png)
有効なAPIキーの「表示」をクリックするとAPIを見ることができます。
![スクリーンショット 2022-04-25 11.04.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628086/f003d47e-5ec7-5b1e-ae04-248e3b45044a.png)

### 手順２　Laravelの.envに記載
先ほど取得したAPIキーをLaravelの.envに記載します。
``` .env
HUBSPOT_API_KEY=xxxxxxxxxxx-xxxxxx-xxxxx
```

### モジュールのインストール
Hubspotとの連携は便利なモジュールがあるのでインストールしておきます。
``` bash
composer require hubspot/api-client
```


### Laravel側でAPIを叩く処理を実装する
ここからはLaravel側の実装になります。APIを叩く処理だけ記載したいと思います。

``` CreateContact.php
//APIキーの取得
$apiKey = env('HUBSPOT_API_KEY')
$hubSpot = \HubSpot\Factory::createWithApiKey($apiKey);

$contactInput = new \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectInput();

//ユーザー情報
$contactInput->setProperties([
    'email' => 'example@example.com'
]);

//APIを叩く
$contact = $hubSpot->crm()->contacts()->basicApi()->create($contactInput);

```
実際の実装からは、かなり省略している部分があるのでご了承ください。実際には、HubspotのAPIを叩く処理はJobにしており、Controllerからユーザー情報を受け取り、非同期でHubspotにコンタクトを作成しております。
GitHubやドキュメントに詳しく記載されているので、詳細を知りたい方はこちらをご覧ください。
・[hubspot-api-php](https://github.com/HubSpot/hubspot-api-php)
・[HubSpot APIドキュメント](https://developers.hubspot.jp/docs/api/overview)


## 最後に
LaravelとHubspotの連携について書きました。

弊社では、一緒に働いてくれるエンジニアを募集しています。
↓最新技術や自社開発に興味のある方はこちらから↓
[Wantedly - スタジオアンビルト株式会社](https://www.wantedly.com/companies/studiounbuilt)

こんなWebサービスを作っています。
・[マドリー](https://madree.jp/)
・[Studio Unbuilt](https://www.studiounbuilt.com/)
音声wavファイルを入力してtxtで出力するツールを作った

## 入力文章(音声化前のテキスト)

    私はその人を常に先生と呼んでいた。
    だからここでもただ先生と書くだけで本名は打ち明けない。
    これは世間をはばかる遠慮というよりも、その方が私にとって自然だからである。
    私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。
    筆をとっても心持は同じ事である。
    よそよそしい頭文字などはとても使う気にならない。
    私が先生と知り合いになったのは鎌倉である。
    その時私はまだ若々しい書生であった。
    暑中休暇を利用して海水浴に行った友達からぜひ来いというはがきを受け取ったので、私は多少の金を工面して、出掛ける事にした。
    私は金の工面に二、三日を費やした。
    ところが私が鎌倉に着いて三日と経たないうちに、私を呼び寄せた友達は、急に国元から帰れという電報を受け取った。
    電報には母が病気だからと断ってあったけれども友達はそれを信じなかった。
    友達はかねてから国元にいる親たちに勧まない結婚を強いられていた。
    彼は現代の習慣からいうと結婚するにはあまり年が若過ぎた。
    それに肝心の当人が気に入らなかった。
    それで夏休みに当然帰るべきところを、わざと避けて東京の近くで遊んでいたのである。
    彼は電報を私に見せてどうしようと相談をした。
    私にはどうしていいか分らなかった。
    けれども実際彼の母が病気であるとすれば彼はもとより帰るべきはずであった。
    それで彼はとうとう帰る事になった。
    せっかく来た私は一人取り残された。

## 出力文章

    私はその人を常に先生と呼んでいた。
    だからここでもただ先生と書くだけで本名は打ち明けない。
    これは世間をはばかる遠慮というよりもその方が私にとって自然だからである。
    私はその人の記憶を呼び起こす音にすぐ先生と言いたくなる筆をとっても心持ちは同じことである。
    よそよそしい頭文字などはとても使う気にならない。
    私が先生と知り合いになったのは鎌倉である。
    その時私はまだ若々しい女性であった。
    暑中休暇を利用して海水浴に行った。
    友達から是非恋というはがきを受け取ったので私は多少の金を工面して出かけることにした。
    私は金の工面にに3日を費やした。
    ところが私が鎌倉について3日と経たない。
    うちに私を呼び寄せた。
    友達は牛肉に元から帰れという電報を受け取った。
    連邦には母が病気だからと断ってあったけれども友達はそれを信じなかった。
    友達はかねてから国本にいる親たちに進まない結婚を強いられていた。
    彼は現代の習慣から言うと結婚するにはあまり年が若すぎた。
    それに肝心の当人が気に入らなかった。
    それで夏休みに当然帰るべきところをわざと避けて東京の近くで遊んでいたのである。
    彼は電報を私に見せてどうしようと相談をした。
    私にはどうしていいかわからなかったけれども実際彼の母が病気であるとすれば彼はもとより帰るべきはずであった。
    それで彼はとうとう帰ることになった。
    せっかく来た。
    私は一人取り残された。

## ソース

https://github.com/botanic7arc/transcription/blob/main/src/transcription.py

### 説明

音声->テキスト化はライブラリの出力そのままのため、ライブラリの精度に依存しています。
文章の区切れについては、プログラム内で文章の区切れ前後に存在する品詞から判断するようにしています。
ただ少ないサンプルにおいて人手で品詞を設定しているため、精度はまあまあレベルだと思います。
主語述語検出等の情報を使用すれば、精度は向上するかと思います。

人手で全て書き起こす場合と、このプログラムを使って修正を行う場合を比較すると、プログラムを使って修正するほうが楽だと思います。

## 使用したライブラリ等

### SpeechRecognition

音声認識ライブラリです。
[1度のリクエストが10MB近くになるとBad requestになるらしい](https://qiita.com/tset-tset-tset/items/cc36ccc8368f4ef1de1a)ため、長い音声ファイルを使用する場合、[pydub](https://algorithm.joho.info/programming/python/pydub-split-on-silence/)等でファイルを分割する必要があるかと思います。

### MeCab

形態素解析ライブラリです。本プログラムではChaSen互換で単語単位に分割し、品詞情報から文の区切りを判断しています。

### VOICEVOX(読み上げソフトウェア)

フリーのwavファイルでよさそうなものが見つからなかったため、VOICEVOX:四国めたん を使用して音声ファイルを作成しました。
機械に文字から音声を作ってもらい、機械に音声を認識させて文字に書き起こしているためマッチポンプ感があります。

## 参考文献

- [夏目漱石 こころ](https://www.aozora.gr.jp/cards/000148/files/773_14560.html)
- [DockerでPython実行環境を作ってみる - Qiita](https://qiita.com/jhorikawa_err/items/fb9c03c0982c29c5b6d5)
- [Docker コンテナ内に一般ユーザーを作成する](https://zukucode.com/2019/06/docker-user.html)
- [GitHub - Uberi/speech_recognition: Speech recognition module for Python, supporting several engines and APIs, online and offline.](https://github.com/Uberi/speech_recognition)
- [【Python入門】日本語の文字起こしのやり方（音声認識：音声ファイル編）サンプルコード | 子供プログラマー](https://child-programmer.com/python-speech-recognition-japanese/)
- [MecabをPythonで使うまで - Qiita](https://qiita.com/Sak1361/items/47e9ec464ccc770cd65c)
- [fedora30 python3 から MeCabを使う → エラー「 [ifs] no such file or directory: /usr/local/etc/mecabrc」が出たら sudo cp /etc/mecabrc /usr/local/etc/ で解決 - min117の日記](https://min117.hatenablog.com/entry/2020/07/11/145738)
- [VOICEVOX | 無料で使える中品質なテキスト読み上げソフトウェア](https://voicevox.hiroshiba.jp/)
error: the requested upstream branch 'リモート場所名/リモートブランチ名' does not exist

~~~
error: the requested upstream branch 'origin/kame' does not exist
~~~
リモートブランチとしてorigin/kameは間違いなくあるのにエラー発生

> <img width="476" alt="スクリーンショット 2022-04-25 11 28 04" src="https://user-images.githubusercontent.com/79749395/165010835-0a3fcc30-999c-40a5-96ee-adc3d28a32bc.png">

> 参考までに↓
> ~~~
> error: the requested upstream branch 'リモートの場所名/リモートブランチ名' does not exist
> ~~~
> 大体↓みたいに表示される
> ~~~
> error: the requested upstream branch 'origin/リモートブランチ名' does not exist
> ~~~
↓今回の場合だとこんな感じで表示された
~~~
error: the requested upstream branch 'origin/kame' does not exist
hint: 
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint: 
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: "git push -u" to set the upstream config as you push.
~~~
翻訳すると
~~~
error: 要求された上流ブランチ 'origin/kame' が存在しません。
のヒントがあります。
hint: リモート側に既に存在する上流ブランチをもとに作業を進めようと思っている場合。
hint: リモート側に既に存在するブランチをベースにする場合、以下の作業が必要になります。
hint: それを取得するために "git fetch" を実行します。
hint 
hint: 新しいローカルブランチをプッシュしようと考えている場合。
hint: がリモートのブランチを追跡する場合、次のようにします。
hint: "git push -u" を使ってプッシュ時に上流側の設定を行います。
~~~
## 原因
ローカルでリモートブランチのorigin/kameが見つからないよって言われてる

## 結論　
リモート（オンライン上）のリポジトリの最新状態をもらおう
ってことでfetch([git fetchとは？](https://git.command-ref.com/cmd-git-fetch.html))
~~~
git fetch
~~~
これで

> <img width="365" alt="スクリーンショット 2022-04-25 11 28 27" src="https://user-images.githubusercontent.com/79749395/165010842-4f0f4db2-2b8d-49b8-82f1-5dc644fef553.png">

ローカルでorigin/kameが認識されたので解決