編集リクエストだけでQiitaユーザー週間ランキングを駆け上がった

# 2021年さようなら。2022年こんにちは！

明けましておめでとうございます🐯

- 2021年はWPFの実装に注力した年だった
- 2022年は設計など理論系を勉強をしたい
    - ドメイン駆動設計入門を読んでいる

# 週間ユーザーランキング

2022年1月1日のキャプチャ

名だたる猛者を抑えて、金トロフィーになった🥇

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/2917dc18-b738-d6c3-67f3-487cd2ba574f.png)

アドベントカレンダーが一段落したタイミングなのでラッキーパンチだっただけ？😂

# コントリビューションが爆上がりした経緯

- [前回記事](https://qiita.com/t13801206/items/8f251c0dba5f051c2398)では、**Power Automate Desktop（以下PAD） を使って編集リクエストを半自動で送信する仕組み**について書いた
    - 全自動は難しい。あからさまに誤植だとしても、例えば**それがURL内の誤植である場合は直さないほうがよい**ので。
        - 最先端のAIなら文脈を解釈してアレコレできるかもしれませんが。
- **2021年の年末**、実際に半自動システムをフル稼働して編集リクエストを送りまくった
    - だいたい**700件**の記事をさらった。本当に誤植であった割合は７割くらいだった
        - 少しずつ誤字の辞書もアップデートしたので、後半は８割くらいだったかも
    - 年末特番を見ながら PAD と**共同作業**をした
        - 編集リクエストの差分画面で PAD が一時停止するので、誤植か否かをキー入力する作業を延々と・・
- 結果、コントリビューションの週間ランキングで１番上に名前がきた

# この記事は

編集リクエストの半自動化にあたって発見したことなどを振り返りとして書く

# 編集リクエストを送信すると感謝してもらえる（ことがある）

アド街ック天国風に・・

![animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/e30f822c-0d95-f390-88b2-0c1406ca8d5b.gif)

編集リクエストなんて内心鬱陶しいと思われているかもしれませんが
感謝の言葉を送っていただけるオトナのSNS、それがQiita

# トレンド記事か、新着記事か

編集リクエストは承認してもらえて初めて価値[^2]が生まれる

[^2]: [Qiitaのコントリビューション計算式](https://help.qiita.com/ja/articles/qiita-contribution)

## リクエストを承認してもらいやすい記事とは？

[前回記事](https://qiita.com/t13801206/items/c20547ff3c3d60400161)ではトレンド記事に着目したが、「ユーザーにリクエストを気づいてもらいやすい」という観点では、新着記事のほうがよさそう

- 新着記事の名の通り、最近Qiitaにアクセスした形跡がある
- トレンド記事の著者には通知がたくさん届いていると思われる。通知の中にリクエストが埋もれてしまって気づかれない

# 誤字とは何か

編集リクエストを大量に作成するためには、誤字の辞書を豊富にする必要があった

[人間性をさがせよ QiitaのTypo検出](https://qiita.com/khsk/items/085db0947c650e2db463)では、Qiitaで観察される誤字一覧がまとめられている

また、[誤字コーパス](https://github.com/mhagiwara/github-typo-corpus)から日本語の誤字だけを抜き出して使ったりした

# 過程で発見したもの

なんちゃってRPAなので、途中で人の目によるチェックが入る
その過程でみつけたレアケース

## GitHubリポジトリのトップページの誤植

`seperate`を`separate`に直したいが、プルリクエストが出せないリポジトリのAbout

https://github.com/sweepline/eslint-plugin-unused-imports

## Qiitaアドベントカレンダー

URLの`gseach`が`gsearch`ではないか、とPADがしきりに教えてくれるが
そこを直したらURLが無効になってしまう

https://qiita.com/advent-calendar/2021/gseach

ユーモアな記事を書かれる有名な御仁[^3]が立ち上げたカレンダーなので、なにか狙いがあるのかも・・

[^3]:  @Yametaro 氏

## 官庁のHPにも

`comment.html`としたいところ
そもそも利用規約は`comment`でいいのか？

https://www.jma.go.jp/jma/kishou/info/comment.html

## 企業オーガニゼーション

URLのAIエッジの綴りが違う

https://qiita.com/organizations/OKI_AIegde

## もくもくconnpass

URLの`programming`

https://mame-coffee-programing.connpass.com/

# 最後に

- PADが重いのは自然の摂理？
- ほぼPADに任せても、最後は文章を読んで自分で誤字かどうか判断しなければならないので、その労力を考えると**もうやりたくない**
    - 考えていたこと[^4]が実現できたので、ほかのことに時間をあてる

[^4]: [モチベーション](https://qiita.com/t13801206/items/c20547ff3c3d60400161#%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)

# 以下、備忘録

あとで読み返したときに思い出すための雑記

## APIリクエスト例

Qiita 設定→アプリケーション→個人用アクセストークン

```cs
// 認証しておけば時間あたり1,000リクエスト投げられる
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer 85sf324sd23******");

// ページあたりの記事数などは、デフォルトで20件なので
// クエリで per_page=100を明示する

// 新着記事を取得する
var newArticlesResponse = await client.GetStreamAsync(@"https://qiita.com/api/v2/items?page=" + page.ToString() + "&per_page=100");

// あるユーザーの記事100件を取得する
var response = await client.GetStreamAsync(@"https://qiita.com/api/v2/users/" + author + "/items?page=1&per_page=100");

```
## 誤字コーパスのハンドリング

大容量`.jsonl`[^1]は分割しないと重すぎてエディタで扱えない

[^1]: [JSON Lines](https://jsonlines.org/)

### JsonLinesをJsonに変換する

[jq](https://stedolan.github.io/jq/)を使うと、拡張子`.jsonl`を`.json`に変換できる

```bash
./jq-win64.exe -s '.' github-typo-corpus.v1.0.0.jsonl > out.json
```

Powershell を使うと文字コードが`UTF-16`になり文字化けするので、コンソールはGit Bashをつかった

#### 大きなファイルを分割する

`.jsonl`をそのまま`.json`に変換すると、ファイル容量が膨大になるので、`.jsonl`を複数ファイルに分割してから`jq`をつかった

[`head`と`tail`を駆使して](http://dqn.sakusakutto.jp/2011/06/linux-head-tail.html)、ファイルを手動で分割する

#### `.json`をデシリアライズする

[JSON を C# の DTO に変換するサービス](https://json2csharp.com/)を利用する

# PADあれこれ

重いことを除けば、とても使いやすいツール。さすがマイクロソフト

## CSVファイルを読み込む

`C#`で前処理したCSVファイルの１列目と２列目をそれぞれリストに加える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/dedc3f48-3e18-da0e-7e10-31b1575f0642.png)

## ループを回す

インデックスは0から始まって、最後は -1 しておく。リストの長さを超えないように。

`リスト.Count`でリストの長さを取得できる

リストの要素にアクセスするときは、`[  ]`をつかう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/fb47d288-3e9c-55b1-49e4-e288210cd416.png)

### テキスト入力部までカーソルを移動するサブフロー

フローを分けないと画面の読み込み時間次第でうまくいかないことがあった
けど、たぶんこれはまだどうにかなると思う。とりあえず動くことを優先したサブ（クソ）コード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/5cbe5689-3270-c575-fbb7-bd48d457b602.png)

## キー入力を待つ

編集画面の差分まで自動で進んだら `Ctrl+Q` または `Ctrl+Y` を待機する

- インデックス=1 なら誤植としてリクエストを出す
- インデックス!=1 なら誤植ではないのでブラウザを閉じる

キー入力のインデックスは１から始まる。ゼロオリジンではない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/1127e47c-c474-d667-59ef-20c4cae5900c.png)

## END

全２５アクション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/b2d90747-af18-e7a0-407d-cfec9c42b109.png)

## 2022年02月01日の追記

月間ランキングに名前が載った副次的な効果として、**フォロワー数が激増した**

以前は『フォロー数 > フォロワー数』であったのに、今やフォロワー数はフォロー数の１０倍以上

そして、**フォロワーの大多数がbotと思われる**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/e4032bd8-aa20-9d96-029d-8af4980a3db8.png)

不思議なことに、ランキングから名前が消えた今になってもコンスタントにフォロワー（bot）に追跡されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/c7be9d30-23f5-6303-f3f0-583e4bb51c9b.png)

## 2022年02月20日の追記

結果のCSVファイルに３列目を追加した
３列目には誤字と思われる文字列（誤字候補）を格納する

Qiitaの編集ページに移動したあと、`Ctrl F`で誤字候補を検索することで
その編集が適当か否かを判別するまでの時間が短縮できるようになった

csv1列目|csv2列目|csv3列目
-|-|-
Qiita編集ページ|編集内容.txtのパス|**誤字候補**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/3f1f5285-7767-c608-43af-ec84f2373e9c.png)