Qiitaに掲載されているプログラミング言語別の記事数を調べてみた

# はじめに
今年2020年に、Qiitaでどんなプログラミング言語の記事が書かれたか、興味本位で調べてみました。
せっかく調べたので、集計結果を紹介したいと思います。

# その前に、TIOBE INDEXについて
[TIOBE INDEX](https://www.tiobe.com/tiobe-index/)は、プログラミング言語の人気度を独自の集計法で、毎月発表しているサイトです。
あくまで一つの目安と思っていますが、ついつい見ています。

ちなみに、TIOBE INDEXでの`D言語`は、20位台を行ったり来たりです。
一時的に、2020年1月前後の数か月は10位台に入っていました。:wink:
![tiobe202001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/f2db4326-a39d-80fd-c1fb-3b1fdc265e38.jpeg)
ただ、2020年12月時点では20位台に戻ったという状況です。
![tiobe202012-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/6fe931c0-a814-ee2d-87fb-4af2ed0bde08.jpeg)
![tiobe202012-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/baef5f4d-ad32-2870-f49e-8597c01eeeae.jpeg)

参考：[TIOBE INDEXでのD言語の推移](https://www.tiobe.com/tiobe-index/d/)

TIOBE INDEXは、その時々の人気度を集計する仕組みだからか、毎月順位が大きく変動します。
よくよく考えると、数百種類あるといわれるプログラミング言語の中で、`D言語`が20位台とは結構な上位ですよね。
本当のところはどうなんだろう？
また、日本と海外とでは、人気度は違うのかなと思いました。
そんなこんなで、自分でも何か調べられないかと思い、この記事に至りました。

# 集計方法とソースコード
TIOBE INDEXで集計しているプログラミング言語と[Qiita Advent Calendar 2020にエントリーされたプログラミング言語](https://qiita.com/advent-calendar/2020/categories/programming_languages)を参考にQiitaでの記事数を取得する処理を`D言語`で書きました。
プログラミング言語ではないと思われるものは、対象外にしました。

検索条件の`tag:`にプログラミング言語が含まれるもの、さらに`created:>2020-01`を加えることで、今年の記事数に絞りました。
集計結果が0件となったものは、出力対象外にしました。

```d:qiitacount.d
import std.algorithm.sorting;
import std.conv;
import std.net.curl;
import std.stdio;
import std.string;
import std.uri;

void main()
{
	string[] language = [
		"ABAP", "ABC", "ActionScript", "Ada", "Apex", 
		"Applescript", "Assembly/アセンブラ/アセンブリ/アセンブリ言語", "AutoLISP", "Awk", 
		"Bash/Shell", "Befunge", "C", "C#", "C++", "CL", 
		"Clojure", "COBOL", "CoffeeScript", "Common-lisp/Lisp", "Crystal", 
		"Dart", "Delphi/ObjectPascal/Pascal", "Deno", "Dlang/D言語", "Elixir", 
		"Elm", "Erlang", "F#", "Factor", "Forth", 
		"Fortran", "Go", "GoogleAppsScript", "Groovy", "Hack/Hacklang/HHVM", 
		"Haskell", "IchigoJam", "Icon", "Idris", "Io", 
		"J", "Java", "JavaScript", "Julia", "Kotlin", 
		"LabVIEW", "Logo", "Lua", "MATLAB/Simulink", "Mind", 
		"ML", "MQL4", "NATURAL", "Neon", "Nim", 
		"ObjectiveC/Objective-C", "OCaml", "OpenCL", "Oz", "Perl", 
		"PHP", "PLSQL", "PowerShell", "Prolog", "Python", 
		"Q", "R", "REXX", "Ring", "RPG", 
		"Ruby", "Rust", "SAS", "Scala", "Scheme", 
		"Scratch", "Smalltalk", "Solidity", "SPARK", "SPSS", 
		"SQL", "Stan", "Stata", "Svelte", "Swift", 
		"Tcl", "Transact-SQL", "TypeScript", "Vala/Genie", "VBScript", 
		"Verilog/SystemVerilog", "VHDL", "VisualBasic/VB/VB.Net", "Vvvv", "Wenyan/文言", 
		"なでしこ", 
	];
	int[string] counter;
	foreach ( s; language ){
		int c = getCount(s);
		if ( c > 0 ){
			counter[s] = c;
		}
	}
	writefln("|プログラミング言語|件数|");
	writefln("|:-----------------|---:|");
	foreach ( lang; counter.keys.sort!((a, b){return counter[a] > counter[b];}) ){
		writefln("|%s|%s|", lang, counter[lang]);
	}
}

int getCount(string lang)
{
	lang = lang.replace("/", " OR created:>2020-01 tag:");
	string sUrl = "https://qiita.com/search?q=created%3A>2020-01+tag%3A" ~ lang.encodeComponent;
	auto http = HTTP();
	string response = cast(string)get(sUrl, http);
	string keyword1 = `<span class="badge">`;
	string keyword2 = `</span>`;
	int ind1 = indexOf(response, keyword1);
	int ind2 = indexOf(response, keyword2, ind1);
	return ( response[(ind1 + keyword1.length) .. ind2].to!int );
}
```

# 連想配列のソート
`D言語`は言語仕様として、[連想配列](https://tour.dlang.org/tour/ja/basics/associative-arrays)が用意されています。
ソースコード`qiitacount.d`で宣言している`int[string] counter`が連想配列です。プログラミング言語（`string`型）を`キー`に、記事の件数（`int`型）を`値`として、集計結果をセットしています。
連想配列をソートすることができます。
キーの昇順にソートする場合と、値の昇順にソートする場合の例を紹介します。

```d:sample.d
import std.stdio;
import std.algorithm;

void main()
{
	immutable string[string] colors = [
		"red"		: "akairo",
		"pink"		: "momoiro",
		"yellow"	: "kiiro",
		"purple"	: "murasakiiro",
		"blue"		: "aoiro"
	];
	auto keys = colors.keys;
    writeln("キー順にソート");
	keys.sort!("a < b");
	foreach ( key; keys ){
		auto value = colors[key];
		writefln("%-10s=> %s", key, value);
	}
    writeln;
    writeln("値順にソート");
	keys.sort!((a, b){return colors[a] < colors[b];});
	foreach ( key; keys ){
		auto value = colors[key];
		writefln("%-10s=> %s", key, value);
	}
}
```

```text:実行結果
キー順にソート
blue      => aoiro
pink      => momoiro
purple    => murasakiiro
red       => akairo
yellow    => kiiro

値順にソート
red       => akairo
blue      => aoiro
yellow    => kiiro
pink      => momoiro
purple    => murasakiiro
```

# 集計結果
`qiitacount.d`の実行結果(2020/12/26 20:10頃実行)は、`Markdown`なので、そのまま貼り付けます。2020年はあと数日ありますが、傾向はつかめるかと思います。
私自身、プログラミング言語の種類には詳しくないです。ということもあって、プログラミング言語のタグが複数に分かれているとせっかくの記事が見つけられずにもったいないなと感じました。（VB.Netとか、アセンブラとか。他にも取りこぼしがありそう）
D言語では、`dlang`、`D言語`、`Dlanguage`、`D`、`d_lang`のタグが使われていましたが、最近の記事は`dlang`、`D言語`のいずれかのタグが付いているようです。
改めてQiitaにはいろんな記事が書かれているんだなと、ただただ感心しました。世の中は広いです。

|プログラミング言語|件数|
|:-----------------|---:|
|Python|14926|
|JavaScript|9475|
|Ruby|7398|
|PHP|4433|
|Java|3562|
|Swift|3048|
|C#|2429|
|TypeScript|2414|
|Go|2009|
|C++|1774|
|Kotlin|1310|
|SQL|1199|
|Bash/Shell|956|
|Rust|899|
|GoogleAppsScript|863|
|R|776|
|C|634|
|PowerShell|626|
|Dart|583|
|Elixir|408|
|MATLAB/Simulink|306|
|Scala|276|
|Julia|251|
|Haskell|193|
|Perl|174|
|Deno|156|
|ObjectiveC/Objective-C|133|
|VisualBasic/VB/VB.Net|133|
|SPARK|108|
|Apex|103|
|Elm|95|
|VBScript|93|
|Svelte|90|
|Delphi/ObjectPascal/Pascal|89|
|Assembly/アセンブラ/アセンブリ/アセンブリ言語|85|
|Fortran|84|
|Nim|75|
|Common-lisp/Lisp|74|
|ABC|69|
|Awk|64|
|F#|62|
|Verilog/SystemVerilog|61|
|Solidity|58|
|Lua|56|
|Scratch|54|
|Dlang/D言語|54|
|Applescript|50|
|なでしこ|49|
|Prolog|45|
|SAS|41|
|PLSQL|41|
|Scheme|41|
|SPSS|39|
|Erlang|36|
|Groovy|35|
|OCaml|33|
|Mind|32|
|Neon|30|
|COBOL|30|
|Stan|29|
|Clojure|27|
|ABAP|26|
|AutoLISP|26|
|VHDL|23|
|ML|22|
|J|20|
|OpenCL|19|
|MQL4|15|
|Tcl|14|
|Wenyan/文言|14|
|IchigoJam|13|
|Hack/Hacklang/HHVM|12|
|RPG|12|
|Icon|11|
|ActionScript|10|
|Crystal|10|
|CL|9|
|Vala/Genie|9|
|CoffeeScript|9|
|Forth|8|
|Smalltalk|8|
|Transact-SQL|5|
|Befunge|5|
|Io|5|
|LabVIEW|4|
|Idris|3|
|Logo|2|
|Q|2|
|Vvvv|1|
|Stata|1|