OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで競馬サイトWebスクレイピング

# PythonでWebスクレイピングする方法
## この記事について
何番煎じになるか分かりませんが、競馬サイトの情報をCSV形式に落とし込む方法について記載していきます。
使用する言語はPython 3.6、環境はJupyter Notebookを使用しています。

筆者はPythonは不慣れなため、冗長コードやもっとスマートな手法があるかと思います。
しかし、今回は綺麗なコードを作ることが目的ではないので、今後の改善点と認識しつつも良しとしています。

## スクレイピング先
以下のサイトから情報を抜出します。
サイト名：netkeiba.com （https://www.netkeiba.com/?rf=logo）

## # URL生成のための事前知識
netkeiba.comでは、レースごとにWebページが存在します。
このWebページのURLは以下のルールで決められています。

https://race.netkeiba.com/race/result.html?race_id=開催年+競馬場コード+開催回数+日数+レース数+&rf=race_list

東京競馬場で2020年5月3日に開催された2回 東京 4日目 第1レースを例にして当てはめていきます。

- 開催年：2020（=2020年）　
- 競馬場コード：05（=東京）
- 開催回数：02（=2回）
- 日数：04（=4日目）
- レース数：01（=第1レース）

|競馬場名|競馬場コード|
|:----------:|:---:|
|札幌|01|
|函館|02|
|福島|03|
|新潟|04|
|東京|05|
|中山|06|
|中京|07|
|京都|08|
|阪神|09|
|小倉|10|

上記を当てはめると以下のようになります。
https://race.netkeiba.com/race/result.html?race_id=202005020401&rf=race_list


# URL生成～情報取得（コード）
URL生成～情報取得までのコードです。

```python:web1.ipynb
# -*- coding: utf-8 -*- 
import csv
import requests
import codecs
import time
from datetime import datetime as dt
from collections import Counter
from bs4 import BeautifulSoup
import re
import pandas

race_date ="2020"
race_course_num="06"
race_info ="03"
race_count ="05"
race_no="01"
url = "https://race.netkeiba.com/race/result.html?race_id="+race_date+race_course_num+race_info+race_count+race_no+"&rf=race_list"

# 該当URLのデータをHTML形式で取得
race_html=requests.get(url)
race_html.encoding = race_html.apparent_encoding  
race_soup=BeautifulSoup(race_html.text,'html.parser')
print(url)
```

上記を実行すると、生成されたURLが表示されます。

# 表の取得（コード）
取得したHTMLテキストから表を取得するコードになります。
（上記コードに追記）

```python:web1.ipynb
# レース表だけを取得して保存
HorseList = race_soup.find_all("tr",class_="HorseList")

# レース表の整形
# レース表を入れるリストを作成
Race_lists = []
# 表の横列の数=15("着順,枠,馬番,馬名,性齢,斤量,騎手,タイム,着差,人気,単勝オッズ,後3F,コーナー通過順,厩舎,馬体重(増減))
Race_row = 15

# 出馬数をカウント
uma_num = len(HorseList)

#　無駄な文字列を取り除いてリストへ格納
for i in range(uma_num):
    Race_lists.insert(1+i, HorseList[i])
    
    Race_lists[i] = re.sub(r"\n","",str(Race_lists[i]))
    Race_lists[i] = re.sub(r" ","",str(Race_lists[i]))
    Race_lists[i] = re.sub(r"</td>",",",str(Race_lists[i]))
    Race_lists[i] = re.sub(r"<[^>]*?>","",str(Race_lists[i]))
    Race_lists[i] = re.sub(r"\[","",str(Race_lists[i]))
    Race_lists[i] = re.sub(r"\]","",str(Race_lists[i]))
    print(Race_lists[i])

```

上記を実行すると、以下のように出力されます。
　1,1,1,レッドカルム,牝3,54.0,石橋脩,1:25.7,,3,4.6,37.1,,美浦奥村武,512(-4),
　2,6,12,サンキーウエスト,牝3,54.0,岩部,1:25.7,ハナ,2,3.2,36.5,,美浦萱野,442(-8),
　（以下略）

その他の表も多少の違いはあれど、似たような手順で取得できます。


# CSV形式で保存（コード）
ほしい情報が取得できたので、CSVファイルで保存します。
（上記コードに追記）

```python:web1.ipynb
# csvを開く
out=codecs.open("./this_race_table"+race_date+race_course_num+race_info+race_count+race_no+".csv","w")
# 今回はわかりやすくするためにCSV内に列名を記載する.(本当は必要ないので注意)
out.write("着順,枠,馬番,馬名,性齢,斤量,騎手,タイム,着差,人気,単勝オッズ,後3F,コーナー通過順,厩舎,馬体重(増減)\n")

# レース表リストの中身をcsvに記入していく
for i in range(uma_num):
    out.write(str(Race_lists[i]+"\n")) 
    
out.close()
```

上記を実行すると、ソースコードファイルが存在するフォルダにCSVが作成されます。

以上でスクレイピングは終了です。

# その他
Librahack事件に代表されるように、Webスクレイピング（クローラ）が違法となる場合もありますので注意してください。
asp.net coreでサービス作ったから宣伝兼ねて技術公開する -3_1.サーバセキュリティ（２段階認証）-

##サーバセキュリティの大切さ
わざわざ伝える必要すらないとは思ってはいるのですが、改めてですね。
サーバを乗っ取られてしまうと、個人情報の漏洩はもちろん。
ハッカーからするといい踏み台になります。

「あなたの所有しているサーバからペンタゴンへのアクセスが行われてます！」という連絡が来たらどんなりアクションをすればよいのでしょうか。

セキュリティを大事にすることは、自分の時間を大事にすることと同意義だと考えております。
私としては、予期せぬ工数が取られることが一番ストレスになるからです。

ということで、２段階認証の設定方法から。


##アカウント設定

１．VPS契約後、サーバアカウントへログインしてください。


２．メニューからアカウント設定画面へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249830/777ebe3c-e163-fb2f-52f0-af005a111934.png)


３．二段階認証等の設定
私の場合、二段階認証と、ログイン通知メールを「ON」にしてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249830/056928e9-dd11-8f73-3bd3-b70f739e5518.png)


##二段階認証ログイン

ConoHaの二段階認証は、Google Authenticatorを使用しております。
詳しくは、ConoHaのページを見てください。
https://support.conoha.jp/c/2stepauthentication/

見やすいので、すぐ出来ます。



次は、APサーバの設定から記事にします。

---

【是非お試しください】※完全無料です
TanaToru -本棚管理サービス-
　https://app.zero-one-system.co.jp/TanaToru/
最近作ったTweetBotについて

## どんなBotか

弊学では以前から大学が発信する学内情報を流してくれるBotを運用してくださっていた人がいて, 昨年度末に卒業され, そのBotが稼働停止となってしまいました.  そのBotには非常にお世話になっていたので, 開発者の方から譲っていただくことも提案してくださいましたが, 自分の勉強がてら, 車輪の再発明ですが, やってみることにしました.

このBotがすることは単純で以下の通りです.

1. 大学の情報が得られるページにログイン
2. 自分が持っているデータとの差分を取ってツイートする

## サーバーでやっていること

### データ取得部

言語: Bash + Node.js
このBotを作るにあたって最初の課題になったところです.
まず, どうやってidやpasswordが必要なページにログインするのかを調べる必要がありました.
JavaScriptを触ったことがあったので, それで目的のページに遷移する方法は調べながら理解しました.
じゃあどうやってJSをサーバーで動かすんだ???ってなって(語彙不足のため調べ方がわからず)数日調べたところ, Selenium webdriver+Node.jsを使えばできそうとのこと.  Node.jsの非同期処理に苦しませられながらも, ウンウン言いながらどうにか実装.  動いた.  嬉しい.
時々ページの取得に失敗します.  そのときはどうしようもないので, 以前のデータを更新しないようにrollbackしてあげます.

### データ整理部

言語: Bash + Python3
得たデータをどうやって管理したらいいんだ？ってなり, また数日.  
データ整理にはいくつか案があって, 

- データ整理せずにそのままにしておく
- データ整理をしてすべてを1つのテキストで管理する
- データ整理をしてすべてを1つのJSONで管理する
- テータ整理をしてそれぞれの内容ごとにテキストで管理する
- データ整理をしてそれぞれの内容ごとにJSONで管理する

あたりだったはずです.  結局このデータ整理部では最後の案を採用して実装を行いました.
このデータ整理もなかなか曲者で, 得たhtmlにはある程度のフォーマットは存在したのですが, 微妙に ~~クソ~~ ぶれていて, その対処が難しかったです.  正規表現でごりっとやりました.

得たデータは前に存在したデータと比較して, 同じデータがあれば削除, 新しいデータに存在しない過去のデータがあればこれまた削除, という　$O(n^2)$　(ただし $ n \le 150 $)で操作をしました.  文字データをhash化して比較すればより早くなるはずです~~が, めんどくさいのでやってません~~.

### データ出力部

言語: Bash + Python3
決まったフォーマットで出力するだけ.
おしまい.

## 調子はいかかが？

そこそこには動いてくれているようです.
つい一昨日なんか1回再起動かかりましたが, 1週間位は安定して稼働してくれたようで作者としては嬉しいことこの上ないです.

## 今後の展望

　まだいくつか課題は残っています.
　取得したHTMLのパターンの例外処理が足りていようで, 時折htmlの構文が混じったまま出力されることがあります.  そんなexampleが集まらなかったのもあって, 最初は対処することができませんでしたが, 今ならできそうです.  そのうちやりたいですね.
　また, エラーメッセージを出し得るので, そのメッセージを取りこぼすことが無いようにSlack等で通知する機能がほしいと思っているので, それの実装をしたいんですが, なんかうまく通知できなくて困っています.  これは早急にやりたいところです.
　あとは, 講義時間の変更のところ.  私がこれを作り上げたときにはまだ春休みで, 講義時間の変更のところの情報がまったくなかったのです.  実験しようがなかったのでしゃあなしにほっていましたが, 今なら作ることができそうです.  そのうち作ります.

といった感じでしょうか.  そこそこに頑張っていきたいですね.
Git 直前のコミットで間違えたファイルをコミットしてしまった

# 目的

- ローカルリポジトリで若干やらかした際の解決方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| Git バージョン | 2.25.1 | Homwbrewを用いて導入 |

# 前提情報

- リモートリポジトリにpushする前のローカルリポジトリで操作ミスをした。
- やらかした内容
    - 実施したかった作業順→`$ git add 修正ファイル`実行後`$ git commit`を実行する。
    - 実際に実行した作業順`$ git add 修正ファイル`実行後`$ git commit --amend`を実行した。

# 発生した問題

- 説明のための記載
    - 「すでにコミットされている最新のコミット」をコミットBとする。
    - コミットBよりさらに新しい、これからコミットする予定のコミット内容Aとする。
    - これからするはずだったコミット内容AのコミットをコミットAとする。
- コミットBにコミット内容Aも含まれた状態になってしまった。

# やりたいこと

- コミット内容Aを含んでしまったコミットBを、修正内容そのままに無かったことにする。
- コミットBとコミットAを別々のコミットとする。

# 解決方法

1. 下記コマンドを実行してコミットBの`$ git commit`を取り消す。

    ```terminal
    $ git reset --soft HEAD^
    ```
1. 下記コマンドを実行してステージング状況を確認する。

    ```terminal
    $ git status
    ```
1. コミットBが取り消された状態になる。(`$ git add`の実行直後状態になる。)
1. 下記コマンドを実行してコミット内容Aのステージングを取り消す。

    ```terminal
    $ git restore --staged コミット内容Aのファイルパス
    ```
Laravel Collection型の配列変換 toArray と all の違い

LaravelのCollection型を配列に変換する方法は `toArray` と `all` の2つの方法があります。
どういった違いがあるのかどちらを使えばいいのかについて調べてみました。

## 環境

- PHP 7.4.5
- Laravel 7.9.2

## tinkerで動作確認

```php
$ php artisan tinker

>>> App\User::get()
=> Illuminate\Database\Eloquent\Collection {#3199
     all: [
       App\User {#3200
         id: 1,
         name: "Reese Kozey",
         screen_name: null,
         email: "alda41@example.org",
         email_verified_at: "2020-05-01 16:25:47",
         api_token: null,
         created_at: "2020-05-01 16:25:47.0",
         updated_at: "2020-05-01 16:25:47.0",
         deleted_at: null,
       },
     ],
   }
```

`App\User::get()` を実行すると [Illuminate\Database\Eloquent\Collection](https://laravel.com/api/7.x/Illuminate/Database/Eloquent/Collection.html) 型が返って来ていることがわかります。

`toArray` で配列に変換してみましょう。

```
>>> App\User::get()->toArray()
=> [
     [
       "id" => 1,
       "name" => "Reese Kozey",
       "screen_name" => null,
       "email" => "alda41@example.org",
       "email_verified_at" => "2020-05-01T16:25:47.000000Z",
       "api_token" => null,
       "created_at" => "2020-05-01T16:25:47.000000Z",
       "updated_at" => "2020-05-01T16:25:47.000000Z",
       "deleted_at" => null,
     ],
   ]
```

続いて `all` メソッドで配列に変換します。

```
>>> App\User::get()->all()
=> [
     App\User {#3217
       id: 1,
       name: "Reese Kozey",
       screen_name: null,
       email: "alda41@example.org",
       email_verified_at: "2020-05-01 16:25:47",
       api_token: null,
       created_at: "2020-05-01 16:25:47.0",
       updated_at: "2020-05-01 16:25:47.0",
       deleted_at: null,
     },
   ]
```

おや？🤔 結果が異なってますね...
`all` の方は2次配列が `App\User` モデルのままです。
`toArray` の方は `App\User` も配列に変換しています。

## 実装

Laravelフレームワークの実際のソースコードはどのように実装されているのか見ていきましょう。

### toArray

https://github.com/laravel/framework/blob/7.x/src/Illuminate/Support/Traits/EnumeratesValues.php#L752-L762

```php:src/Illuminate/Support/Traits/EnumeratesValues.php
    /**
     * Get the collection of items as a plain array.
     *
     * @return array
     */
    public function toArray()
    {
        return $this->map(function ($value) {
            return $value instanceof Arrayable ? $value->toArray() : $value;
        })->all();
    }
```

[Arrayable](https://laravel.com/api/7.x/Illuminate/Contracts/Support/Arrayable.html) インターフェースを実装したオブジェクトのインスタンスがあれば再帰的に `toArray` を実行していき通常の配列に変換します。

### all

https://github.com/laravel/framework/blob/7.x/src/Illuminate/Support/Collection.php#L53-L61

```php:src/Illuminate/Support/Collection.php
    /**
     * The items contained in the collection.
     *
     * @var array
     */
    protected $items = [];

    /**
     * Get all of the items in the collection.
     *
     * @return array
     */
    public function all()
    {
        return $this->items;
    }
```

`all` メソッドは実装がとてもシンプルですね✨
`$items` プロパティをそのまま返してます。

## 結論

実行コストが少ない `all` メソッドを使用するべきです。
再帰的に配列に変換する必要がある場合は `toArray` メソッドを必要に応じて使用しましょう。

現場からは以上です。
ReactのReducerメモ

###1.Reducerの記述

```accountReducer.js 
// ここからstate
const DEFAULT_STATE = {
  list: [],
  selected: new FAMILY({})
}

//　ここからReducer
// 古いstateを取り出して、actionを受け取る
export default (state = DEFAULT_STATE, action) => {
　// actionのタイプによって振る舞いを変える
  switch (action.type) {
    case SET_ACCOUNT:
      return { ...state, me: action.payload }
    case SIGN_IN_ACCOUNT:
      return { ...state, me: action.payload.me, authToken: action.payload.authToken, isLoggedIn: true }
    case SIGN_OUT:
      return DEFAULT_STATE
    default:
      return state
  }
}
```

stateの中にはlist, selected, meなどの細分化されたstateがある。
actionがきっかけとなってこれらの更新を行うのがReducer

:point_up_tone1:例）車
Reducerがない：　車のガソリンが勝手に抜かれる、なくなる→困る
Reducerがある：　走るという行為(action)によってのみガソリンがへる

###２.各ReducerをindexReducerにコンバインする

```indexReducer.js
import family from './familyReducer'
import familyReducer from './familyReducer'

export default history =>
  combineReducers({
    router: connectRouter(history),
    account: persistReducer(authPersistConfig, account),
    app,
  })
```

こうすると以下で取ってこれる
```
const mapStateToProps{(family)}
```

##PersistReducerは永続化
ブラウザにはローカルストレージというものがある
（whitelistという箱を使う）
→ブラウザにデータを保存するので、ページをリロードしたり、タブを消した時にもデータが引き継がれる（永続化される）

```indexReducer.js
const authPersistConfig = {
  key: 'auth',
  storage: storage,
  whitelist: ['id', 'authToken'],  //ここ
}
```


####メモ
オニオン型のアーキテクチャを理解する
Rolling Update vs Recreate

DeploymentやDaemonSetsはPODアップデートの戦略(Strategy)を指定できる。

指定できる戦略の代表は下記の二つ
- Recreate
- RollingUpdate

#Recreate
ReplicaSet一度すべてのPODを削除してから再度PODを作成しアップデートする。
この方法ではダウンタイムが発生する。

- メリット:
ReplicaSet内のすべてのPODを削除したのちに再度PODを作成するので、
限られたリソースでもアップデート可能。
また、RollingUpdateと比較して高速。
- デメリット:すべてのPODが一度削除されるのでダウンタイムが生じる

```Recreate-Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  strategy:
    type: Recreate
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
```
specにてStrategyを指定する。type以外に設定項目はない。

#RollingUpdate
ReplicaSetを2つ用意し、PODの一部ずつアップデートを実施できる。

- メリット:
ダウンタイムが生じない。
- デメリット:
アップデートに稼働リソース以上のリソースが必要

```Rollingupdate-Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnaveilable: 0
      maxSurge: 1
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
```
maxUnavailabelはアップデート中に許容できる不足POD数を指定できる。
maxSuegeは超過できるPOD数を指定できる。
上のマニュフェストではPODの1つまで不足と0つの超過を許容している。

上のマニュフェストでのRollingUpdateのReplicaSetの推移の例

| Old ReplicaSet   |New ReplicaSet |
|:-----------------|:------------------|
| 3            |0 |
| 2  |0 |
| 2            |1 |
| 1  | 1 |
| 1           | 2 |
| 0  |3 |

```
maxUnavailable: 25%
maxSurge: 25%
```
maxUnavailabelとmaxSuegeは％で指定することが可能

#ロールバック
Deploymentはロールバックをすることができる。
リヴィジョンはロールアウト時にPODの.spec.template変更されたときに記録される。

ロールバックの実行
--to-revisionで特定のリヴィジョンを指定できる

```
kubectl rollout undo deployment/sample
```

ロールアウトのステータスの確認

```
kubectl rollout status deployment/sample
```
ロールアウトの履歴を確認

```
kubectl rollout history deployment/sample
```
#参考文献
- Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests
- Kubernetes 完全ガイド
- Kubernetes公式ドキュメント - https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/#rolling-back-a-deployment
asp.net coreでサービス作ったから宣伝兼ねて技術公開する -3.VPSサーバ契約-

##サーバ選定

かなり期間が空いてしまったので、かなりうるおぼえ（なぜか変換できない）になってしまってますが、メモとして残します。

まずはサーバ契約！
色々と選定はしたのですが、やっぱりクラウドは怖い。
何が怖いって、最大金額が未知数なのが怖い。

無料期間やら、様々なサービスが魅力的であることは間違いないのですが、時たま見るQiitaの記事。
**AWSアカウントを乗っ取られて、100万以上の請求が来た！** というような記事。。。

あまりにも恐ろしいかつ、英語が不自由な私からすると潜在リスクが大きいため、やめました。

ということで、決めたのは、ConoHa VPS！キミにきめた！
https://www.conoha.jp/vps/


ちなみにワタクシ的なサーバ要件は以下の通り

- 万が一の事を考え、セキュリティ的にAPとDBを分ける。
- QiitaでのAPS.NET Coreをホスティングする記事が多いので、APサーバはCentOSがインストールできることを条件
- SQLServer for linuxをインストールするには、4GB以上のDBサーバが必要

※ほんとはサーバ費用節約のためにPostgresSQLにしようとしてたんだけど、ASP.NET Coreのモジュールがうまく機能しなくてね。。。



##サーバ環境

契約したサーバはこんな感じになりました。


| サーバ種別 | AP | DB |
|:-----------------|------------------:|------------------:|
| プラン | 2GB | 4GB |
| 月額 | 1,680円 | 3,280円 |
| メモリ | 2GB | 4GB |
| CPU | 3コア | 4コア |
| SSD | 100GB | 100GB |


いやー、経費で落ちなきゃやってられないねーｗ
これも自分の選んだ道、ポジティブに行きましょう。


##使ってみた感想
もう半年くらい使ってみたのかな？
満足度は高めです。

まぁ他のサーバ等をそんなに使った経験はないので、「いや、普通どのサーバもそうだよ」というツッコミはお控えください （・人・）


###良い点１
「OS設定時に再インストールがかなり容易」
ConoHaサーバが契約した方は、ブラウザから諸々設定が行なえます。

以下のキャプチャはサーバの設定情報ですが、サーバのスタート・再起動・シャットダウンなどはもちろん。
OSの再構築も行えると。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249830/6d2513b7-4e91-fcb8-24ea-eec922fdc51d.png)


私のイメージでは、初期化後、OSイメージ（5GBくらい）をサーバへアップロードして、SSHでコマンドを叩くイメージだったのですが、今はここまで便利になっているのかと。


###良い点２
「２段階認証機能が標準である」
逆に言えば、ブラウザ上で認証できてしまえばいくらでも乗っ取れてしまいます。
どのサーバでも同様ですが、２段階認証は必須機能となります。
これがあるとないとでは大違いですね。


###良い点３
「サーバの処理速度がまぁまぁ速い」
いうほど重いアプリ作ってたくさんユーザが使ってるわけでないので、完全に当てにならないですね。
これは参考になりませんが、感想ということなので。




##次回、セキュリティについて
やるべきことはやったと思うので、ところどころ公開します。
サーバセキュリティのプロからすると、甘いのかもしれない。。。
恐る恐るですが、書いていきます。
※ 冒頭の「うるおぼえ」はネタです。スルーしてください。


【是非お試しください】※完全無料です
TanaToru -本棚管理サービス-
　https://app.zero-one-system.co.jp/TanaToru/
Atcoder ABC166 A-EをPythonで

また4完でした。Eは解説AC。コンテストのコードそのまま載せてるのでお見苦しい部分があるかもしれませんがご容赦ください。

#A. A?C
入力がABCだったらARCを、そうでなければABCを返す

```ABC166a.py
s=input()

if s=="ABC":
    print("ARC")
else:
    print("ABC")
```

#B. Trick or Treat
全てのお菓子に関して、持っている子どものindexを+1する。最後にお菓子を1つも持っていない子を数え上げて出力。

```ABC166b.py
n,k=map(int,input().split())
d=[]
a=[]
for i in range(k):
    d.append(int(input()))
    a.append(list(map(int,input().split())))
    
aa=[0]*n

for j in a:
    for k in j:
        aa[k-1]+=1 #お菓子を持っている子のindexを+1
        
ans=0

for x in aa:
    if x==0:
        ans+=1 #お菓子を1つも持っていない子は0なので、その子の数を数える

print(ans)
```

#C. Peaks
頂点数と同じ長さの配列を用意し、2つの頂点の高さを比べて低いほうの頂点を+1する。高さが同じであれば両方とも+1する。最後に値が0である頂点の数を出力する。
ちなみに1本の道とは、一筆書きで行ける道ではなく頂点に繋がっている道のみという意味でした。勘違いして時間ロスした。

```ABC166c.py
import copy

n,m=map(int,input().split())
h=list(map(int,input().split()))
l=[]
for i in range(m):
    a,b=map(int,input().split())
    l.append([a,b])
    
ll=[0]*n

for j in l:
    if h[j[0]-1]>h[j[1]-1]:
        ll[j[1]-1]+=1
    elif h[j[0]-1]==h[j[1]-1]:
        ll[j[1]-1]+=1
        ll[j[0]-1]+=1
    else:
        ll[j[0]-1]+=1

ans=0
#print(ll)
for k in ll:
    if k==0:
        ans+=1
print(ans)
```
#D. I hate factorization
$A$も$B$も制約が無いので総当たりでTLEにならない程度：1000個くらい用意して計算したら通った。[公式による解説](https://img.atcoder.jp/abc166/editorial.pdf)見ると負の数含めて250個くらいで十分だそうです。負の数のべき乗根はまともに出力してくれないので一度absを取る必要あり。

```ABC166d.py
x=int(input())
l=[]

for i in range(300): #300**5=2430000000000以下のx^5で表せる数（-x含む）を追加
    a=i**5
    l.append(a)
    l.append(-a)
        
for j in l:
    for k in l:
        aa=j-k
        if j!=k and aa==x:
            ans=[]
            for z in [j,k]:
                aaa=abs(z)**(1/5) #5乗根
                if z>=0:
                    ans.append(int(aaa))
                else:
                    ans.append(int(-aaa))
            print(*ans)                
            exit()
```

#E. This Message Will Self-Destruct in 5s
アプローチに関しては [公式による解説](https://img.atcoder.jp/abc166/editorial.pdf)を参照。インデックス値と身長の和と、インデックス値と身長の差をそれぞれ用意する。その後2つの値が一致するようなパターンの数を数える。具体的には2つの配列lとrを用意し、lの各要素に関して同じ値を持つrの数を数える。
count使ったらTLEになったので、Counter使って連想配列として格納し、get使って取り出すと通った。どのくらい早くなっているかは検証していませんが・・・

```ABC166e_TLE.py
from collections import Counter

n=int(input())
a=list(map(int,input().split()))
ans=0
l=[]
r=[]
for i,j in enumerate(a):
    l.append(i+j)
    r.append(i-j)

for i in l:
    ans+=r.count(i)
    
print(ans)
```

```ABC166e.py
from collections import Counter

n=int(input())
a=list(map(int,input().split()))
ans=0
l=[]
r=[]
for i,j in enumerate(a):
    l.append(i+j)
    r.append(i-j)

b=Counter(r)
for i in l:
    ans+=b.get(i,0)

print(ans)
```

Dまでを30-40分くらいで解けないと水色への道は開かれませんね。がんばらねば
[JavaScript] コールバック関数をやめてPromiseでスッキリさせよう

JavaScriptのコードを書いていると、何かを処理した後に呼ばれるコールバック関数が増えてきて、書いていくのが面倒だと感じていた(いわゆるコールバック地獄に陥る)のですが、Promiseオブジェクトを使うと綺麗にまとめられます。

# 要約

詳細な説明は [MDNのドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise) などを読んでいけば分かりますが、長い文章が出てくるので面倒に感じてしまいます。

* Promise
  * https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise

分かってしまえばそんな難しいことではなかったです。ちゃんと覚えようとすると上の説明のように長くなってしまうので、ここでは簡単な説明だけに留めて、とりあえずPromiseを使ってみようとするまでの手順をまとめました。

## 呼び出し側

* 処理したい関数に続けて、成功した時の処理を `.then()` の中に書き、失敗した時の処理を `.catch()` の中に書きます

ここでは、 `jobInsert()` 関数を実行して、成功した時に `res.send()` を実行して、失敗した時に `res.status(500)` を実行する例を考えてみます。

```javascript:Promise呼び出し側の例
jobInsert(req.body).then(result => {
    // 成功した時
    res.send(result);
}).catch(error => {
    // 失敗した時
    res.status(500).send(error);
});
```

`.catch` を書かずにカンマ区切りで成功時の処理と失敗時の処理を続けて書くこともできますが、分かりにくい気がしますので、上記のように書くのがいいと思います。

## 処理側

* Promise オブジェクトを返す関数を作り、成功時に `resolve()` 、失敗時に `reject()` を実行します
* `resolve()` と `reject()` の引数はそれぞれ、呼び出し側に渡る `result`、 `error` の値になります

```javascript:Promiseを返す処理の例
function jobInsert(body) {
    return new Promise((resolve, reject) => {
        if (xxxxxxxx(body)) {  // 何かの処理
            // 成功時
            resolve("OK");
        } else {
            reject("NG");
        }
    });
};
```

## 連続した処理

* `.then()` を繋げてPromiseを返す複数の処理を続けて書くことができます
* 複数の処理を続けた場合でも、エラー時の `.catch()` は一つで済ませられます

```javascript:複数の処理を続ける例
firstFunction(req.body).then(result => {
    // 1つ目の処理が成功した時
    secondFunction(result);
}).then(result => {
    // 2つ目の処理が成功した時
    res.send(result);
}).catch(error => {
    // 失敗した時
    res.status(500).send(error);
});
```
Windows + VSCode + TypeScriptでHello World 

## 目的
TypeScriptでHello World作って実行したい
エディタはVSCodeを使いたい

## まとめ
typescriptインストールの為にnpmが必要
npm利用及びトランスパイル後のJavaScript実行の為にnode.jsが必要
node.jsのバージョン管理にnvmが必要

## 環境
Windows10 Home
node.js 14.1.0
VSCode 1.44.2

## VSCodeをインストール
https://code.visualstudio.com/

## nvm-windowsとnode.jsをインストール
node.jsをインストール（バージョン管理）するためにnvm-windowsを利用する
https://docs.microsoft.com/ja-jp/windows/nodejs/setup-on-windows

## TypeScriptインストール
npmでインストールする

### グローバル（PC全体）にインストールする場合

```
npm install -g typescript
```

インストール場所の確認

```
npm root -g
```


### プロジェクト（カレントフォルダ）にインストールする場合

```
npm init
npm install typescript
```

## 実装してトランスパイル

トランスパイル後、Hello.tsと同じフォルダにHello.jsが作成される事を確認

実装

```Hello.ts
let message: string = 'Hello World!';
console.log(message);
```

トランスパイル

```
.\node_modules\.bin\tsc Hello.ts
```

## 実行
nodeコマンドでJavaScript実行

```
node Hello.js
```
AtCoderで茶色になるまでにやったこと 

## 出落ちでは？

まずこれを見てみてください.
![Screenshot from 2020-05-03 23-15-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494471/d2dbb448-4624-0e51-b249-4bd6da31e1ae.png)
https://atcoder.jp/users/estis
実に9ヶ月ぶりの色変ですね.  泣いています.

## 何があったのか

私にもわからん（画像略）
最近の精進の様子をいくつか載せてみます.
[AtCoder Problems](https://kenkoooo.com/atcoder/)さんより, 
![Screenshot from 2020-05-03 23-18-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494471/2af1ef8d-687d-5581-2ec2-dcc6422261b7.png)
![Screenshot from 2020-05-03 23-19-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494471/550f8f70-46cd-fee8-166c-fb35c16f3ab3.png)
![Screenshot from 2020-05-03 23-19-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494471/a6e56847-6c6e-7b9b-650d-db52742c7eff.png)

最近, 中学以来の友人がAtCoderを始めたのもあって競プロ熱が再燃しまして, 以前の自分に比べてちょっとがんばってみたのが上の写真群になります.  実際longest streakは過去最高を更新し続けてますし, AtCoder ProblemsさんのBoot camp for BeginnersではHardがあと5問というところまで進むことができました.  ClimbingやHeatmapなんか見ても露骨ですね.

(ｽｩｰｰｰｯ)ところで, こちらは[AtCoder Scores](https://atcoder-scores.herokuapp.com/)さんの精進グラフと実レートとの対比です.
![Screenshot from 2020-05-03 23-27-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494471/e263ec4a-c116-9b0b-d6b2-c66eb481fdc5.png)

これをみてなにか思ったことがある人は手を挙げてください.  はいそこの圓tisさん早かった.
「精進を始めたあたりで大きく下がり始めたね.」
そうですね.  疑似相関です.  
こう, 自分の中で努力した！！！って気持ちが逸ってるところでこういうのに出会うとめちゃくちゃ心が折れそうです.  今(5/3 23:55現在)はまだ泣いてません.  泣きそうです.

## さてこれからは......？

またまた[AtCoder Problems](https://kenkoooo.com/atcoder/)さんより, PointStatusですね.
![Screenshot from 2020-05-03 23-38-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494471/1a73e4c8-90f4-2660-561a-11ecb390ed44.png)
これを見ると, 緑diffくらいなら半分以上解けるはず?水は解けないのがまだまだ多そうだなぁという感想を得ると思います.  得ましたね？  得ました.  とりあえずぼくがいまできることはただ精進を積む, 安易な考えかもしれませんが, 水下位辺りまでの問題を解くことを目標に頑張りたいところです.

過去問を解いているとちゃんと自力でACできてるのが増えてきてるし, モチベも昨年の最強コンで出会った2人と友人とで足りています.  
ここ最近のが自分にはまってないだけの可能性は考えましたが, それのせいにするにはやはり何か厳しいものがあると思うところでございます.

一体全体ぼくはどこに向かっていくんでしょうね......
なにかこう(手をｺﾈｺﾈしながら), この状況を打開したいんですけど......
Automation Anywhere Enterprise A360 細かすぎるTips集

いろいろいじっている中で引っかかりがちだと判断したものや、役立ちそうなものを書いていきます。
ただ、細かすぎるネタも多いと思うのでこんなタイトルにしておきました。

何かあればここに追加していきます。

# Bot Agentを使用する場合、OSやPCスペックは必ず満たす必要がある
Enterprise A360はWebブラウザでアクセス出来て手軽に扱えますが、
実際にBotを動かす際にはBot Agentをインストールする必要があります。
この作業自体も画面の案内に沿って入れるだけなので、あまり苦労しませんが、このBot Agentをインストールできる要件は結構厳しめなので要注意です。
ドキュメンテーションの要求仕様を満たしていれば問題なく使用できますが、
具体的には、試用や代用で廉価なPCを使おうとする際に、使えなかったりします。
（CPUがAtomだったり、Windows 10ではないOSだったり、Windows 10でもHome Editionだったり。）

# Botが実行されない （PCのローカルユーザー名とAD上のユーザー名で同一のものがあるケース）
レコーダーやBotの実行時にエラーが出て動かないケースがありますが、その原因となる一つとして、
PCのローカルユーザーとActive Directory上のユーザー名で同一のものがある。ということがあります。
回避方法としてはA360が認識しているユーザーのほうへ、A360が使用するローカルファイルのあるフォルダへのアクセス権を付与することです。
（詳細は技術サポート窓口まで。）

# ループアクションで反復子が「n回」の場合、ループ回数を変数に割り当てられる
画像の通りで、わざわざカウンター変数をIncrement（加算）したりしなくても良かったりします。
他の条件でも使えるようにしてほしいけど。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/b896aceb-6173-c04e-49d4-ad1f0aaaed05.png)
【swift5】xcode11　動物おみくじ

<img width="1440" alt="スクリーンショット 2020-05-03 23.52.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627010/d9c9ad05-1a15-d062-8293-b1bb7624603e.png">

<a href="https://www.youtube.com/watch?v=zucSRZcoPM0&list=WL&index=35&t=0s">参考動画</a>

【学んだ点】
・ランダムでテキストを出す
【Docker, Rails 5】Autoprefixer doesn’t support Node v4.8.2. Update it エラーについて

Railsで突如出たこのエラー。

直訳すると、

「Autoprefixer機能はNode.jsのバージョン4.8.2ではサポートしておりません。アップデートしてください。」

<img width="1007" alt="スクリーンショット 2020-05-03 21.18.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620533/5c87850c-603e-3fe5-2cd8-7d53dcb858c4.png">

Node.jsのバージョンを変更しろと怒られているようです。

調べてみると、Dockerを使ってapplicationを作っていると起きるエラーのようで、

Dockerfileの
<img width="394" alt="スクリーンショット 2020-05-03 22.14.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620533/50b59141-90fa-21c9-2830-c61e9449808f.png">

網掛けの部分を、

<img width="717" alt="スクリーンショット 2020-05-03 23.24.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620533/2a4d23dd-1deb-8826-566d-6d69e8b6d0d6.png">

に直すと無事通りました。
[Docker]Rails6 + Postgres 環境構築時エラー対処

### 開発環境
- MacOS 10.13.6
- Docker version 19.03.8

参考記事：[Dockerを使ってRails6環境の構築をしてみる](https://qiita.com/me-654393/items/ac6f61f3eee66380ecd7) 

ほぼ記事の通りに進めていました。
（一点だけ修正したのは、`Dockerfile`１行目でRubyのバージョンを`2.6.5`と指定しました）

### 問題
`$ docker-compose build`まではうまく出来ていましたが、
今回エラーが出たのは、__2-3.データベースの設定と作成__ のところでした。

```
$ docker-compose run web rake db:create
Starting scraperb_db_1 ... done
could not translate host name "db" to address: Name or service not known
Couldn't create 'myapp_development' database. Please check your configuration.
rake aborted!
PG::ConnectionBad: could not translate host name "db" to address: Name or service not known
.
.
.
Tasks: TOP => db:create
(See full trace by running task with --trace)
```

### 解決策
一旦、コンテナをすべて削除することで解決しました。
（実際のところ削除しても再発することはあり、何度目かで成功したので問題の本質は分からないままです）

```
$ docker rm -f $(docker ps -aq)
```
`docker ps -aq`とするとすべてのコンテナの`ID`のみを返してくれるので、
それを`docker rm -f <CONTAINER ID>の引数に渡します。
`-f`は`--force`の略で強制的にという意味です。
Rakeエラー rake spec rake aborted!

Railsでrake specを使い、rspecを実行しましたが、NoMEthodErrorになりました。

##仕様

```Gemfileにrakeを追加する
# A sample Gemfile
source "https://rubygems.org"

gem "rspec", ">= 3.0.0"
gem "rake"
```

Rakefileを作成する

```
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec)
task :default => :spec
```

rakeコマンドでspecを実行

```
$ bundle exec rake spec
```
##エラー

```
$ bundle exec rake spec
rake aborted!
NoMethodError: undefined method `last_comment' for #<Rake::Application:0x00007fb211222548>
/Users/yuki/rspec_test/Rakefile:3:in `new'
/Users/yuki/rspec_test/Rakefile:3:in `<top (required)>'
/Users/yuki/.rbenv/versions/2.5.1/bin/bundle:23:in `load'
/Users/yuki/.rbenv/versions/2.5.1/bin/bundle:23:in `<main>'
(See full trace by running task with --trace)
```

##解決方法

gemのバージョンを指定し直し、bundleし直しました。

```
# A sample Gemfile
source "https://rubygems.org"

gem 'rspec', '~> 3.0.0'
gem 'rake', '< 11.0'
```
するとエラー回避、正常に働きました！

```
$ bundle exec rake spec
/Users/yuki/.rbenv/versions/2.5.1/bin/ruby -I/Users/yuki/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rspec-core-3.0.4/lib:/Users/yuki/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rspec-support-3.0.4/lib -S /Users/yuki/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/rspec-core-3.0.4/exe/rspec ./spec/hello_spec.rb
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}

Hello
  message return hello

Finished in 0.00169 seconds (files took 0.16417 seconds to load)
1 example, 0 failures

Top 1 slowest examples (0.00114 seconds, 67.4% of total time):
  Hello message return hello
    0.00114 seconds ./spec/hello_spec.rb:4
```
『アドレナリンジャンキー~プロジェクトの現在と未来を映す86パターン~』から考える開発プロジェクトのアンチパターン

# はじめに
皆様、こんにちは。
佐久間まゆちゃんのプロデューサーの@hiroki_tanakaです。

私は新卒で大手独立系SIer入社し4年間、BtoB向けの大規模基幹システム構築プロジェクトにいくつか携わりました。
(今はWeb系スタートアップに移り、自社プロダクトの開発を行っています。)
それぞれのプロジェクトに特徴や個性はありましたが、全てに共通して言えることはどれも大変で計画通りの完璧なプロジェクトはありませんでした。
そんな中で[『アドレナリンジャンキー~プロジェクトの現在と未来を映す86パターン~』](https://www.amazon.co.jp/dp/B00FS2X0P2/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)という有名なプロジェクト管理の本を読んだのですが、非常に参考になったのでまとめました。
(私のように開発現場で戦っている人の少しでも役に立てれば、と思っています。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105636/2f601a2e-eaf1-6306-84c2-6206077bf66f.png)

# 『アドレナリンジャンキー~プロジェクトの現在と未来を映す86パターン~』とは
[『アドレナリンジャンキー~プロジェクトの現在と未来を映す86パターン~』](https://www.amazon.co.jp/dp/B00FS2X0P2/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)は2009年に出版されたソフトウェア開発のプロジェクトによく見られる86のパターンを抽出し、失敗に向かう兆候や逆にうまく回っている特徴を紹介した本です。
著者は5人のエンジニアで中には『ピープルウェア』や『熊とワルツを』で有名なトム・デマルコとティム・リスターもいます。
この本はプロジェクトマネジメントの本のため、読んでもコーディングスキルをはじめとする技術的な知識は殆ど身に付きません。
また、86のパターン1つ1つはどれも2〜3ページで紹介されているため、非常に読みやすいです。

# 開発プロジェクトのアンチパターン
## アドレナリンジャンキー
>アドレナリンジャンキーなプロジェクトは猛烈に動き回ることが健全な生産力のあかしだと信じている。
アドレナリンジャンキーなプロジェクトの特徴は、優先順位が絶えず変化する。すべては「きのう」必要である。納期までの時間が足りた試しがない。タスクは全て急ぎだ。次から次へと緊急のタスクがやってくる。誰もが猛烈に忙しい。それも、いつも。

私はいつも炎上プロジェクトに身を置いていたため、アドレナリンジャンキーなプロジェクトには心当たりしかありませんでした。
アドレナリンジャンキーなプロジェクトではメンバは物事を戦略的に考えなくなっていきます。緊急性のみを基準にタスクを行うようになります。
長期的に見れば得られるものが大きくても現在のタスクは緊急度が高くなければ、後回しにされます。
そして、その後回しにされたタスクはある日降って湧いたように緊急度が高くなり、その時になって初めて着手されます。
メンバが戦略的に考えず、短期視点のみでシステムを構築していくとアーキテクチャからソースコードまで暫定対応が多くなり、プログラムのエントロピーも増大し、拡張性・保守性の乏しいシステムとなります。
アドレナリンジャンキーなプロジェクトは緊急度の高い切迫した事態に対応することを、みごとな機動力と勘違いしていることが多く、それによってますます自制が効かなくなります。
アドレナリンジャンキーなプロジェクトの治し方は、いつも緊急事態ではプロジェクトは最大限の成果をあげられないと理解しているマネージャーを据えるしか方法がないと思われます。

## アトラス
>チームリーダがあらゆることに長けている。
彼女はリーダに求められていることは殆ど全てやっている。ただ1つのことを除いては。
完全なリーダでありマネージャーであるために、重要なリーダやマネージャーの仕事を何一つチームメイトに任せないのだ。
その結果、メンバをリーダーとして育てていない。

チームの最も仕様を理解し、技術が分かるリーダに全てが集まってきて、メンバに意思決定させるのではなくリーダが全ての意思決定を行うという方法は、
往々にして少人数の時はうまく回ると思います。
ただ、同時に以下の3つの問題にぶつかると思います。
1. 上記の通り、将来のリーダであるメンバの成長機会を奪ってしまっています。そのリーダの元では永遠にメンバからリーダになれる人がいません。
2. 少人数の時は上手くいくかもしれませんが、スケーラブルではありません。100人のチームの全ての意思決定に関わることはどんなに優秀なリーダでも不可能です。そのため、そのリーダは大きな仕事ができません。
3. リーダが突然いなくなった場合にプロジェクトが立ち行かなくなります。

## 「野球に泣くなんてのはないんだ」
>感情を表に出すことを否定する文化は対面を水面下に潜らせてしまう。
知的労働業界の多くが、職場で感情を表に出すことは許されないという不文律を採用している。
気に入らない決定を知って、会議の場で泣き出したり怒りを爆発させたりした人はプロらしくないと切り捨てられてられる。
しかし、感情の発露を許すかどうかを判断する際は、仕事を大事にしていなければ仕事に感情が入り込むこともないということを覚えておくと良い。

ソフトウェア開発は別業界・業種から見れば感情とは無縁な仕事に思えますが、実際は感情が高ぶることも多く、関係者以外には到底理解できないようなものに情熱的になります。
そのため、もし職場での感情の発露を不許可とし、感情の排除したいならば、仕事のことなど気にかけない人材を採用すれば解決します。
しかし、それではプロジェクトは失敗してしまうと思います。
自分の仕事に情熱的になれる人をプロジェクトに投入することは、成功の秘訣です。
感情や情熱は時に爆発することもありますが、その後始末くらいはプロジェクトの成功という高い目標の達成への代償の一部だと思います。

# おわりに
本書を読んでパターンを暗記するや知識とするのではなく、様々なパターンに触れて開発現場での直感を磨きたいです。
「このままだとあのパターンに入りそうだ…止めるためには何が出来るだろう？」や「もっとこうすれば、あの成功パターンになりそう。」と考えられるようになりたいです。
次の記事では[成功パターン](https://qiita.com/hiroki_tanaka/items/82f5d0bdf0ea034e5360)に関して書きたいですヾ(`･ω･´)ﾉ
Swift：点と線分の距離

開発メモ

```swift
func distance(_ point: CGPoint, start: CGPoint, end: CGPoint) -> CGFloat {
    let lenX = start.x - end.x
    let lenY = start.y - end.y
    let sx = start.x - point.x
    let sy = start.y - point.y
    let s1 = lenX * sx + lenY * sy
    if s1 <= 0 {
        return (sx * sx + sy * sy).squareRoot()
    }
    let ex = point.x - end.x
    let ey = point.y - end.y
    let s2 = lenX * ex + lenY * ey
    if s2 <= 0 {
        return (ex * ex + ey * ey).squareRoot()
    }
    return abs(lenX * sy - lenY * sx) / (s1 + s2).squareRoot()
}
```

`point`が点、線分の始点が`start`で終点が`end`

# 参考

- [点と線分の距離を求める](https://qiita.com/boiledorange73/items/bcd4e150e7caa0210ee6)
- [点と線分との最短距離](https://qiita.com/kkdd/items/b3c5e06798e59fe2768e)
中学生でもわかるSIRモデル

最近コロナウイルス関連でSIRモデルという言葉をよく聞くようになりました。SIRモデルはインフルエンザなどの感染者のグラフによく当てはまることが知られていて、今回のコロナウイルスの対策にも役立てられています。

自分はたまたま関連する授業を受けていることもあり、100番煎じくらいかもしれませんが中学生でもわかるように簡単にまとめてみようかと思います。最後にPythonのコードでシミュレーションしてみます。

#SIRモデルとは
SIRモデルとは、伝染病が広がる様子を表現する数理モデルです。Sは未感染者、Iは感染者(のべ感染者数ではなく現在感染している人)、Rは回復者を表してます。SIRモデルでは回復者は免疫を持っているのでもう感染はしないと考えます。微積を使わないでやさしくかくと次の三式で表されます。

```math
\Delta S = - \beta S I
```
```math
\Delta I = \beta S I - \nu I
```
```math
\Delta R = \nu I
```

化学を知っている人なら反応速度の式(質量作用の法則)と同じようなものだと思ってください。$\Delta S$、$\Delta I$、$\Delta R$はそれぞれ$S$、$I$、$R$の変化分を表しています。具体的に言うと、明日どれだけ$S$、$I$、$R$がどれだけ増えたり減ったりするかと言うことです。例えば、明日の$S$は$S+\Delta S$になります。$\beta$は感染率、$\nu$は回復率というパラメータでどんな病気かによって決まります。$1/\nu$はおよそ回復までにかかる日数になります。

ここで、この三式の両辺を足してみましょう。

```math
\Delta S + \Delta I + \Delta R = 0
```

となっていることが確認できます。$\Delta S + \Delta I + \Delta R$は明日増えたり減ったりする$S$、$I$、$R$の合計を表します。それが$0$だということは、このモデルが総人口が増えたり減ったりしてしまうような、へんなモデルではないということです。今回、$S+I+R=1$とします。例えば$I=0.1$のときは、その国の住民の10%が$I$(感染者)だということです。

#SIRモデルの意味
次に式の意味を考えてみましょう。一つ目の式は次のようでした。

```math
\Delta S = - \beta S I
```
この式は、明日、S(未感染者)が$\beta S I$だけ減るということを表しています。減るということは感染者に変わるということです。減る量が$S$と$I$の積で決まる理由は、手っ取り早くは具体的な値を代入してみればイメージが湧きます。

全員が感染していて未感染者がいない国であれば、$S=0$となるので$SI=0$となり、同様に感染者がいない国($I=0$)でも$SI=0$です。未感染者と感染者が半々の国では$SI=0.5\times 0.5=0.25$となりもっとも大きくなります。つまり、$SI$は感染者と未感染者の遭遇率のようなものを表しています。

以上をまとめると、この式は遭遇率と感染率$\beta$の積の分だけ新たに感染する、ということ表しているということがわかります。次に三つ目の式をみてみましょう。

```math
\Delta R = \nu I
```
この式は回復者が感染者の数に回復率をかけた分だけの人が回復するという意味です。回復数が感染者の割合に依存するというのは少しへんな気がしますが、SIRモデルではこう仮定します。最後に二つ目の式をみましょう。

```math
\Delta I = \beta S I - \nu I
```

一つ目の式と三つ目の式の意味を踏まえて考えると、(新たに感染する人)−(新たに回復する人)の分だけ感染者が増えるという意味だとわかりますね。(新たに感染する人)<(新たに回復する人)のときこれは負になるので、感染者の数は減少することがわかります。

#基本再生産数

これから暇なとき書きます

#Pythonでのシミュレーション

説明はこれから暇なとき書きます

```python:sir.py
import matplotlib.pyplot as plt
import numpy as np

beta = 0.5
nu = 0.3
period = 100

def next_state(s, i, r):
    delta_s = - beta*s*i
    delta_i = beta*s*i - nu*i
    s = s + delta_s
    i = i + delta_i
    if s < 0:
        s = 0
    if i > 1:
        i = 1
    r = 1 - s - i
    return s, i, r

def main():
    results = []
    i = 0.01
    r = 0
    s = 1 - i - r

    l_s = [s]
    l_i = [i]
    l_r = [r]
    results.append([s,i,r])
    r0 = beta*s/nu
    
    print(s, i, r)
    for t in range(period):
        s, i, r = next_state(s, i, r)
        results.append([s,i,r])
        l_s.append(s)
        l_i.append(i)
        l_r.append(r)
    print("R0:{}".format(r0))
    plt.figure()
    plt.title("R0:{}".format(format(r0,".3f")))
    plt.xlabel('Time')
    plt.ylabel('Rate')

    x = np.linspace(0, 100, period+1)
    plt.plot(x, l_s, label="S")
    plt.plot(x, l_i, label="I")
    plt.plot(x, l_r, label="R")
    plt.legend()
    plt.show()
    
main()
```
実行結果
![sir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463630/e9d4b30e-0662-731e-51b5-447f93ed9793.png)
AtCoder 生活　43日目

[前回](https://qiita.com/flandrescarlet237/items/26cf92618f06c4ce68ee)

#43日目
今回は、[AtcoderProblemsのBoot camp for Beginners](https://kenkoooo.com/atcoder/#/training)のEasy問題を3問を解き、ABC166に参加しました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|ABC121|C|◯|148分25秒|
|AGC004|A|◯|62分40秒|
|CODE FESTIVAL 2016 qual A|B|◯|40分15秒|

![スクリーンショット 2020-05-03 22.41.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/ccdb0ffa-526a-284f-a5d4-fd3462bbd51a.png)


##[ABC121_C](https://atcoder.jp/contests/abc121/tasks/abc121_c)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<ll,ll>;

int main(){
    int n,m;
    cin >> n >> m;
    vector<pii> x(n);
    rep(i,n){
        ll a,b;
        cin >> a >> b;
        x[i].first = a;
        x[i].second = b;
    }
    ll ans = 0;
    sort(x.begin(),x.end());
    ll i = 0;
    while(m > 0 && i < n){
        if(m-x[i].second >= 0){ 
            ans += x[i].first*x[i].second;
            m -= x[i].second;
        }
        else{
            ans += x[i].first*m;
            break;
        }
        i++;
    }
    cout << ans << endl;
}

```

解くのにかかった時間：148分25秒
感想：正しい解にたどり着くのにかなり時間がかかってしまった。


##[AGC004_A](https://atcoder.jp/contests/agc004/tasks/agc004_a)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    ll a,b,c;
    cin >> a >> b >> c;
    ll s = min({a*b,b*c,c*a});
    if(a%2 == 0 || b%2 == 0 || c%2 == 0) cout << 0 << endl;
    else cout << s << endl;
}

```

解くのにかかった時間：62分40秒
感想：無駄に時間がかかってしまった。


##[CODE FESTIVAL 2016 qual A_B](https://atcoder.jp/contests/code-festival-2016-quala/tasks/codefestival_2016_qualA_b)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int n;
    cin >> n;
    vector<int> a(n);
    rep(i,n) cin >> a[i];
    int cnt = 0;
    rep(i,n){
        if(i+1 == a[a[i]-1]) cnt++;
    }
    cout << cnt/2 << endl;
}

```

解くのにかかった時間：40分15秒

##[ABC166](https://atcoder.jp/contests/abc166)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    string s;
    cin >> s;
    if(s == "ABC") cout << "ARC" << endl;
    else cout << "ABC" << endl;
}

```

###最後に
ABC166は、A問題以外が解けないという悲惨な結果で終えてしまった。解説を読んだところ、CやDはあと少しで解けたのではないかということを感じた。大体の骨組みは数分で作れるのだが、解にたどり着くのにかなり時間がかかってしまっている。もっと様々な解法を素早く想定して解にたどり着く時間を早くしていくことが今後の課題だと感じた。

|難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|A|62分40秒|1問中1問|
|B|40分15秒|1問中1問|
|C|148分25秒|1問中1問|
もうちょっとで解けそうだったなEF問題集

# はじめに

間に合わなかったけど，時間があれば解けたなという問題集です．Eわからず調子に乗ってFに挑戦した結果，両方落としがちなので反省のために...
いつも使ってるヘッダーは以下です(好みはあると思います)．

```C++
#include <bits/stdc++.h>
#define FOR(i, begin, end) for(ll i = (begin); i < (end); i++)
#define rep(i, n) FOR(i, 0, n)
using ll = long long;
using ull = unsigned long long;
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
using pii = pair<int, int>; using pll = pair<ll, ll>; using vi = vector<int>; using vl = vector<ll>;
template<typename T, typename U> static void chmin(T &x, U y) { if (y < x) x = y; }
template<typename T, typename U> static void chmax(T &x, U y) { if (x < y) x = y; }
```

# [ACC166-E](https://atcoder.jp/contests/abc166/tasks/abc166_e)

$b_i=a_i-i$, $c_i=-a_i-i$とすると$a_i+a_j=i-j \Leftrightarrow b_i=c_j$なので，$b_i=c_j$かつ$i \neq j$なる数を数えればいい.

```C++
#define int long long // をヘッダーに挟み込む
int n;
signed main() {
    cin>>n;
    vi a(n);
    rep(i,n) cin>>a[i];
    vi b(a), c(n);
    rep(i,n) b[i] -= i;
    rep(i,n) c[i] = -a[i] - i;
    int ans = 0;
    unordered_map<int, int> m;
    rep(i,n) {
        m[b[i]]++;
    }
    rep(j,n) {
        if(b[j]!=c[j])
            ans += m[c[j]];
        else
            ans += m[c[j]] - 1;
    }
    
    cout<<ans<<endl;
    return 0;
}
```
VS Code terminal で Ctrl + P などの shortcut 操作を快適にする

VS Code の terminal は言うまでもなく非常に便利ですが、標準設定では Ctrl + p などの shortcut を使うと、VS Code 側での shortcut が機能してしまい、不便すぎます。
以下のように設定することで、特定の shortcut を terminal 側で優先できるようになります。

#### 1. 設定を開く
VS Code Command Palette を開き (Windows/Linux の場合 Shift + Ctrl + p)、Keyboard Shortcuts の設定を開く。(図にあるように Ctrl + k -> Ctrl + s でも可)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210165/74bf3522-2590-9bc4-3235-e5d24249b51b.png)
(念の為、macOS では ⌘ + Shift + p です)

#### 2. 特定する
shortcut list が表示されたら、上部の検索窓で terminal での動作を優先したい shortcut を探す。以下の例では Ctrl + e を見つけています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210165/824a5360-9948-972b-535e-2008176b1063.png)
(Ctrl + e は shell で入力の末尾に飛ぶ shortcut で、よく使いますよね)

#### 3. 設定する
目的の shortcut の context menu (右クリックメニュー) を開き、"When Expression" を編集する。ここに "terminal にいるときは無視する" ための合言葉 "!terminalFocus" を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210165/673c0dd8-cc8a-754a-698a-f182364ddb13.png)

#### 4. 試す

terminal に行き、設定した shortcut を押して、VS Code に focus が移らなくなっていることを確認します。

以上です。
【raty.js】 星付き　評価機能　実装　rails　view表示まで

![画面収録 2020-05-03 23.00.55.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/a86a8f1c-ca71-85b6-892b-1b5e6f3e20e4.gif)

##【ゴール】
raty.jsを使用して星付きのランキング機能の実装　view表示まで

##【メリット】
■　UXの向上
■　javascript理解度向上


##【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

##【実装】

###1.githubからretyのソースを持ってくる
　※[こちらのソースコード](https://github.com/wbotelhos/raty/tree/master/lib/images)から
　※ファイルは2点、①"jquey-raty.js"のファイル　,　②"image"全て

###2.jquery追記
　※　”//= require jquery”を追記しないと読み込まれません
　※　"star"　に対して発火するよう定義
　※　”/assets/star-off.png"で画像の場所を指定

```javascripts/application.js
//= require jquery  

　　　（中略）

$(function () {
  $('#star').raty({　　　
    size: 36,
    starOff: "/assets/star-off.png",
    starOn: "/assets/star-on.png",
    scoreName: "score"
  });
});

```
###3.view追記
　※　”<script src="assets/jquery.raty.js"></script>”ファイルを読み込む
　※　"id=star"で上記のJavaScriptの記述へ情報を渡してあげる


```views/application.html.erb
<body>
  <script src="assets/jquery.raty.js"></script>
  <div id="star"></div>
  <%= yield %>
</body>
```

以上
Rails 本番環境（EC2）でPAY.JPのAPI keyを読み込めないエラー

####結論
本番環境（EC2）でAPI keyを読み込むためには、/etc/environmentの中にAPI keyを書きこむ必要があります。
（テスト秘密鍵であればsk_testで始まる文字列を直接書く）

####経緯
チーム開発でメルカリを模したアプリを開発しています。
・rails (5.2.4.2)
・ローカル環境にてpayjpを使いクレジットカード登録機能を実装。動作確認済。
・ローカルにおいては、クレジットカードコントローラに下記記述をすることで、
　.ENVファイルに記載されたAPI秘密鍵を読み込むことに成功していた。

```
Payjp.api_key = ENV["PAYJP_PRIVATE_KEY"]
```
・本番環境にてクレカ登録をすると、登録完了画面に遷移せず、
　Payjp::AuthenticationError in CreditCardsController#payエラーが発生。
　No API key provided.と言われてしまう。（PAY.JPにもクレカ情報が反映されない）

<img width="1139" alt="82373d6703aa760746102e6d7aedb3f1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600614/aa00b81c-eedb-383a-2037-ea5fb19d7893.png">

####一旦たてた仮説
本番環境で.ENVファイルを読み込めていない可能性。

####仮説を元に行った作業内容
.ENVファイルを使用するにあたり導入したgem 'dotenv-rails’が、gemfileの適切な箇所に記載されているか確認したが、テスト・開発・本番環境いずれにも対応できる箇所に記載されている。他に思い当たる原因が不明。

####その後わかった事
本番環境（EC2）でもAPI keyやmaster_keyを使えるようにするためには、/etc/environmentの中にそれらを書きこむ必要あり。
API keyやmaster_keyはgitignoreされている。デプロイして自動的に本番環境に反映される、というものではない。
本番環境の設定ファイルである/etc/environmentの中に書き込む事で使用可能になる。

####参考にさせていただいた記事
https://techtechmedia.com/team-development-deploy/

####おまけ
その後上記の通り/etc/environmentの中に書き込むも、なぜかエラー解消せず。（？？？）
↓
対応
（.ENVファイルに記載されたAPI秘密鍵を読み込む設定をしていましたが）
credentilas.yml.encから読み込むように、コントローラに下記記載をしたところエラー解消しました。

```
Payjp.api_key = Rails.application.credentials.payjp[:PAYJP_PRIVATE_KEY]
```

credentilas.yml.encと/etc/environment　それぞれにAPI keyやmaster_keyを記入、
さらにコントローラにおいてはcredentilas.yml.encのAPI keyを読み取らせる記述をする、
という方法が確実かなと思いました。

以上、ご覧いただきありがとうございました！
rails newのやり方

rails で新しいアプリケーションを作るときの方法

前提
Ruby 2.5.1
Rails 5.2.3

1.rails new

```
$：rails version new アプリケーション名 -d mysql
```

2.作ったディレクトリに移動

```
$：cd ~
```

3.DBの準備


```
rails db:create
```


4.ブラウザを開き確認

```
rails s
```


完了です！
[CSS]取り消し線を要素全体に引く方法

## 概要
最近ToDoリスト的なものを作っていて、完了したアイテムに取り消し線を引きたいと思いました。
単純に`<del>`や`text-decoration: line-through`を使用すれば取り消し線を付けられますが、この方法だと文字の上にしか線が引かれず、ちょっとかっこわるい感じになってしまいます。
そこで、要素全体に取り消し線を引く方法を考えました。

※以下の図でいうと、「サンダル」のように線を引きたい。（「ヨット」のように、文字の上にだけ線が引かれるのは嫌！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468246/85cf7ebe-3739-7f87-42cd-8edacec05034.png)
試行錯誤の結果、とりあえずそれっぽいものが作れたので共有します。

## 結論
<FONT COLOR=blue>※2020/5/4: 疑似要素afterを使用するよう変更しました。</FONT>
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="kota_ad" data-slug-hash="YzyEBpV" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="strikethrough4">
  <span>See the Pen <a href="https://codepen.io/kota_ad/pen/YzyEBpV">
  strikethrough4</a> by kota (<a href="https://codepen.io/kota_ad">@kota_ad</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


`background: linear-gradient()`を使用して取り消し線のように見せました。

## 解説
`linear-gradient()`は、線形グラデーションを作成する関数です。今回はこれを背景に指定しました。
線形グラデーションによって、中央部分だけを黒に、それ以外の部分は透明にすることで、取り消し線（っぽいもの）を作っています。

`linear-gradient()`の引数には、色と、その色に変化する位置を指定します。
今回は以下のように指定したので、
　上から47%の位置まで透明（transparent）、
　上から47%の位置から52%の位置まで黒（#000000）、
　上から52%の位置以降透明（transparent）、
となります。
（なかなか複雑な関数なので、色々説明を省いています。厳密な説明は他サイトを見てください。）

```css
  background: linear-gradient(
    transparent 47%,
    #000000 47%,
    #000000 52%,
    transparent 52%
  );
```

<FONT COLOR=blue>※2020/5/4: 疑似要素afterを使用するよう変更したため追記しました。</FONT>
また、取り消し線は疑似要素afterを使用して、取り消す要素の上に重ねています。
疑似要素を使用しなくても取り消し線は引けますが、以下の図のように文字の裏に線が引かれてしまうため、疑似要素を使用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468246/33a3e029-39a1-883b-c005-bac59867106a.png)

## 追伸
もっといい方法がある気がしてならない。いい方法あったら教えてください。
Laravel7のユニットテストで、base_path()などのヘルパー関数が使えない問題

makeコマンドでユニットテストを作成すると非常に便利ですね。

```
php artisan make:test MySampleTest --unit
```

ただこのコマンドで作成したクラスのではbase_path()やfactory()などのヘルパー関数が利用できません。
ユニットテストを実行すると、以下のように怒られてしまいます。

```
1) Tests\Unit\MySampleTest::testExample
Error: Call to undefined method Illuminate\Container\Container::basePath()
```

原因は、テストクラスがフレームワークを読み込んでいないからです。
以下のようにlaravelのTestcaseクラスを読み込むようにすれば問題が解消します。

**変更前**

```
use PHPUnit\Framework\TestCase;

class MySampleTest extends TestCase
{
```

**変更後**

```
use Tests\TestCase;

class MySampleTest extends TestCase
{
```

## これはバグですか? 仕様ですか?

[GithubのIssue](https://github.com/laravel/framework/commit/e30a0c979d98f2f1f7b6c565e4002734237a280b#commitcomment-36691303)をみたところこれは仕様のようです。
ユニットテストを高速に実行するために、意図的にframeworkの設定を読み込まないようにしているそうです。

>I believe unit tests should be as fast as possible so any external influences that decrease their speed should be avoided
>(ユニットテストはできる限り早く実行できるべきです。そのため、速度を落とす外部の影響はさけるべきです。)

ヘルパー関数を使う場合はFeatureテストを使えばいいとも言っています。

## でもやっぱりユニットテストでもヘルパー関数を使いたい! どうにかして!
make:testコマンドを実行するたびに自分で```use Tests\TestCase```に書き換えるのは面倒ですね。
laravel7以降では、make:testコマンドで生成されるテンプレートをカスタマイズすることができます。
この機能を利用して初めから```PHPUnit\Framework\TestCase```ではなく```Tests\TestCase```が読み込まれるようにしましょう。

## make:test --unit コマンドで生成されるテンプレートを変更する

まずは以下を実行

```
php artisan stub:publish
```

上を実行するとプロジェクトルートディレクトリ配下に```stubs```というディレクトリが作成されます。
その下に```test.unit.stub```というファイルがあるのでこのファイルを書き換えればtest:make --unit```でデフォルトで生成されるファイルの中身を変更することができます。
ReactでTrixエディタを利用する

# 概要
標題の通りですが、ReactでTrixエディタを利用するための手順です。
WYSIWYGエディタの1種です。WYSIWYGエディタは、グラフィカルにユーザーが文章を記載する際に編集することができるエディタです。Wordpressの投稿画面があると思いますが、あれも一種です。そうは言ってもイメージが湧かないと思いますので次のリンクを見れば、あ〜これかとなるかと思います。[トリックスエディタ](https://trix-editor.org/)
ちなみに、Trixエディタは、Rails6からAction_textとして導入されましたね。

# ReactにTrixエディタを入れる

あまり複雑にするとわかりずらくなりますので、最小構成で書きます。
まず適当なプロジェクトを作成し、npmで用意されているTrixエディタをインストールします。

※ [Trixエディタのnpmサイト](https://www.npmjs.com/package/trix)

```
npx create-react-app プロジェクト名
```
できたプロジェクトに入り、Trixエディタのパッケージをインストールします。

```
npm install trix
```
次にできたプロジェクトにtrixエディタを反映させます。
下の2つのコードをApp.jsに追加します。

```
import Trix from "trix";
```
と

```
<trix-editor input="trix" />
```

を加えます。できたばかりのプロジェクトなら、下記のようなコードになるかと思います。

```
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import Trix from "trix";

class App extends Component {
  render() {
    return (
      <div className="App">
        <div className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h2>Welcome to React</h2>
        </div>
      <trix-editor input="trix" />
        <p className="App-intro">
          To get started, edit <code>src/App.js</code> and save to reload.
        </p>
      </div>
    );
  }
}

export default App;
```
次にApp.cssの適当な場所に下記を追加してデザインの適用をします。

```
@import "~trix/dist/trix.css";
```

ここまでできると下記のようにいつものReactのスタート画面下にエディタが表示されてますね。

<img width="630" alt="スクリーンショット 2020-05-03 22.49.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145608/e34c2a84-f64c-db94-5f68-a20a01e2bee7.png">

# おまけ(react-trix)

ここまででreactでtrixを使えることには使えるのですが、自分でコンポーネント化したりしてすぐに使えるようにはならないと思います。その場合、npmのtrixのラッパーのパッケージがあります。

※ [react-trixのnpmサイト](https://www.npmjs.com/package/react-trix)

こちらはコンポーネント化されているので直ぐに使えます。ただし上記の元のtrixを最初にnpmで入れとく必要があります。Trixエディタ自体が独自属性なのでやってみるとわかると思いますが、onChangeで値を取れません。stateに入れたい時とかそこらへんが厄介ですが、このパッケージはうまくやってくれるのでサクッと済ませるならこれでもいいと思いました。