OmniAICreator/Qiita-1.07M huggingface dataset:
歌唱DBからブレスを取り出したい！

# 作ったもの
[**breath-picekr**](https://github.com/oatsu-gh/breath_picker)（GitHubリポジトリにリンクしています。）

# 目的
ブレスをDAWで張り付けたいなーと思った。
*※東北きりたんの歌唱DBの場合、音声を直接素材とすることは研究用途ではないため、規約違反の可能性が高いです。*

本当の所は、Pythonでの音声ファイル処理を練習したかっただけです。これは本心です。
切り出したファイルを直接使うのは控えた方が良いです。

# 開発環境
- Windows 10 Education 2004
- Python 3.8.3

## 使ったライブラリ
- pydub（wavファイルの切断に使った）
- [utaupy](https://github.com/oatsu-gh/utaupy/)（labファイルの読み取りに使った）

# 動作チェックに使った歌唱データベース
- 歌唱データベース
  - [東北きりたん歌唱データベース](https://zunko.jp/kiridev/login.php)
  - [夏目悠李/男声歌声データベース](https://amanokei.hatenablog.com/entry/2020/04/30/230003)（DB制作：アマノケイ、音声提供者：霧野蒼太）
  - [おふとんP歌声データベース](https://sites.google.com/view/oftn-utagoedb/%E3%83%9B%E3%83%BC%E3%83%A0)（DB制作：おふとんP）
- モノフォンラベル
  - 東北きりたん歌唱データベース は自前で加工（s→100ns の換算）
  - 夏目悠李/男声歌声データベース は自前で加工（s→100ns の換算）
  - おふとんP歌声データベース はそのまま使用
  - 東北きりたん歌唱データベース は加工済みのものも使用。（https://github.com/r9y9/kiritan_singing_extra）

# 感想
Pydubとっても簡単！
他にも標準ライブラリのwaveとかPyAudioFileとかSciPyとかあるけれど一長一短なんだろうか。
PyAudioFileが使いやすそうだけどファイルを切断とかのやり方がわからんかった。
あと、きりたんのラベルの種類によってブレスの回数が違ったのはどうしてだろう。どう編集したのか調べてみようと思う。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">東北きりたん歌唱データベースのブレス一括切り出ししてみた <a href="https://t.co/NQ1hKPxWhU">pic.twitter.com/NQ1hKPxWhU</a></p>&mdash; くれいじー@開発垢 (@oatsu_c) <a href="https://twitter.com/oatsu_c/status/1273320160720375808?ref_src=twsrc%5Etfw">June 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>↑ これは [r9y9](https://github.com/r9y9) さんによって加工済みのラベルを使った場合。201箇所。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">やっぱりきりたん増えたわ<br>1354<br><br>母音と桁以外も結構編集したのかな <a href="https://t.co/vZD4Hz9iJ2">pic.twitter.com/vZD4Hz9iJ2</a></p>&mdash; くれいじー@開発垢 (@oatsu_c) <a href="https://twitter.com/oatsu_c/status/1273334687545479169?ref_src=twsrc%5Etfw">June 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>↑ こっちは単位換算だけしたラベルを使った場合。1354箇所。

# 参考にしたサイト
- メイン（Pydubのサンプルコードがある記事 ）
  - https://algorithm.joho.info/programming/python/pydub-split/
- サブ（ほかのライブラリを使ってる記事）
  - https://qiita.com/niisan-tokyo/items/d25dada3fa9903862260
  - https://qiita.com/Dsuke-K/items/2ad4945a81644db1e9ff
  - https://nonbiri-tereka.hatenablog.com/entry/2014/06/24/110011
トラブったときに命拾いする可能性が高まるフォルダ名/ファイル名のコツ

## 半角英数にする
もしも日本語入力に切り替えできないようなトラブり方をした時に、全角で名前をつけているとターミナルで入力できないということに…！(そうそうないと思いたい)

ソースコードが入るような場所は親ディレクトリも含めて半角英数が基本ですが、それ以外は自分がわかりやすいので日本語でフォルダ名とかつけてます…

## シェルの特殊文字を含めない
**メタキャラクタ**とも呼ばれる**特殊文字**は、シェルにとって意味のある記号です。何かあった時ってターミナル(コマンドライン)であれこれしますが、その時に意図しない動作になってしまうかもしれません。

特殊文字は次のような文字です。

```
空白スペース & * ? ; ` ‘ “ \ | ~ $ < > ( ) [ ] { }  
```

命名の例ですが、単語の区切りが欲しいときは「空白スペース」ではなく「\_(アンダースコア)」にしたほうがいいです。
file name ではなく
file\_name のようにします。
半角スペースは引数の区切り扱いになるためです。

特殊文字は**エスケープ**することで使えはします。
エスケープとは「”」または「’」で囲んだり、特殊文字の前に「\\(バックスラッシュ)」をつけることです。
でもわざわざエスケープしなくてよくなるのでいい方法だと思います。

## 結局
あんまり知らないんですが、今思いついたのはこれくらいです。仰々しいタイトルの割に結局は「空白スペースは使わない」くらいしかやってないですが。。

管理が楽になるうまいフォルダ名の付け方とか知りたいです꜀(.௰. ꜆)꜄
Python　venvを使って複数の実行環境を管理する

## はじめに
Pythonを使っていると『プロジェクト毎に実行環境を管理したい』、『お試しでライブラリを使ってみたい』といったことも出てくるかと思います。
こういった場合には仮想環境を実行環境毎に構築していると便利なため、この記事ではその方法をまとめます。

## インストール環境
Windows 10 Pro


## 仮想環境の構築
以下の流れで進めていきます。

１．Pythonのインストール（既にインストール済みの人は不要）
２．venvを使って仮想環境の構築
３．構築した仮想環境に特定のライブラリをインストール

### １．Pythonのインストール（既にインストール済みの人は不要）

まずはPythonのインストール。
下記サイトからベースとするPythonをダウンロードしてPCにインストールする。

 　　　[pythonの公式downloadページ](https://www.python.org/)

※今回は"venv"というモジュールを利用するため、標準搭載されている3.5以降のバージョンを推奨。自分はPython3.8.3をインストールしました。

インストールで手こずった場合、下記サイトを参考にすると良いと思います。
　　 [Python 3.7.3のダウンロードとインストール](https://www.javadrive.jp/python/install/index1.html)

また、もし１度インストールからやり直したい場合は、こちらのサイトが参考になると思います。
　　[Pythonを完全にアンインストールする方法（Windows）](https://gammasoft.jp/support/uninstall-python-completely-on-windows/)



### 2．仮想環境の構築
仮想環境を構築すると言っても実はいくつかツールがあるので、今回は**『venv』**を使って構築！
（それぞれのツールのメリット・デメリットが気になる方は、下記サイトは参考になるかも！）
　　[Pythonの環境管理ツール良し悪し](http://www.zopfco.de/entry/2017/04/03/233811)


### それでは仮想環境を作成します！

**■ 仮想環境用のフォルダを作成**
これは仮想環境を配置する場所を準備しているだけなので、好きな場所にフォルダを作成してよい。


**■ コマンドプロンプトを起動し、上で作成したフォルダに移動する。
　そこで以下のコマンドを実行して仮想環境を作成。**
`python -m venv for_scraping`　 [for_scraping] の部分は好きな名称でよい。プロジェクト名とかが無難かも。
　※実行した時のカレントディレクトリ内に [for_scraping] が作成される。
　
**■ 実際のディレクトリ確認**
以下の様に確認できれば、ちゃんと作成できてる！
![Qiita-no002_img01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/01013fa6-ed0f-14a0-f252-92bcd6e165ad.jpeg)
※~~これにより構築された時点の仮想環境は、その時点のローカルPCの実行環境と同じ。~~
PythonバージョンはローカルPCの実行環境と同じものになるが、ライブラリ情報が全てコピーされるわけではない！

### 3．構築した仮想環境に特定のライブラリをインストール

構築した仮想環境はローカル環境とまだ同じ状態なので、仮想環境のみにスクレイピング用ライブラリを入れてみる。

**■ 仮想環境をアクティブにする　※これを忘れるとローカル環境にインストールされるので注意！**　
`.\for_scraping\Scripts\activate`　　
（Linux/Macの場合は、`source .\for_scraping\bin\activate`）
以下の様な状態になっていれば、仮想環境がアクティブになっている。
![Qiita-no002_img02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/d565b7cc-3c43-49a7-213b-de0f5305366f.jpeg)

**■ スクレイピングライブラリ(Beautifulsoup)をインストール**
`pip install beautifulsoup4`

**■ 仮想環境から抜けて、ローカル環境にはインストールされていない事を確認**
仮想環境から抜ける：`deactivate`
インストールされていない事を確認するため、以下のtest.pyを実行。
(エディタなどで[test.py]を事前に作り、`Python test.py`を実行するだけ。)

```test.py
from bs4 import BeautifulSoup
```
"No module named" となっていれば確認完了。
![Qiita-no002_img03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/6dbf6f44-6481-1efd-71ba-e78477b4fd6d.jpeg)
※もちろん`pip list`により、ライブラリの一覧を見ても確認できる。


**■ 仮想環境をもう一度アクティブにして確認**
仮想環境をアクティブにする：`.\for_scraping\Scripts\acrivate`　
test.pyの実行。（特にエラーが表示されなければ実行完了できている！）


**これで仮想環境にだけインストールできている事が確認できました！**


#### 環境が不要になった場合は、エクスプローラーからフォルダを丸っと削除するだけでＯＫです！


## まとめ
新しいライブラリをお試しで使ってみたい時、プロジェクト毎に実行環境を分けたい時は、結構便利かなーと感じています。
仮想環境を Juypter Notebook の実行環境としてセットする方法は **[こちら](https://qiita.com/smiler5617/items/e0d9b3034d79457cc253)** にまとめました！
GitHub ActionsでAWS S3に自動でデプロイする（静的ファイルのディレクトリを丸ごとアップロードする）

# 例えばこんなときに便利
- Web開発で画像などを`assets`や`static`といった名前のディレクトリにまとめている
- それらのファイルはS3でホスティングする

※S3のバケットを公開設定にして画像等をホスティングする想定ですが、もちろん公開設定にしないことも可能です。

# Step.1 静的ファイルを1つのディレクトリにまとめる

- ホスティングするディレクトリ`static-files`を作成
- サンプル画像`yakiniku.jpg`を作成
- 例外的にアップロードしないサンプルファイル`README.md`を作成（任意）
- GitHub Actionsのワークフローを書く`workflow.yml`を作成

```tree.txt
your-project-dir
├── .github
│   └── workflows
│       └── workflow.yml
└── static-files
    ├── README.md
    └── yakiniku.jpg
```

# Step.2 事前準備

- GitHub Actions用のIAMユーザーを作成
- GitHubのSecretsに上記IAMユーザーのシークレットを登録
- S3のバケットを`projectname-static-files`という名前で作成（ホスティングする場合は公開設定にする）
  - **S3のバケット名はグローバルでユニークにする必要がある**（[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/BucketRestrictions.html)）
 
# Step.3 GitHub Actionsのワークフローを書く

はじめに全体像を載せます。

```.github/workflows/workflow.yml
name: s3-deploy-sample
on:
  pull_request:
    branches:
      - master
    types: [opened, synchronize, closed] #他のjobがある想定でこの設定にしている

jobs:
  UploadStaticFiles:
    name: Upload static files
    if: github.event.pull_request.merged == true #マージされたときのみこのjobを実行する
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_DEV_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_DEV_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1
      - name: S3 sync
        working-directory: static-files
        run: aws s3 sync . s3://projectname-static-files --delete --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --exclude "README.md"

  AnotherJob:
    # 以下省略
```

### ポイント

実際にS3へアップロードしているの部分は以下です。

```.github/workflows/workflow.yml
      - name: S3 sync
        working-directory: static-files
        run: aws s3 sync . s3://projectname-static-files --delete --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --exclude "README.md"
```
`working-directory`でカレントディレクトリを`static-files`にした上で、

`aws s3 sync`を使用してカレントディレクトリとバケットを同期させています。

※他のいくつかの記事（[Google検索結果](https://www.google.com/search?q=github+actions+s3)）では`aws s3 cp`を用いていますが、cpではファイルの追加はされますが、削除を行うことができません。

**オプションの解説**

- `--delete`は、バケットには存在するがディレクトリにはないファイルがあった場合に、バケットのファイルを削除する
- `--grants {}`は、ファイルのアクセス権限を設定する
    - バケットの公開設定を変更しただけではファイルは公開されない。ファイルごとにアクセス権限を設定する必要がある
    - `read=uri=http://acs.amazonaws.com/groups/global/AllUsers`は**Public Read**にする定義済みURI（[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/acl-overview.html)の「Amazon S3 の定義済みグループ」を参照）
- `--exclude {}`は、例外的にアップロードしないファイルを指定する

# サンプルはこちら

https://github.com/tippy3/github-actions-s3-deploy

# 類似の公開Action
https://github.com/opspresso/action-s3-sync

AWSのクレデンシャルの設定とs3 syncをまとめて行うアクションが既に存在します。やってることはおそらくほぼ同じです。
Chromeショートカットコマンド集

_すごーく忘れがちなかつ、面倒くさがりな筆者です！_
_パソコンを触る生活に慣れてきたのですが、_
_毎回マウスカーソルを動かすのが面倒くさい！！と言うか、手首がめっちゃ痛い(T . T)_
_周りの人は、知ってて当然くらいの感じでショートカットキーをバチバチ打ってるし_
_今更感は、ありますが自分も忘れないためにメモ程度に残しておきます_
_1つでも誰かの役に立てれば幸いです！_
#__<font color="IndianRed">Chrome編</font>__
##タブの追加
「command」＋「t」
##タブを閉じる
「command」＋「w」
##ウィンドウを閉じる
「command」＋「shift」＋「w」
##Chromを終了
「command」＋「q」
##Chrom全画面
「command」 + 「Control」 + 「F」
##ページ戻る
「command」 + 「[」
##ページ進む
「Command」 + 「]」
#__<font color="IndianRed">mac編</font>__
##mac バックスラッシュ入力方法
「option」+「￥」
##Spotlight検索を起動します。
「command」 + 「space」
##ファイルの移動
「command」 + 「shift」 + 「V」
【Laravel】@pushディレクティブで要素を溜めて、任意の場所に定義した@stackディレクティブに出力する。

メモとして残します。
#■はじめに
`@stackディレクティブ`が思いのほか面白い動作だったという話。
私はよくhead要素のJsやcssを読み込むところを@&#xFFF0;sectionディレクティブを使って
子テンプレートから親に出力した要素を印字していました。
しかし、@&#xFFF0;stackディレクティブも悪くなかったため、動作を確認してみました。

#とりあえず@&#xFFF0;sectionディレクティブの場合をおさらい

```php:子テンプレート
@extends('親テンプレート') {{-- 親テンプレート読む --}}
@section('scripts'){{-- 親テンプレートにscriptsというsectionに追記 --}}
  @parent
  <script>console.log('hoge')</script>
  <script src="/js/app/hoge.js"></script>
@endsection
```
```php:親テンプレート
<head>
@section('scripts')
  <script>console.log('huge')</script>
  <script src="/js/app/hugehuge.js"></script>
  {{-- ★★★ここに子テンプレートで定義した要素が追記される★★★ --}}
@show
</head>

```

#次に@&#xFFF0;stackディレクティブの場合
```php:子テンプレート
@extends('親テンプレート') {{-- 親テンプレート読む --}}
@push('scripts')
  <script>console.log('hoge')</script>
  <script src="/js/app/hoge.js"></script>
@endpush
```
```php:親テンプレート
<head>
  <script>console.log('huge')</script>
  <script src="/js/app/hugehuge.js"></script>
  @stack('scripts'){{-- ★★★ここに子テンプレートで@pushした要素が追記される★★★ --}}
</head>

```
ここで注意しないといけないのはpushした順番に、stackディレクティブに印字されます。（スタックなのに。。。）
となると、場合によってはすでにstackされていたとしても一番前に詰め込みたい場合が出てくるかもです。
そういう場合は`@prependディレクティブ`を使うことで一応、順番ぬかしはできるようです。


#番外編@&#xFFF0;prependディレクティブ
```php:子テンプレート
@extends('親テンプレート') {{-- 親テンプレート読む --}}
@push('scripts')
{{-- 2番目に印字 --}}
@endpush

@prepend('scripts')
{{-- 1番目に印字 --}}
@endprepend

@push('scripts')
{{-- 3番目に印字 --}}
@endpush
```
```php:親テンプレート
<head>
  <script>console.log('huge')</script>
  <script src="/js/app/hugehuge.js"></script>
  @stack('scripts'){{-- ★★★ここに子テンプレートで@pushした要素が追記される★★★ --}}
</head>
```
#■さいごに
@&#xFFF0;stackディレクティブ、面白いが、@&#xFFF0;sectionでもいい気がする。。。
もっと効果的な使い方があるのかも。。。
Vercelに初回デプロイ後、pushしたのになぜか反映されないときのトラブル。

## 前提
Dashboard – Vercel
https://vercel.com/dashboard

Next.jsのウェブアプリをVercelのウェブサイトからGithubのリポジトリを登録してデプロイに成功した。

## トラブル
ローカルで修正してgithubへpushしたが反映されなかった。

## 解決方法
Git Integrations - Account – Vercel
https://vercel.com/account/git-integrations

Vercel Git Integrations機能に登録する。
この機能はgit pushコマンドをするたびにVercelに反映される。

![vercelGitIntegration線.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/e6ddc66e-6e60-d957-4d52-32b3142059d5.png)

最初この機能を知らなかったのでデプロイ成功後に色々試して時間を奪われたので記録に残しておきます。

新しく別の場所にデプロイされてしまったり等と色々ありました。
vercelコマンド
vercel --prod

色々試した結果、この方法が一番楽だと思います。

デプロイしたもの。
Create Next App
https://masakinihirota-next-git-master.masakinihirota.vercel.app/

Next.jsもVercelも楽です。
Blender2.8で平行投影が勝手に透視投影になってしまうバグ？の対処法

なんかいつも勝手に透視投影になるからショートカットでも押しちゃってるのかなって思ってたけどググったら同じ現象が起きてる人がいたみたいだったのでメモ。

①編集メニューのプリファレンスをクリック
②左メニュー『視点の操作』タブをクリックして真ん中あたりの『自動パース』のチェックをはずす。


終わり
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/97403e21-8fa0-71ce-7368-b59dfce58b8a.png)

[解決サイト（外部サイト）](https://orokanamymol.hatenablog.com/entry/2019/04/04/135216)
JAXの自動微分で二階微分を求める

# はじめに
複雑な関数の微分を求めたい時に、自動微分が便利ですよね。そんな時、私は今まで[Pytorchの自動微分](https://helve-python.hatenablog.jp/entry/pytorch-automatic-differentiation)を利用していました。しかし、自動微分だけ使いたいのにpytorchのパッケージがかなり重いので、もっと軽量なパッケージはないかなと探していたところ、[JAX](https://github.com/google/jax)にたどりつきました。

# JAXとは？
[公式](https://github.com/google/jax)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570899/137ddbb6-c4db-080f-a317-993e409b6224.png)
[Autograd](https://github.com/HIPS/autograd)(今はメンテナンスされていない)の更新バージョンです。GPUを使って高速に自動微分を計算できます(もちろんCPUでも動きます)。

# インストール方法
#### CPU only version

```
pip install --upgrade pip
pip install --upgrade jax jaxlib  # CPU-only version
```

GPUを使いたい場合は[公式](https://github.com/google/jax)のpip installationガイダンスを参照ください。

# JAXでの二階微分
それでは試しにlog関数の二階微分を求めてみます。

```python
import jax.numpy as jnp
from jax import grad

# log関数の定義
fn = lambda x0: jnp.log(x0)

# x = 1の周りで微分
x = 1

# 代入
y0 = fn(x)
# 一回微分
y1 = grad(fn)(x)
# 二階微分
y2 = grad(grad(fn))(x)
```

```:実行結果
>>> float(y0), float(y1), float(y2)
(0.0, 1.0, -1.0)
```

# 最後に
JAXを使うとお手軽簡単に自動微分が使えます。
javascriptsでのバグ発見and修正ツール　HOPPITYの解説

ICLR2020に面白そうな論文が上がっていたので、分かる範囲で解説しようと思います。
間違えがあったら教えていただけると助かります。

詳しくはこちらへ↓
[HOPPITY: LEARNING GRAPH TRANSFORMATIONS TO　DETECT AND FIX BUGS IN PROGRAMS](https://openreview.net/forum?id=SJeqs6EFvB)




#### 概要

・javascriptプログラムの広範なバグを検出して修正するための学習ベースのアプローチの紹介。

・グラフ構造でモデル化されたバグのあるプログラムを入力として、モデルはバグノードの位置を含む一連の予測を行い、対応するグラフ編集を行って修正を作成。

・HOPPITYというツールでそのアプローチを実現。

####イントロダクション

コードのバグ発見＆修正ツールは基本的に以下の2種類にカテゴライズされるらしいです。

・logical, rule-based techniques
・statistical, data-driven techniques

前者は手動で記述した規則を使用して特定のコードパターンをとらえ、コードベース全体をスキャンしてこれらのクラスのバグを探します。後者は、ディープニューラルネットワークを使用して、大きなコードコーパスから異常コードを検出することを学習します。今回、HOPPITYは下のタイプということになります。既存のグラフベース（おそらく後者のタイプ）のツールに比べ、提案アプローチの利点は**汎用性**とのことです。**幅広いバグの修正に対応している**らしいです。また、後々前者のタイプのツールとも性能比較されていました。まあ、ここではとにかく**幅広いバグを発見・修正できる**んだなって感じで納得してください。

####モデル

以下モデルの概要図です。<img width="556" alt="391D3250-65F9-4B81-A666-61D8009EE4E4.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617775/c0ae481c-fc53-d6bc-f89d-4125247a1375.jpeg">

バグのあるプログラムを表すグラフg<sub>bug</sub>を入力として、修正されたプログラムのグラフg<sub>fix</sub>を予測します。
この図の左側に示すように、最初にプログラムのソースコードを解析して、プログラムの構文構造を取得して抽象構文ツリー（AST）にします。次に、葉ノードをSuccTokenエッジに接続します。葉ノードの実際の内容を格納する値ノードを追加し、それらを接続する特別なValueLinkエッジを使用します。
プログラムをグラフとして表現した後、グラフニューラルネットワーク（GNN）（Scarselli et al。、2008）を使用して、グラフを固定次元ベクトル空間の表現に変換します。（画像左上）さて、ここでグラフの表現を得るための関数を導入します！
グラフgのd次元表現とノードvの表現を得るための関数f(g)は以下の式でパラメータ化されるらしいです。（パラメータ化？定式化されるってことでしょうか）

<img width="1000" alt="06219322-C6AA-4FAE-A247-624820B40E0A.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617775/bdbc863b-37ea-072c-6913-18c2aff94cb7.jpeg">

ここで
W：重み
σ()：tanh
K:エッジのタイプの総数（AST内のエッジにはタイプが複数あります）
$\vec{v}$  :h<sub>v</sub><sup>(L)</sup>,ここでLはGNNの層数
N<sup>k</sup>(v) : エッジタイプkでつながっている周辺ノードの集合
$\vec{g}$ : h<sub>v</sub><sup>l</sup>の集約

です。

さて、ASTグラフをベクトルとしてあらわした後の流れはシンプルです。まずはバグの位置を特定するためにロケーションプリミティブというものが呼び出されます。そして、決定された場所vで実行可能な編集のタイプeが5つの演算子から予測されます。 
一応以下が簡単な各オペレーションの内容です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617775/e572982f-625d-f3fd-076d-f8f3803de2f0.png)


<img width="151" alt="CE03B35F-4635-4E97-BD0E-AFE2FA950958.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617775/7f53d33d-1ca4-7045-728d-a3fe0aa33926.jpeg">

この図がちょうどそれを説明しています。

以上の工程を繰り返し、NO_OPが予測されたらその時点の修正されたグラフが返されるという感じです。


また先ほどプリミティブの話をちらっと出しましたが、簡単には５つのオペレーションはこのプリミティブというもので構成されるよという話です。論文内では、これらのオペレーションはプリミティブをシェアしていると表現されていました。以下、該当箇所を説明してる図です。このLocation、Value、Typeがプリミティブです。

<img width="560" alt="A9D2C1CF-D879-460A-A394-DEC367B88DC3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617775/3f44feb2-2290-baa1-e504-cfb636a85bc6.jpeg">


最終的に修正されたグラフを得ることができます。


####　学習

学習についてですが、データセットはgithub上のコミット前とコミット後のコードのペアです。learning objective<img width="189" alt="F8E4F09A-287D-48E3-A3CA-2C6B4341864E.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617775/fbb81cef-bf5b-dc92-01d1-2022e4854f83.jpeg">は修正の尤度を最大化します。すみません。ここにきて統計学があやふやなせいでよくわからなくなってしまいました。勉強しなおして編集しようと思います。

最適化はADAMでおこなうとのことです。








途中マクロエンベディング云々いろいろ出てきたんですがこれ以上やるときりがなさそうなのでここまでにしようと思います。
Github Pagesとjekyllでホームページを作成する

## GitHubの準備
### [GitHub](https://github.com/)に接続
1. GitHubのアカウントを作成する
2. GitHubにホームページ用のリポジトリを作成する

## ローカルPCの準備
### ソフトウェアのインストール
- [Git](https://git-scm.com/)
- [Github Desktop](https://desktop.github.com/)
- [Ruby](https://www.ruby-lang.org/en/) ※Windowsのみ
- [VS Code](https://code.visualstudio.com/)

## [jekyll](https://jekyllrb.com/)でホームページを作成する
### GitHub Desktop
- GitHubで作成したホームページ用のリポジトリをローカルにクローンする

### VS Code
- クローンしたフォルダを読み込む
- ターミナルでjekyllのコマンドを実行してインストールする
- jekyllの設定を変更する  
  
```_config.yml
# baseurl: ""
# url: ""
# baseurl と url を GitHub Pages のリポジトリに合わせる。 
baseurl: "/****" # *.github.io/[ここ]
url: "https://********.github.io"
```

### GitHubへプッシュする

## VS Codeの拡張機能
1. Japanese Language Pack for Visual Studio Code
2. HTML CSS Support
3. HTML Snippets
4. HTML Preview
5. IntelliSense for CSS class names in HTML
6. Live HTML Preview
7. Bracket Pair Colorizer
8. indent rainbow
9. Rainbow CSV
10. Log File Highlighter
11. Pretter
12. Local History
13. ESLint
14. EditorConfig for VS Code
15. Git Graph
16. Git Lens
17. Git History
18. Material Icon Theme
19. Path Intellisense
20. json
21. Paste JSON as Code
AWS rekognitionで、ローカルの画像ファイルを認識させる方法

## TL;DR

`'Bytes'`というkeyのvalueにバイナリデータを入れて、Imageに渡す

```python
import boto3

client = boto3.client('rekognition')

with open('image.jpg', 'rb') as f:
    response = client.search_faces_by_image(
        CollectionId='string',
        Image={
            'Bytes': f.read()
        }
    )
```

## その他の事例

世の中のサンプルでは、s3に格納した画像ファイルを渡す事例が圧倒的に多かった。
s3から渡す場合は、bucket名とObject名を渡せば解析できる。

```python
response = client.search_faces_by_image(
    CollectionId='string',
    Image={
        'S3Object': {
            'Bucket': 'string',
            'Name': 'string',
            'Version': 'string'
        }
    },
)
```
インターネット広告（運用型）の基礎 〜お金編〜

[negocia](https://negocia.jp/)でプロダクト責任者をしている木下（@11_yk）です。
「うれしい広告の実現へ」というミッションを掲げ、AIを活用した広告運用のSaaSツールの開発をしています。



学生時代はCA（サイバーエージェント）やirepなどのインターネット広告代理店でインターンをし、その後、新卒で入社したリクルートでもインハウスでインターネット広告運用を行ってきました。

現在、社内でAIを活用した広告運用のSaaSツールを開発しており、エンジニアや企画のメンバーに広告運用の基礎をインプットする機会が多いので、その資料を社外の方にも公開し、広告運用に興味を持ってもらえればという思いから、記事を書かせてもらいます。

# インターネット広告（運用型）に関するビジネスモデル
![スライド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405375/20e15f55-0dc0-414c-df03-0a24562575f2.png)
また、広告代理店を挟まない場合は下図のようになります。
![スライド2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405375/abd50f4b-38a9-32e0-6e44-e004949db641.png)

## 広告のインセンティブとは？

簡単に言うと、「たくさん広告枠を買ってくれているお得意様に現金をお渡ししたり、広告料金を割引したりする報酬」のことです。
インセンティブの価格は下記のような指標で決まります。

* 設定された期間内に広告枠を買った金額
* 媒体の機能（自動入札額調整機能 etc.）の使用率
etc.

参考：広告インセンティブについて（Google）
https://support.google.com/adspolicy/answer/141252?hl=ja

# 広告費（=広告枠を買うお金）はどのように決まるのか？
## 広告の課金方式について
主にYahoo!やGoogleなどの主要なインターネット広告媒体に限定すると下記のような課金方式があります。

1.  クリック課金（CPC制）：主に検索/ディスプレイ広告の場合
広告が1クリックされる毎に課金が発生します

2. インプレッション課金（CPM制）：主にディスプレイ広告でブランド認知が目標の場合
広告が1000回表示される毎に課金が発生します

3. 広告視聴課金（CPV制）：主に動画広告の場合
広告の動画が1視聴される毎に課金が発生します
※視聴されたという判断基準は媒体毎にことなるため要確認です

参考：単価設定の基礎（Google）
https://support.google.com/google-ads/answer/2459326


## 課金金額の決定方法について
課金金額は「掲載順位が1つ下の広告ランクを上回るために最低限必要な金額」になります。

```
（広告ランク） = （入札金額） × （品質スコア）
```
では、1つ例を用いて考えてみましょう。

![プレゼンテーション2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405375/0e171dc1-82c3-6d70-48bd-9dcb94d42b78.png)


上記のような入札状況の場合、各掲載順位の広告がクリックされた場合の課金金額は下記のようになります。

![プレゼンテーション2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405375/7318763c-b808-0f13-401f-09abf0a493fd.png)


このように品質スコアが高ければ、入札金額が低くても掲載順位が高くなる場合があるのです。

# 広告の掲載順位を決める重要な指標である品質スコアとは？
品質スコアは、広告やキーワード、ランディング ページの品質を表す指標です。品質スコアが高くなるほど、入札単価を低くおさえつつ、広告掲載順位を上げることができます。

参考：品質スコアとは（Google）
https://support.google.com/google-ads/answer/140351?hl=ja

品質スコアとは広告の全般的な品質を評価するものです。アカウントの各キーワードに割り当てられる 1～10 の数値は、そのキーワードに対応する広告やランディング ページの品質を示します。品質スコアは次の 3 つを基準に決定されます。

・推定クリック率
・広告の関連性
・ランディング ページの利便性

参考：品質スコアについて（Google）
https://support.google.com/google-ads/answer/7050591?hl=ja

上記より、品質スコアを上げるためには、

* 入札するキーワードとLP内のコンテンツが合致したものにする（出来るだけCVRが高いページをLPにする）
* クリック率の低いキーワードや広告の配信を停止する

などを日々の運用で心掛けることが非常に重要になります。

# 番外編：クリック課金とインプレッション課金の広告はどのように比較して掲載順位を決めるの？
公平性を保つため、クリック単価（CPC）広告と視認範囲のインプレッション単価（vCPM）広告がディスプレイ ネットワークの同じプレースメントの獲得を争う場合、インプレッションに対していくら支払うことができるかについて、この 2 種類の広告を同一条件で比較します。vCPM 広告における視認範囲のインプレッション単価の上限額は、視認範囲のインプレッション 1,000 回あたりに対する支払い可能な上限額を表します。クリック単価（CPC）広告では、 1,000 回のインプレッションで発生するクリック数を推定して比較します。

参考：インプレッションに基づく入札について（Google）
https://support.google.com/google-ads/answer/2630842?hl=ja

そのため、クリック課金とインプレッション課金のどちらを採用するかは広告配信の目的（ブランド認知orCV獲得）などを意識した上で、どちらの方がコストパフォーマンスが良いかを試算した上で選択するようにしましょう。

---------------------

negociaでは共に働く仲間を募集しているので、興味を持ってくださった方は気軽にランチでもしながらざっくばらんにお話しできたらと思いますので、気軽に連絡してください。

Twitterは[こちら](https://twitter.com/11_yk)

Facebookは[こちら](https://www.facebook.com/yusuke.kinoshita.9)

---------------------
クラスとインスタンスについて

プログラミングを勉強していると基本的な概念を学ぶ必要があります。
Rubyでは、「オブジェクト」や「変数」などたくさん用語が出てきて大変なので、少しずつでも理解を早めるために自分なりにアウトプットしていきたいと思います。もし「ここが違うよ！」ってところがあったらご指摘いただけたら嬉しいです。
# クラスとインスタンスとは？
そもそもクラスとインスタンスを理解するためには「オブジェクト」と「メソッド」という言葉を理解する必要があります。
ざっくりとした説明は以下から。
###オブジェクト
「Rubyにおける全てのデータ」のことです。例えば「おはよう」といったような文字は「文字列オブジェクト」、「１３９」といった数字は「数値オブジェクト」と呼ばれています。
###メソッド
オブジェクトが持つ**「処理」**のことをメソッドと言います。
Rubyのオブジェクトは全て「メソッド」を持っています。
例えばこんな感じで、
・文字列オブジェクト　→　lengthメソッド　→　文字数を数える
・数値オブジェクト　→　to_sメソッド　→　文字列化する
といったように**オブジェクトの種類ごとに持っているメソッドが違う**わけですねー。
例えると、**それぞれのモンスターが使える技はモンスターによりけり**だよねって話です。
###クラス
前置きが長くなりましたが、ここからが本題です。
クラスとは「**共通のプロパティとメソッドをまとめたもの**」のことで、よく「**クルマの設計図**」として例えられることが多いです。クルマを作る時には設計図が必要ですが、どのクルマにも共通する部分があるわけです（ハンドル・ブレーキで「加速する」など）。その「**共通した部分を設計図にしてまとめようぜ**」ってことです。つまり、クラス（設計図）を作って、他のクルマを作る時でも使えるようにできる仕組みですね。これは便利。
###インスタンス
インスタンスは「**クラスから属性や処理を受け継いでできたオブジェクト**」のことです。
クラス（設計図）をベースに作られたオブジェクト（クルマ）といえばわかりやすいでしょうか。必要最低限の部分を引き継いでいるので、「ハンドルがあって〜」**一からなどど設計図を作らなくて済む**のがメリットだと解釈しております。
#クラスを定義してみると
実際にコードを書いてみるとこんな感じになります。

```ruby.rb
class Apple(クラス名)
  # メソッドの定義
end
```

classとendで囲ってあげると完成です。
# インスタンスを生成すると
インスタンスはこんな風に作ることができます。


```
# newメソッドでクラス名を指定し、変数に定義
orange(変数名) = apple(クラス名).new
```
さらに定義したインスタンスをこんな感じ出力します。

```
puts orange
```

そしてターミナルで`ruby ファイル名.rb`とすると、実行されるということです。

#感想
こうやって記事にすることで、イマイチ理解していなかったことが整理できて大変よかったなぁと思いました。
定期的に書いていく予定なので、よかったら見ていってもらえると今後の励みになります。
ご覧いただきありがとうございました！
【VMware】ユーザーへの仮想マシン割り当て方式(HorizonView)

# はじめに
HorizonViewのユーザーへの仮想マシン割り当て方式についてアウトプットします。

# 専用割り当て方式

**仮想マシンとユーザーが紐づいた割り当て方式**

## 特徴

- ユーザー1人に付き、仮想マシンが1台必要
- 自分専用のデスクトップとしてカスタマイズ可能
- ログオフしても作業環境は保持

## イメージ

![専用割り当て方式.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/05f18231-a73b-9c58-4cf0-dece4218a6ea.jpeg)


# 流動割り当て方式

**仮想マシンとユーザーが紐づかない方式**

## 特徴

- ユーザーがログインすると仮想マシンがアサインされる
- 個人データは、ログインすると呼び出される仕組みになっている
- デスクトップの使用者が少ない場合、専用割り当て方式よりリソースの消費を抑えることができる

## イメージ

![流動.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/a487cc32-b312-d9de-68e0-97cdeced9dd4.jpeg)



# 参考
[新卒 2 年目 SE が贈る 仮想デスクトップのキソ！・ 第 3 回 ～仮想マシンの作成　プールの作成　～](https://blogs.vmware.com/jp-euc/2015/05/euc_kiso03.html)
[「リンククローン×流動割り当て」方式とは？VDIの各方式とメリット・デメリット](https://ddreams.docomo-sys.co.jp/sworksquare/column/detail13.html)
良質な情報をみつけるための英語キーワードまとめ

# 概要
新しいプログラミング言語を習得しようとするとき、基本文法を学びます。それが終了した後、どのような学習をしますか？

>  「いい感じの学習の道しるべがほしい」
>  「いい感じのサンプルコードを読みたい」

そんな時に,いい感じの技術記事を見つけるためのキーワードを集めてみました。



※ 下記の「いい感じ度」は汎用性が高そうと思うものを独断と偏見で設定したパラメータです。



# キーワード

## Awesome 　訳：すごい

いい感じ度：★★★★★
対象　　　：とりあえずなんかいい感じのものがほしい人
検索例　　：awesome javascript
記事例　　：https://github.com/sorrycc/awesome-javascript



## Best Practice　訳：最善慣行

いい感じ度：★★★★☆
対象　　　：最も効率のよい方法、お作法が知りたい人
検索例　　：「best practice go 」
記事例　　：https://talks.golang.org/2013/bestpractices.slide#1



## Roadmap　訳：行程表

いい感じ度：★★★★☆
対象　　　：今後の学習の道しるべを知りたい人
検索例　　：「roadmap backend」
記事例　　：https://github.com/kamranahmedse/developer-roadmap



## Real World　訳：現実世界

いい感じ度：★★★☆☆
対象　　　：サンプルコードではなく、実際に使用される形で学びたい人
検索例　　：「real world vue」
記事例　　：https://github.com/gothinkster/realworld



## Cook Book　訳：料理の本

いい感じ度：★★☆☆☆
対象　　　：いい感じのサンプルコードを知りたい人
検索例　　：「cookbook github」
記事例　　：https://github.com/andkret/Cookbook/blob/master/sections/01-Introduction.md#what-is-this-cookbook



## Best Examples　訳：好例

いい感じ度：★★☆☆☆
対象　　　：ただのサンプルじゃなくて、ベストなサンプルを見つけたい人
検索例　　：「best examples python」
記事例　　：https://skillcrush.com/blog/python-programming-examples/



# おわりに

ほかにもいい感じのキーワードがありましたらコメントください！

```
## xxx　訳：xxx

いい感じ度：★★☆☆☆
対象　　　：
検索例　　：「」
記事例　　：
```
普通のグラフを散布図っぽくアレンジ｜Pandas

#散布図の描画を利用してグラフ作成
散布図と言いますとだいたいこんなイメージですよね。
<img width="594" alt="スクリーンショット 2020-06-17 23.32.49.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/a75e6a71-3d0a-ba90-790b-d76545f2318f.jpeg">
こういったデータ分析に強いのが**Pandas**ライブラリです。

これを使ってフツーのグラフを散布図風に描画してみました。

まずはソースコードです。

```Python:scatterSample.py
# Pandas ライブラリ
# 2020.06.18.ProOJI
# Matplotlib.pyplot、 そしてNumpyも使用
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 等差数列　linspace(初項、最終項、要素数）
#  例：np.linspace(0, 10, 4)
#    Ans: [ 0. , 3.33333333, 6.66666667, 10. ]
x = np.linspace(0,6.3, 50)
# 正弦(sinθ)
a = (np.sin(x)+1)*3
# 余弦(cosθ)
b = (np.cos(x)+1)*3
# 配列全てを[1]に初期化してしまう強いヤツ（ x軸向の直線）
c = np.ones_like(x)*3
# 指数関数
d = np.exp(x)/100.
# 辞書型(dict)でタプルの中に設定
df = pd.DataFrame({"x": x, "a": a, "b": b, "c": c, "d": d})

#
# sin + scatter(意味：散らす）散布図っぽく
ax1 = df.plot(kind="scatter", x="x", y="a", color="blue", label="a - x")
# cos + scatter
ax2 = df.plot(kind="scatter", x="x", y="b", color="red", label="b - x", ax=ax1)
# 一直線 + 実線
df.plot(x="x", y="c", color="green", label="c - x", ax=ax1)
# 指数関数 + scatter ( xをy軸方面へ使用 )
df.plot(kind="scatter", x="d", y="x", color="orange", label="b - d", ax=ax1)
# sin + 実線 ( xをy軸方面へ使用 )
df.plot(x="a", y="x", color="purple", label="x - a", ax=ax1)

# ラベルを設置
ax2.set_xlabel("Horizontal Label")
ax2.set_ylabel("Vertical Label")
# 表示
plt.show()
```
コーディング後、出来上がったグラフがこちら
（ちょっとにぎやかすぎた感は否めない...）
<img width="605" alt="スクリーンショット 2020-06-18 0.05.07.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/c2628d5c-3b78-728b-c970-0cddb3a95db1.jpeg">

#まとめ
本来なら**Pandas**はもっと意味のあることに使用するのでしょうが
お近づき、という感じでフツーのグラフを２Dで描画してみました。
いろいろと利用価値がありますね。
Bot Framework ComposerでAzure リソースの準備時にエラーが発生する件への対処

# TL;DR

- [LINE Bot を Bot Framework Composer でローコード開発する : その 1 環境の準備](https://qiita.com/kenakamu/items/7c4e5d0019ea651e004e)でAzure リソースの準備を行った際に、サブスクリプションによっては`node provisionComposer.js`の処理でエラーが発生することがある件への対処
- 現時点（2020年6月17日）では設定や構成スクリプト`provisionComposer.js`の実装に問題があるため、指定する引数を変更して実施する必要がある。

    参考：[fix: use subscription api for tenant id retrieving](https://github.com/microsoft/BotFramework-Composer/pull/3359)


# 現象

```posh:エラーが発生するスクリプト
node provisionComposer.js --subscriptionId=<Azure サブスクリプション ID> --name=<リソースグループ名> --appPassword=<任意のアプリのパスワード> --environment=<任意の環境名。既定は DEV>
```

```posh:発生するエラー
User was not found
** Provision failed **
```

# 対処（暫定対処）

[fix: use subscription api for tenant id retrieving](https://github.com/microsoft/BotFramework-Composer/pull/3359)の記事から修正されることが予想されるが、現時点（2020年6月17日）では次の回避策を実施する。

1. Azure PortalでBotに紐づくサブスクリプションを選択し、テナントIDを控える。(2020年8月10日追記)サブスクリプションからはテナントIDが確認できなくなっていた。[この手順](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal#get-tenant-and-app-id-values-for-signing-in)で確認可能と思われます。
2. 1.のテナントIDを使い以下のコマンドを実施する。



```posh:修正後
node provisionComposer.js --subscriptionId=<Azure サブスクリプション ID> --name=<リソースグループ名> --appPassword=<任意のアプリのパスワード> --tenantId=<サブスクリプションのテナントID>
```

(2020年8月10日追記)[こちら](https://mitsunooon.hatenablog.com/entry/2020/07/15/224939)のサイトによれば`--environment`の置き換えではなく`--tenantId`オプションの追加でよいようなので、修正後は以下のオプションでよいと思われます。

```posh:修正後(2020年8月10日)
node provisionComposer.js --subscriptionId=<Azure サブスクリプション ID> --name=<リソースグループ名> --appPassword=<任意のアプリのパスワード> --environment=<任意の環境名。既定は DEV> --tenantId=<サブスクリプションのテナントID>
```





# 参考

- [BotFrameworkComposerをAzureにデプロイしたらエラーが出た話](https://qiita.com/mindwood/items/0c10d42ca877cece6344)
- [Bot Framework ComposerでLINEボットを作ったときにつまづいたところ - オンプレ系インフラエンジニアがAzureを勉強する](https://mitsunooon.hatenablog.com/entry/2020/07/15/224939)
GASでcsvファイルをスプレッドシートにインポートする方法

## はじめに
csvで落としたデータを簡単にスプレッドシートにしたい時に使えるコードです。

## セットアップ
google drive上にcsvを保存しておくことと、インポートした先のスプレッドシートを予め作成しておく必要があります。

## 使い方
まずはスプレッドシートでツール→スクリプトエディタをクリックします。
<img width="554" alt="Screen Shot 2020-06-17 at 23.41.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/810bcf5d-d883-5c76-f7ca-0f99a8c222ea.png">

##Code.gsのコードを書き換える

ファイル名.csvとなっているところをdrive上に保存したファイル名に書き換えてください。

```javascript

function importCSVFromGoogleDrive() {

  var file = DriveApp.getFilesByName("ファイル名.csv").next();
  var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

}

```

## デモ
Runのボタンを押してスプレッドシートのファイルに戻るだけです。

<img width="790" alt="Screen Shot 2020-06-17 at 23.54.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/36f94328-78ea-de4c-35e5-213ec52b8f71.png">



## 終わりに

大量のcsvデータでチャートを作ったり、jsonにしたりと色々してみたかったのでまずはスプレッドシートに落としてみました。スプレッドシートからjsonにする過程はとても簡単な[GSX2JSON](http://gsx2json.com/)を使いました。
VSCodeのRust拡張がうまく補完を出してくれないとき

# TL;DR

* 「User Setting」→「"rust"で検索」→「Rust-client:Engineを"rust-analyzer"に設定」
* リロード

**(追記)普通にrust-analyzerの拡張を入れたほうがいいかも。(この際Rustと言う名前のVSCode拡張は無効にする)**

# 補完がうまく出ない。。

普段はrustの補完が出てくれるのだが、どうも大規模なライブラリを参照した際に`unwrap`や`expect`したあとの型が正常に予測されない。
自分が作った型等は問題ないが、ライブラリの関数を呼ぶと全く型を推測してくれなくなることがある。

![with_rls.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41402/93137ddb-2736-8bb0-89fa-640e1af766de.gif)
> pipelineの型が普通の型名でなく、取得した際の関数呼び出し全文が表示されている。いずれにせよ補完が効かない。

用いるLanguage Serverを「rls」から「rust-analyzer」にしたら解決した。
VSCodeの再読込と、インストールされていない場合は「rust-analyzer」が必要で、必要に応じてインストールするかを問うプロンプトが出る。

![with_rust_analyzer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41402/72e822ea-8f45-120e-a1b7-9f406cc05e04.gif)

> 問題なく動く。幾分か早く補完が出る気がする

# 参考リンク

* [Rust-analyzer](https://rust-analyzer.github.io/)
* [Rust(rls) (VSCode拡張)](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust)


正直、rlsのバグなのかもしれんが再現する条件がわからんから報告しにくい。
rails db:migrationが通らなかった時に確認すべきこと

いつものようにマイグレーションファイルを作成し、rails db:migrateをしようとしたところ以下のエラーがでた。
Column `user_id` on table `entries` does not match column `id` on `users`, which has type `bigint(20)`. To resolve this issue, change the type of the `user_id` column on `entries` to be :bigint. (For example `t.bigint :user_id`).

指示通り以下のようにbigintを指定して再度マイグレーションを実施した。
```class CreateEntries < ActiveRecord::Migration[5.1]
  def change
    create_table :entries do |t|
      t.references :user, foreign_key: true, type: :bigint //integerからbigintに変更
      t.references :room, foreign_key: true
      t.timestamps
    end
  end
end```

しかし、同様のエラーが出現した。
実はこの時3個のマイグレーションファイルを同時に作成しており、上記のマイグレーションファイルを登録するために必要なマイグレーションファイル(room)の作成日時が最後になっていたのでエラーが発生していた。
roomファイルの作成日時をファイル名を変更し、再度rails db:migrateを実行したところ問題なく通った。
Codeforces Round #650 Div.3 C. Social Distance 連続した0と1の個数処理

https://codeforces.com/contest/1367/problem/C

#　概要
- n列の椅子があり、n文字の着席状況sが与えれられる。例えば、10001。1は着席。0は空席。
- ソーシャルディスタンスのため、必ず、空席をk個空けないと座れない。
- 今現在、ソーシャルディスタンスは保たれている。さて、あと最大で何人座れるか？

# 例
- k=1,で、100010の場合
    - さらに1人座れる。101010とできる。
- k=2で000000の場合
    - さらに2人座れる。100100とできる。
- k=1で10101の場合
    - もう座れない(0人)。10101にしかできない

# こう考えた

<img width=50% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/472a3970-a044-a508-434d-0950157801af.png>

まず、このように誰もいない席がn=7あったとして、k=2と指定されたとする。この場合、`ceil(n/(k+1))`人が最大の着席数であることは図を書けば思い浮かぶ。なぜなら、まず左端に座り、k空けた後にこれを繰り替えすのが貪欲に最適だからである。

人が座れ売るのは0が連続する区間だけであり、どのように座ったところで隣の0が連続する区間には影響しない。つまり、各連続した0の区間について上の計算を行えばよい。

ところで、
<img width=50% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/ae5b1f65-c9c3-64a6-d824-02060d21b6e7.png>
図のように、4つの空席が3つあることを考えると、両端は特殊な処理を行う必要がある。

- 真ん中のケースを考える。端でない連続した0の区間はその区間に含まれない1つ隣が1であることは自明である。そのため、両端は必ずkの距離を空けないとならない。
    - つまり、この区間は連続した0の数をlとすると、(l - k - k)の左端や右端にも1を置いていい区間と考えられ、上記のように計算できる。
- 例えば、左端のケースを考える。この場合、右側の1つ隣は1であるためkの距離を空けないとならない。ただし、左端は端なので、最も左に1を置ける。右端も同様である。

```Python
from pprint import pprint
import sys
 
import itertools
def countstrs(s):
    return [(k, len(list(g))) for k, g in itertools.groupby(s)]
import math
 
q = int(input())
for _ in range(q):
    n,k = map(int, input().split())
    s = input()
 
    res = 0
 
    dat = countstrs(s)
    #print(dat)
    l = len(dat)
    for i in range(l):
        ignoreLeft = False
        ignoreRight = False
        if i == 0:
            ignoreLeft = True
        if i == (l-1):
            ignoreRight = True
 
        if dat[i][0] == "1":
            continue
 
        cnt = dat[i][1]
        if ignoreRight is False:
            cnt -= (k)
        if ignoreLeft is False:
            cnt -= (k)
 
        #print("space", cnt)
        if cnt <= 0:
            continue
 
        res += math.ceil(cnt / (k+1))
 
    print(res)
```
https://codeforces.com/contest/1367/submission/83968472
【laravel】バリデーションのユニークチェックの書き方わかりにくい問題

#はじめに
タイトルにもある通り、laravelのReqestファイルに記載したバリデーションでユニークバリデーションの記述が異様にわかりづらかったのでメモとして残します。


#解読対象
```
        return [
            'login_id', 'unique:users,login_id,NULL,id,deleted_at,NULL',
        ];
```
他のバリデーション指示はあんなにシンプルなのにどうしてユニークだけこんなにわかりづらいんだろう、、、理解にすこし時間がかかってしまいました。
##内容解説
左から順に
**対象カラム名：**
**unique：ユニーク**
**users：テーブル名**
**login_id：チェックするカラム**
**NULL：除外する値**
**id：除外する列**
**deleted_at：追加でユニークチェックを行うカラム**
**NULL：追加でユニークチェックを行うカラムの条件値**
となります。

・除外する値と列二つを組み合わると、今回はidがNULLなレコードはユニークチェックの対象外となります。

・追加でユニークチェックを行うカラムの条件値は該当するレコードに対してユニークチェックを行うので、今回はdeleted_atカラムのレコード内容がNULLのものを対象に追加でユニークチェックを行います。

##おわりに
多分わかりづらかった理由は除外と追加が同じように書くので混乱の原因になったと思います。
補足で、今回は除外する値をNULLにしていますが、${id}のような形にしておくとこれから更新するデータは除外してくれます。

また、deleted_atカラムのレコード内容がNULLのものを対象にする事で、ソフトデリートしたレコードをユニークチェックに引っかからないようにできます。
VIMの操作暗記用。操作方法一覧＆レベル別３つの動画

# VIM操作方法すぐ忘れる問題
VIMの操作をすぐ忘れちゃうので、要点だけ絞ってレベル別に動画を作成しました。
一個数分で見ることができるので、忘れちゃう人やこれから覚えたい方のためになれば。。
通勤時間や寝る前に見れるように作成してます。

## とりあえず覚えていないと何もできない操作方法

[![vimの使い方](https://i9.ytimg.com/vi/x6lMGjXjzyI/mqdefault.jpg?time=1592405362402&sqp=COzYqPcF&rs=AOn4CLC5372AREF8BG36CTXJP4gyYsmLdg)](https://youtu.be/x6lMGjXjzyI)

動画で覚える内容

```text
vi sample.txt　→　vimを開く
i　→　編集モードに変更
矢印キー　→　移動
deleteキー　→　削除
esc →　編集モードを抜ける
:wq　→　保存して閉じる
:q　→　保存せずに閉じる
q　→　やめる
wq!,q!　→　びっくりをつけると強制。
```

## ぜひ覚えるべき操作

動画はこちらから（画像クリックでyoutubeへ）
[![vimの使い方](https://i9.ytimg.com/vi/pcjGaC0JNDQ/mqdefault.jpg?time=1592405654706&sqp=CJjbqPcF&rs=AOn4CLDWB4pAEqT_mVek6w9kXHzvqMFcng)](http://www.youtube.com/watch?v=pcjGaC0JNDQ)

動画で覚える内容

```text
/　→　検索(nで次へ。Nで前へ)
gg　→　最初の行
G　→　最後の行
ctrl-f　→　1ページ後
ctrl-b　→　1ページ前に移動
h　→　左
j　→　下
k　→　上
l　→　右
H　→　画面上にカーソルを合わせる
M　→　画面中央部にカーソルを合わせる
L　→　画面下部にカーソルを合わせる
u　→　アンドゥ
ctrl+r　→　リドゥ
ddで行全体を削除
yy　→　行コピー
p →　ペースト
dd　→　行カット
```

## 覚えていると捗る操作

動画はこちらから（画像クリックでyoutubeへ）
[![vimの使い方](https://i9.ytimg.com/vi/Epw3P8yAlkg/mqdefault.jpg?time=1592405728387&sqp=CMTdqPcF&rs=AOn4CLBzMUhzrNyzJYh-a-AQ1-M4KHR3xg)](http://www.youtube.com/watch?v=Epw3P8yAlkg)

動画で覚える内容

```text
0 → 行の先頭へ移動
$ → 行の末尾へ移動
r → 一文字だけreplace。
w → 次の単語へ移動
b → 前の単語へ移動
e → 単語の末尾へ移動
ge → 前の単語の末尾へ移動
V + カーソル + d → 複数行削除
```

## 忘れてた操作。。。
結構使えるコマンドを説明できていないですね。。。

```text
5dd → ddの行削除を5行分まとめて実行（5は任意の数字） 
5yy → yyの行コピーを5行分まとめて実行（5は任意の数字） 
5G → 5行目へ移動（5は任意の数字） 
```
Moq.EntityFrameworkCoreの使い方

NuGetで公開されているMoq.EntityFrameworkCoreを使ってテストソースを書いていた時に少し躓いたところがあったので残しておく。

# 躓いたところ
DbSetに渡された引数の検証を行おうとした時にどうMock Objectを渡せばいいのか分からなかった。

# 解決策
まずテスト対象のソースはこんな感じ。

```C#
public class UsersService
{
    private readonly UsersContext usersContext;

    public UsersService(UsersContext usersContext)
    {
        this.usersContext = usersContext;
    }

    public void AddUser(string name) {
        var user = new User()
        {
            Name = name
        };

        usersContext.Users.Add(user);
        usersContext.SaveChanges();
    }
}
```

引数で受け取った値を元にメソッド内でモデルを生成してそのまま永続化する処理。
次にテストソース

```C#
[TestClass]
public class UsersServiceTest
{
    [TestMethod]
    public void TestSample()
    {
        // arrange
        var dbSetMock = new Mock<DbSet<User>>();
        User param = null;
        dbSetMock.Setup(x => x.Add(It.IsAny<User>())).Callback<User>(x => param = x);
        var userContextMock = new Mock<UsersContext>();
        userContextMock.Setup(x => x.User).ReturnsDbSet(new User[0], dbSetMock);
        var usersService = new UsersService(userContextMock.Object);

        // act
        usersService.AddUser("test user1");

        // assert
        Assert.AreEqual("test user1", param.Name);
    }
}
```

ReturnsDbSetの2つ目の引数に```Mock<DbSet<T>>```を渡すだけ。
このサンプルではAddメソッドをCallbackで上書きし、Addメソッドに渡された引数を退避する。
その後、退避した結果のプロパティが想定した結果となっているかを検証している。

ソースコードを見て解決したのだが、

> And this is all. You can use your DbContext in your tests.
> 
> You will find examples of this library in the repository.

とか書かれていて、サンプルまであったので一生懸命サンプルの方を探してしまった。
気が向いたらプルリクエスト投げてみようかな。
Windows パフォーマンスカウンターの役割を確認する方法

パフォーマンスカウンターの役割をググると色んな記事がありますが、正式に網羅している記事はありません。

参考程度になりますが、パフォーマンス カウンターの役割を確認する手段を発見しました。
SEなりたての頃、パフォーマンス カウンターの意味がわからず結構困った記憶があるので
どこかに需要があるかもしれないと思い記載しました。

活用するのは、パフォーマンス モニターです。
パフォーマンス モニターはWindows OSの様々なログを監視できるのですが、カウンターを選択する際、説明文が表示されるので、その機能を活用します。なお、OSのアップデートなので、メモリなどの説明は実態とは違う可能性があるので、参考程度に活用してください。

---
以下手順

1.パフォーマンス モニターを開きます。

2.[データ コレクター セット] をクリックし、[ユーザー定義] を右クリックし、新規作成のデータコレクターセットをクリックします。
![image001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535251/c7101686-0036-7965-67c2-a5039af83533.png)


3.手動で選択するにチェックをいれます。
※名前(M): はなんでもよし
![image002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535251/257d09ec-c5e7-292a-7656-05938f2e9a4a.png)

4.データログを作成する(D) をチェックし、パフォーマンス カウンター(P) にもチェックします。
![image003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535251/6eae79ec-b937-53c8-a307-b8d0cb5eab6c.png)

5.パフォーマンス カウンター(C): と右にある [追加(D)…] をクリックします。
![image004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535251/ce70877f-3846-62ee-3194-139e41337a42.png)

6.下部にある [説明を表示する] にチェックを入れた後、使用可能なカウンター一覧からカウンターを選びます。
すると、選択したカウンターの説明が表示されます。
![image005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535251/84c98c36-6b9c-918b-aba5-3ecdeceec8e5.png)

---

上記の手順でパフォーマンスカウンターの役割を確認できます。
Rubyでアルゴリズムを実装する:Day 1 -ユークリッドの互除法-

アルゴリズムについて学ぶために自分の持ち合わせた知識を用いてコーディングします。
続くかわからない１日目

# ユークリッドの互除法とは
最も有名といっても過言ではないアルゴリズムの１つ。もはや説明不要だろう。
２つの自然数aとbについて最大公約数を求めるもの。
方法はaとbの剰余を求める。
次にｂと剰余の剰余を求める。
そして剰余の剰余と、剰余の剰余の剰余を求める。
剰余が０になるまで繰り返した時の除数がaとbの公約数となる。

仕組みがわかったら、早速コーディング

# Euclid.rb
```ruby
def euclid(a, b)
  while b != 0
    mod = a % b
    a = b
    b = mod
  end
  a
end

print "aの値:"
a = gets.to_i
print "bの値:"
b = gets.to_i

puts "aとbの最小公約数は#{euclid(a,b)}です"                                         
```
aとbを入力しメソッドの引数とする。

modにaとbの余りを代入
aにbを代入
bにmodを代入

これをbが0より大きい時だけ繰り返す

おそらく問題ないはず

# 最後に
簡単なコードだから間違いはないはず
有識者のみなさんに求めるものは
・コードの簡略化
・処理速度の短縮化
思い付きで行ってるので実行可能かは知りませんが、よろしくお願いします

明日はバブルソートの実装をします。
[Angular] FormGroupがネストしたReactive Formをうまく操りたい

Reactive Formで、
`FormGroup`　でフォームを入れ子にした場合の`FormControl`の得方が毎回わからなくなるのでメモ

今回のサンプルに使うフォーム定義は以下のようにします。

```typescript
this.form = new FormGroup({
  name: new FormControl('国会議事堂', Validators.required),
  age: new FormControl(84, Validators.required),
  address: new FormGroup({
    zipcode: new FormControl('100-0014'),
    prefecture: new FormControl('東京都'),
    detail1: new FormControl('千代田区永田町1-7-1'),
    detail2: new FormControl(''),
  }),
})
```

# ネストしたFormControl、FormGroupを得たい
上記のフォームで、`this.form.controls`の結果は以下のようになる

```typescript
controls:
	address: FormGroup
		...
		controls:
			detail1: FormControl
			detail2: FormControl
			prefecture: FormControl
			zipcode: FormControl
	age: FormControl
	name: FormControl
```

なので、`controls`プロパティを噛ませてやる必要がある。
例えば、`detail2`を得たい場合

```typescript
form.controls.address.controls.detail2
```

としなければならない。

## controls乱発を避けるためのtips
### エイリアスとなるgetterを定義
特にテンプレート側で`FormControl`を得たい場合が多々あるが、**`controls`が乱発して可読性が低下することがある。**
例えば今回の場合入れ子になっている`address`という`FormGroup`を、コンポーネント変数として宣言するとシンプルに書ける。
これは公式ドキュメントでも推奨のテクニック：　https://angular.jp/guide/reactive-forms#creating-dynamic-forms

```typescript
get formAddress(): FormGroup {
  return this.form.get('address') as FormGroup
}
```

`[formGroup]`ディレクティブに適用する場合
今回だとネストがそこまで深くないが、もっと深くなった場合は可読性がだいぶ変わりそう。

#### before
```html
<div [formGroup]="form.controls.address">
```


#### after
```html
<div [formGroup]="formAddress">
```

### formGroupディレクティブをつけた要素の配下は、formControlディレクティブではなく、formControlNameディレクティブを使用する
上記のgetterとの合わせ技で、更に見やすくなる。

#### before
```html
<div [formGroup]="formAddress">
  <input type="text" [formControl]="formAddress.controls.detail1">
  <input type="text" [formControl]="formAddress.controls.detail2">
```


#### after
```html
<div [formGroup]="formAddress">
  <input type="text" formControlName="detail1">
  <input type="text" formControlName="detail2">
```

# フォーム値（value）を得たい
値を得たい場合は`FormControl`とは違って圧倒的に話は簡単で、
今回のサンプルで言えば`this.form.value`の結果が以下のようなkey-valueオブジェクトになっている。

```
{
	address: {
		zipcode: '100-0014',
		prefecture: '東京都',
		detail1: '千代田区永田町1-7-1',
		detail2: '',
	},
	age: 84,
	name: '国会議事堂',
}
```
ネストした要素も、素直に

```typescript
form.value.address.detail2
```

のようにアクセスすれば良い。

# 参考
[Angular 日本語ドキュメンテーション - リアクティブフォーム](https://angular.jp/guide/reactive-forms)
素のJavaScript用AWS SDKを使ってみる

## 紹介する内容
- Node.jsではないJavaScript用AWS SDKをブラウザ上で動かします
  - 本当に動くか気になりました

## 結論
- JavaScript用AWS SDKはブラウザ上で動きました
- accessKeyIdやsecretAccessKeyは漏れないように注意お願いします。**デベロッパーコンソールで値を簡単に確認できます**
- どこで応用できるか考える必要があると思います
  

## 紹介始めます
### AWS SDK for JavaScript公式ドキュメント
公式ドキュメントです。  
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/index.html


### コード
- accessKeyIdやsecretAccessKeyは漏れないように注意お願いします。デベロッパーコンソールで値が見れます。
- `<script src="https://sdk.amazonaws.com/js/aws-sdk-2.410.0.min.js"></script>` この一行で使用可能です。

```
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>AWS SDK for JavaScript</title>
</head>

<body>
  <script src="https://sdk.amazonaws.com/js/aws-sdk-2.410.0.min.js"></script>

  <script type="text/javascript">
    AWS.config = new AWS.Config({
      accessKeyId: 'AKIAIOSFODNN7EXAMPLE',
      secretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
      region: 'us-east-1',
      endpoint: 'http://192.168.33.14:4566'
    });

    var cloudwatchlogs = new AWS.CloudWatchLogs({ apiVersion: '2014-03-28' });

    cloudwatchlogs.describeLogGroups(function (err, data) {
      if (err) {
        console.log(err, err.stack);
      } else {
        console.log(data.logGroups);
      }
    });
  </script>
</body>
</html>
```


### 試し順番です
1. ローカルでAWSをいろいろ試せるlocalstackでLambdaを起動しておきます（本物のAWSを使ってもいいです）
   - localstackを実際用意したい方はこちらを参考お願いします。 (https://qiita.com/cheekykorkind/items/02c896465ddea5c5186f)

2. localstackにcloudwatch logsのgroupが作れるようにLambdaを一回実行します
3. aws cliでcloudwatch logsのgroupが作られたか確認します
4. ブラウザ上のAWS SDK for JavaScriptでも同じcloudwatch logsのgroupが取得できるか確認します


### 試しを見せます
![cloudwatchlogs.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/1e89ec94-3870-d00f-6015-993432449b44.gif)
知らないとヤバイ。xargs（エックスアーギュス）コマンドの使い方を丁寧に解説

# 基本

動画はこちらから（画像クリックでyoutubeへ）
[![lessコマンドの使い方。catだけだときついよ【linux コマンド】](https://i9.ytimg.com/vi/BnwD2rX9kv8/mqdefault.jpg?time=1592404745658&sqp=CJTUqPcF&rs=AOn4CLBdr_Ajqy_xhYgbg6mc21TYQI7djA)](http://www.youtube.com/watch?v=BnwD2rX9kv8)
## xargsコマンド
標準入力やファイルからリストを読み込んで,実行したいコマンドの引数として渡せる!
ちなみに読み方は「エックスアーギュス」とが一般的。argumentsの略なので、アーギュメンツからアーギュをとっている（多分）

## オプション
* -p : 実行前に確認する
* -L : 指定した数の引数で実行する
* -I : 指定した位置に引数を渡せる
（他にもあるが、覚えるのはこれだけで十分）

## appendix
* -Iオプションでは必ず一つずつ実行されるので-Lは使えない
* backquoteでも同じようなことができる

## sample サンプルコマンド

* ls | xargs wc
* find . -name "*.txt" | xargs wc
* ls | xargs -L 1 wc
* ls | xargs -L 3 wc
* ls | xargs -p -L 3 wc
* ls | xargs -I{} wc {}
* wc \`ls`
* wc aaa.txt
* ls | wc
* ls | cat

# 実際にコマンドを打ってみる

二つのファイルを用意する。

```shell-session
[bitnami@ /tmp/com_xargs]$ ls
aaa.txt  bbb.txt
```

中身はこんなかんじ

```shell-session
[bitnami@ /tmp/com_xargs]$ cat aaa.txt bbb.txt
asdf
qwer
34

qweriu
qweuf
werpoi
```
たとえばこんな感じでコマンドを打ってみる。

```shell-session
[bitnami@ /tmp/com_xargs]$ ls | xargs wc
 4  3 14 aaa.txt
 3  3 20 bbb.txt
 7  6 34 total
```
これは、aaa.txtとbbb.txtに対してwcコマンドを打ったのと同等。
つまり、「lsの結果をwcコマンドに渡すことができる」

一応-pオプションでどういうコマンドが実行されているのか確認してみる。

```shell-session
[bitnami@ /tmp/com_xargs]$ ls | xargs -p wc
wc aaa.txt bbb.txt ?...
```
見ての通り、「wc aaa.txt bbb.txt ?...」と書かれている。たしかにwcコマンドの引数としてlsの結果を渡せていることがわかる。ここでyを入力してenterを押すと、実行される。
（-pオプションはデバッグに便利なのでぜひ覚えたいところ）

ちなみに、もしxargsを使わずにうつと、こうなってしまう。

```shell-session
[bitnami@ /tmp/com_xargs]$ ls | wc
      2       2      16
```
これはどういうことかというと、以下の結果を直で（つまりaaa.txtとbbb.txtと書かれたファイルと考えるとわかりやすい）wcコマンドに渡しているとかんがえることができる。

（ちなみにwcコマンドの意味は左から、行数、単語数、バイト数）

```
[bitnami@ /tmp/com_xargs]$ ls | cat
aaa.txt
bbb.txt
```
ゼロから始めるLeetCode Day59 「1221. Split a String in Balanced Strings」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day58 「20. Valid Parentheses」](https://qiita.com/KueharX/items/053b6903b5059a781baa)

今はTop 100 Liked QuestionsのMediumを優先的に解いています。
Easyは全て解いたので気になる方は目次の方へどうぞ。

[Twitter](https://twitter.com/kueharx)やってます。


# 問題
[1221. Split a String in Balanced Strings
](https://leetcode.com/problems/split-a-string-in-balanced-strings/)
難易度はEasy。

問題としては、文字列`s`が与えられます、この文字列の中には`'L'`か`'R'`しか入っていません。
これらの文字数が等しい文字列を最大量のバランスが取れた文字列で分割し、その分割の最大量を返してください。

自分で翻訳しててもわかりづらいのでとりあえず例を見てみましょう。

>Input: s = "RLRRLLRLRL"
Output: 4
Explanation: s can be split into "RL", "RRLL", "RL", "RL", each substring contains same number of 'L' and 'R'.

>Input: s = "RLLLLRRRLR"
Output: 3
Explanation: s can be split into "RL", "LLLRRR", "LR", each substring contains same number of 'L' and 'R'.

>Input: s = "LLLLRRRR"
Output: 1
Explanation: s can be split into "LLLLRRRR".

>Input: s = "RLRRRLLRLL"
Output: 2
Explanation: s can be split into "RL", "RRRLLRLL", since each substring contains an equal number of 'L' and 'R'

こうすると分かりやすいですね。


# 解法

```Python
class Solution:
    def balancedStringSplit(self, s: str) -> int:
        count = 0
        total = 0
        for i in s:
            if i == "R":
                count += 1
            else:
                count -= 1
            if count == 0:
                total += 1
        return total
# Runtime: 28 ms, faster than 74.00% of Python3 online submissions for Split a String in Balanced Strings.
# Memory Usage: 13.9 MB, less than 40.98% of Python3 online submissions for Split a String in Balanced Strings.
```

二つ変数を用意して差し引きをするだけ！

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

というのもあれなのでdiscussから一行の解答を持ってきました。

```python
class Solution:
    def balancedStringSplit(self, s: str) -> int:
        return list(accumulate(1 if c == "R" else -1 for c in s)).count(0)
# Runtime: 28 ms, faster than 74.00% of Python3 online submissions for Split a String in Balanced Strings.
# Memory Usage: 13.8 MB, less than 62.73% of Python3 online submissions for Split a String in Balanced Strings.
```
こういうのって実際のコーディング面接で書いたらどうなるんでしょうね？
どっちかというとアルゴリズムを設計するフローが大変なので論点にはならないかもしれませんが。
上のような長いけど確実な方法と少しあやふやだけどこういう書き方をするのが正しいのか。

僕が受けるならおそらく間違いがない方を選んでしまう気がします。
あたふたしたくないですし。


今回はここまで。お疲れ様でした！