【JavaScript活用】QiitaAPIでバイク好きがいるか調べてみた


バイクが好き。Harley-Davidsonが好き。なんならその中でもスポーツスターが好き。
愛車はHarley-Davidson XL883R 2007年モデル。白いボディに一目惚れ！
社会人として13年間事務部門で育ってきた30代が人事異動をきっかけにSE目指してスタートを切りました！（Microsoft製品（Access、Excel）を使ったEUCツールの開発経験あり。）

#背景・目的
QiitaAPI、JavaScripttを習得するにあたり、バイク好きがどれくらいいるかを調べることにしました。
Qiitaの中にバイク関連の記事(タグ、キーワード)はあるのか？バイクをフォローしているバイク好きな人はどれくらいいるのか？以下【検索するタグおよびキーワード】で【処理】を実行することにします。

【検索するタグおよびキーワード】
　・bike
　・バイク
【処理】
　・タグが設定された記事数をそれぞれ取得
　・キーワードが含まれた記事のタイトルとURLをそれぞれ10件ずつ一覧化
　・タグのフォロワー数をそれぞれ取得

#環境、言語等
・Visual Studio Code
・Qiita API
・JavaScript
・Node.js

#処理コードおよび処理結果

##1.各種定数の定義と値の代入
キーワードなど色々なところで使用するので、定数(変数)を定義します。（今回は定数のみ使用）
一か所変えればすべて変わる！定数(変数)はとても便利です。
今回は[bike][バイク]の二種類のキーワードを使うことにします。
[バイク]は日本語のため、エンコード処理をする必要があります。
モジュール内でエンコードとデコードの切り替え方法が解決できなかったので、最初からエンコードして代入することにします。
★参考：[JavaScriptにおける変数と定数について](https://qiita.com/takayuu276/items/a6ee212a57831be7824b)
★参考：[encodeURIComponentが世界基準だと誤解してた話](https://qiita.com/shibukawa/items/c0730092371c0e243f62)

```js
const axios = require('axios'); 
const accessT = '自分のアクセストークンを指定'
const NameEnglish = 'bike'
const NameJapan = 'バイク'
const NameJapanEn = encodeURIComponent('バイク')
```


##2.[bike]と[バイク]のタグを含む記事数取得
[bike]と[バイク]のタグを含む記事数をそれぞれ取得します。

★参考：[初心者がQiitaのAPIにアクセスして、初心者についてのタグを考察してみた（その①）](https://qiita.com/Izumi0711/items/450c8861086a2dc2e984)

###処理コード
「1.各種定数の定義と値の代入」で設定した定数を使いまわします。

```javascript
const axios = require('axios'); 
const accessT = '自分のアクセストークンを指定'
const NameEnglish = 'bike'
const NameJapan = 'バイク'
const NameJapanEn = encodeURIComponent('バイク')

//関数mainを定義 ★[bike][バイク]タグを含む記事の数
async function main() {
  //bike
  let response1 = await axios.get('https://qiita.com/api/v2/tags/' + NameEnglish, {
	  headers: {
      'Authorization': `Bearer ` + accessT
    }
  });
  console.log('1[' + NameEnglish + ']タグを含む記事数:'+ response1.data.items_count); 
  //バイク
  let response2 = await axios.get('https://qiita.com/api/v2/tags/' + NameJapanEn, {
	  headers: {
      'Authorization': `Bearer ` + accessT
    }
  });
  console.log('2[' + NameJapan +']タグを含む記事数:'+ response2.data.items_count);
}

main();
```

###実行結果
```javascript
1[bike]タグを含む記事数:3
2[バイク]タグを含む記事数:12
```

##3.[bike]と[バイク]のキーワードが含まれている記事の一覧化
[bike]と[バイク]のキーワードが含まれている記事をタイトルとURLを取得します。
「1.各種定数の定義と値の代入」で設定した定数を使用します。
100件を取得しようと考えていましたが、出力した後にQiitaへの記載が大変だったので10件へ変更しました。
CSV等に書き出ししたかったのですが、参考に見た記事が難しかったので諦め、Qiita上に貼ると表になる形式で出力していきます。
★参考：[きのこの山 VS たけのこの里 あなたはどっち派？を調べてみた](https://qiita.com/tanakahiroki/items/1bfd4ec9c93848e24e26)
★参考：[JavaScriptとQiitaAPIで取得した人気タグ情報をplotlyで散布図表示してみる](https://qiita.com/ranchi1977/items/73f1346cf15798f52444)

###処理コード
「1.各種定数の定義と値の代入」で設定した定数を使いまわします。

```javascript
const axios = require('axios'); 
const accessT = '自分のアクセストークンを指定'
const NameEnglish = 'bike'
const NameJapan = 'バイク'
const NameJapanEn = encodeURIComponent('バイク')


//関数mainを定義 ★[bike][バイク]キーワードを含む記事10件分TitleとURL取得
async function main() {
  //bike
  let response1 = await axios.get('https://qiita.com/api/v2/items?per_page=10&page=1&query='+ NameEnglish, {
    headers: {
      'Authorization': `Bearer ` + accessT
    }
  });
  console.log('| [' + NameEnglish + ']キーワードを含む記事のtitle | URL |')
  console.log('|:-|:-|')
  for (let i = 0; i < response1.data.length; i++) {
    console.log('|' + response1.data[i].title + '|' + response1.data[i].url +'|');
  }
  //バイク
  let response2 = await axios.get('https://qiita.com/api/v2/items?per_page=10&page=1&query='+ NameJapanEn, {
    headers: {
      'Authorization': `Bearer ` + accessT
    }
  });
  console.log('| [' + NameJapan + ']キーワードを含む記事のtitle | URL |')
  console.log('|:-|:-|')
  for (let i = 0; i < response2.data.length; i++) {
    console.log('|' + response2.data[i].title + '|' + response2.data[i].url +'|');
  }
}

main();
```

###実行結果
####[bike]キーワードを含む記事一覧（10件）

| [bike]キーワードを含む記事のtitle | URL |
|:-|:-|
|書籍「ユースケースで学ぶDataiku－自転車シェアリングサービスの利用パターン分析－」告知|https://qiita.com/ayoyo/items/7489fc42c7127eb07d82||Azure Databricks Datasetsの内容を確認した|https://qiita.com/ryoma-nagata/items/5f34c8f40cbced373ab0|
|「自動化ツール」活用は、これからのデータ分析スキル向上の鍵だ！（と思う）|https://qiita.com/hima2b4/items/73d8053574ea3e85e150|
|It's too late, your data has been compromised|https://qiita.com/Sovai/items/70961e362491de53d2a5|
|[初心者向け] BootstrapのCarouselを暗くして背景として使う|https://qiita.com/daisuke114/items/e91ec77bd3fec9165708|
|DynamoDB入門編(チュートリアル実施)|https://qiita.com/kouji0705/items/7750d35eaaf2e53529c2|
|道路安全　自己適応システムの安全分析。安全（25）|https://qiita.com/kaizen_nagoya/items/449ccda6821efeff574f|
|自動車安全資料を仮訳してみた。分析はこれから。安全(27)|https://qiita.com/kaizen_nagoya/items/c28c707ef226e65b780e|
|OpenStructを用いる　オブジェクト指向設計実践ガイドより|https://qiita.com/RyomaKaneko/items/455808398c770ede3abb|
|モジュールを適切に使う　オブジェクト指向設計実践ガイド|https://qiita.com/RyomaKaneko/items/17670b8975099b039cc5|
|コンポジション　オブジェクト指向設計実践ガイドより|https://qiita.com/RyomaKaneko/items/b2733e5818285a37634a|

####[バイク]キーワードを含む記事一覧（10件）

| [バイク]キーワードを含む記事のtitle | URL |
|:-|:-|
|バイクで走るタイムリミットをLINE_BotとWeb_APIを組み合わせて実装してみた～|https://qiita.com/tanakahiroki/items/e436a80d7d25a6421ca9|     
|NODE-REDでビジュアルプログラミング辞書型チャットボット人工無能APIを作って遊ぼ|https://qiita.com/iwaxse0430/items/985fc79b9305ee469731|   
|PICと気圧センサで高度計を作成する|https://qiita.com/keitanak/items/c40ea7706fd43014d2e1|
|AWS Cognito にトライしてみた|https://qiita.com/meowmeowcats/items/212ce109254647be609d|
|Railsポートフォリオ【Tamari-Ba】についてまとめてみた|https://qiita.com/vit_udon_husqy/items/f87ca0bdb4b23f0449e9|
|データサイエンティストの仕事～日立のデータサイエンティストに聞いてみた！～シリーズ３～|https://qiita.com/KH_MOON/items/b8f21589547fbd21fe12|
|Javaマルチスレッド|https://qiita.com/syouekiko/items/e8f94de918d39d34d7e2|
|DB設計のセオリーである正規形を自分なりにまとめてみた|https://qiita.com/play-life/items/1f2a057b74207629da74|
|【Google Cloud Day'21】「製造業における Google Cloud を活用した全社データ利活用推進の進め方とは？」を視聴して|https://qiita.com/Mune_robo/items/1be99f70b32adfa7d325|
|Slackにバイク川崎バイクを導入する【Python/Slackbot/Mecab】|https://qiita.com/pepperland_sk/items/ffe361b3bf3abf02ef58|

##4.[bike]と[バイク]タグのフォロー人数取得

###処理コード
「1.各種定数の定義と値の代入」で設定した定数を使いまわします。

```javascript
const axios = require('axios'); 
const accessT = '自分のアクセストークンを指定'
const NameEnglish = 'bike'
const NameJapan = 'バイク'
const NameJapanEn = encodeURIComponent('バイク')


//関数mainを定義 ★[bike][バイク]タグをフォローしている人の数
async function main() {
  //bike
  let response1 = await axios.get('https://qiita.com/api/v2/tags/' + NameEnglish, {
    headers: {
      'Authorization': `Bearer ` + accessT
    }
  });
  console.log('1[' + NameEnglish + ']タグのフォロワー数:'+ response1.data.followers_count);
　//バイク
  let response2 = await axios.get('https://qiita.com/api/v2/tags/' + NameJapanEn, {
    headers: {
      'Authorization': `Bearer ` + accessT
    }
  });
  console.log('2[' + NameJapan +']タグのフォロワー数:'+ response2.data.followers_count);
}

main();
```

###実行結果

```javascript
1[bike]タグのフォロワー数:1
2[バイク]タグのフォロワー数:0
```

#考察
・以下2点のことからバイクが好きな人は存在した。
　・一見関係ないようなタイトルでも、記事を見に行くとバイクが好きと記載している記事を複数発見。
　・バイクに関係したツール開発などをしている記事を複数発見。
・タグが活用されていない。
・タグ上限が5個までとなるとバイクを入れ込むことが難しい可能性がある。
・キーワード検索では[bike][バイク]を含むものと指定したため自転車系の内容もヒットした。
・欲しい記事が取得できていない。

#苦労したこと

##定数（変数）の設定
どこまで定数（変数）にするか悩みました。
Microsoft製品（Access、Excel）を使ったEUCツールの開発では、定数・変数大好き人間で、他の人が解析する際に困るという中身だったので、便利だけどやりすぎると解析やメンテナンスが大変になってしまうので、ベストな使い方になっているのか悩みました。が、悩みすぎて「えいやっ！」と終了にしました。

##利用制限
始めてJavaScript、Node.js、APIを実行したため、最初から試し書きしては叩いてを繰り返しエラー連発し、直しては叩いてを繰り返したところ、1時間に60回をオーバーしました。
認証していないと1時間に60回までしか叩けないということの意味をきちんと理解していませんでした。
参考文書をもとに認証したらサクサク進みました。
★参考：[よそ様の情報を簡単に参照できるWEBAPIが本当に簡単なのか体験してみた。](https://qiita.com/grayhamchan/items/8bbccba34caaa71058b9)

>利用制限
>認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。
※[Qiita API v2の仕様](https://qiita.com/api/v2/docs)より抜粋

#さいごに
バイクに関係するテーマの記事を投稿している方もタグを使っていないようです。
そして、英語圏ではバイクのことは[Motorcycle]ということなので、どちらが良いのでしょうか？
投稿する際はタグを活用したいと思いましたが[bike][Motorcycle]で悩みました。
今回は[bike]タグを使いますが、適切なタグを設定できるよう頑張ります。

#記事の書き方で参考にしたURL
| 記事名 | URL |
|:--|:--|
| Qiita記事作成方法 初心者の備忘録 | https://qiita.com/U-MA/items/996ae933ae94c5711883 |
| Qiita 記事の書き方 | https://qiita.com/wdwd5454/items/7d8db521c5c0d1f570f6 |
| Markdown記法 チートシート | https://qiita.com/Qiita/items/c686397e4a0f4f11683d |
| 良い記事を書くためのガイドライン | https://help.qiita.com/ja/articles/qiita-article-guideline |