声に出して読みたい美しいPython用語18選。R18例文付き


# 背景

冷凍マグロ系スクリプト言語として知られるPythonは、
美しい名前のパッケージが沢山あることでも有名です。

* PyPy（ぱいぱい）
* pypan（ぱいぱん）
* pypants（ぱいぱんつ）

参考： 声に出して読みたい７つのPython用語
http://doloopwhile.hatenablog.com/entry/20120120/1327062714

これらの美しい名前のパッケージに魅せられ、
**どれくらい美しい名前のパッケージが存在するのか、**
**本気で調べてみることにしました。**

参考先の情報は2012年と少し古いですし、
今再度探せば、**さらに美しい名前**が見つかるに違いありません！！


# 調査の方針と概要

Pythonのパッケージ管理システム ＝ **pip** の対象パッケージは全て
**PyPI（ぱいぱい）**に登録されています。
https://pypi.org/
※ぱいぱい、と読むかどうかは流派があるようです。

総数実に「**219,370**」個！（※2020年2月現在）
とても人手で確認出来る量ではありません。

全く使われていない休眠パッケージは除外したいため、
**直近１年間で一回以上のインストールがあるパッケージ**
を対象にしたいと思います。
例えば、参考先サイトが掲げている、
**Pychinko(ぱいちんこ)**
は既にこの世に存在しないようで、除外されますし、
**Pyzuri(ぱいずり)**
も残念ながら全くダウンロードが無いようで、除外されます。

こういった全パッケージ名称と、そのダウンロード情報は、
**pypinfo**と**BigQuery**を使うことで取得可能です（詳細後述）。

パッケージ名称は英数字であるため、
**無理やりカタカナ読みする**日本語変換処理を行います。
（パッケージ名は単純な英単語ではないため、
　これが結構難しい処理になります）

最後に、予め作っておいた**「美しい言葉リスト」**を用いて
日本語化したパッケージ名称に対して検索をかけます。

このような地道な努力によって、
~~オモシロイ~~美しい名前のパッケージを
**大量に見つけることができました！**

# **結果発表！！**

コードの前に、さきに結果をご紹介します。
いろいろ見つかったのですが、１８個に選定しました。
参考先の記事が平成版だとすると、
令和版１８選、略して「**Ｒ１８**」と呼ぶことにします。

**ぱいそん**の美しきネーミングセンスを、例文付きでご堪能ください。

※ふりがなは、正式な読み方ではなくあくまで、
　今回作成したカタカナ読み変換ツールによる自動付与結果です。


## sexmachine（せっくすましん）

直近1年間で、31,001 DL
名前が女性か男性かを判断するツールです。

４月になったら新人プログラマーに大声で教えてあげましょう。
**例：分からない時は【sexmachine】に聞け！**


## methanal（めすあなる）

直近1年間で、163 DL
仮数フォームおよびユーティリティウィジェットライブラリです。

４月になったら職場で叫んでみましょう。
**例：休日はずっと【methanal】をいじっていたよ**


## thefuck（ざふぁっく）

直近1年間で、64,492 DL
コンソールコマンドのエラーを修正するツールです。
https://github.com/nvbn/thefuck

エラー発生時に、とにかく「ファッ〇！！」と
驚きの声を上げてしまう方に、自動対応してくれて人気がある模様。

４月になったら兎に角、よんでみましょう。
**例：【thefuck】【thefuck】【thefuck】！！**


## pyzure（ぱいずり）

直近1年間で、427 DL
Microsoft Azure SQL DBにデータを簡単に送信するPythonパッケージです。
https://github.com/dacker-team/pyzure

本家のpyzuriは消えたものの、新たな逸材を発見しました。

４月になったらみんなに話してあげましょう。
**例：昨晩【pyzure】にトライして、良かったなあ**


## askocli（あすくおしり）

直近1年間で、78 DL
リモートのAskOmicsにデータを**挿入**するためのcliツール、とのこと。

４月になったら優しく諭してあげましょう。
**例：挿入するときはまず【askocli】だよ**


## stockings（すとっきんぐす）

直近1年間で、71 DL
完全なメッセージの送受信を可能にするWindows / Linux、
Python 2および3互換のソケットラッパー。

４月になったらこっそり打ち明けましょう
**例：実はいま【stockings】を使っているんだ**


## osex（おせっくす）

直近1年間で、34 DL
詳細不明です。ドキュメントが無いため扱いにくいかもしれません。

４月になったら相談してみましょう
**例：【osex】にハマって、困ってるんです**


## pypi-cli（ぱいぱい-しり）mypypi（まいぱいぱい）

直近1年間で、488 DL、109 DL

ぱいぱい系は大量にあるため、全量は記載出来ません。
きっと使い勝手の良いパッケージも多いことでしょう。

４月になったら絶賛しましょう
**例：【mypypi】は最高だ！**


※pypi-rankings（パイパイ-ランキングス）とかもありました。
　例：昨日はずっと【pypi-rankings】を見ていたんだ


## pypants（ぱいぱんつ）pypandas（ぱいぱんだす）

直近1年間で、570 DL、1,114 DL

４月になったら大きな声で宣言しましょう
**例：わたしはいつも【pypandas】**


## pants（ぱんつ）fancypants（ふぁんしーぱんつ）

直近1年間で、535 DL、40 DL

４月になったら同僚に紹介してあげましょう
**例：ぼくの【fancypants】を見せてあげるよ！**


## doraemon-robotframework（どらえもん-ろぼっとふれーむわーく）

直近1年間で、512 DL
受け入れテストとロボットプロセス自動化（RPA）のための汎用自動化フレームワーク
＝「robotframework」を青タヌキの形にしたもののようです？

４月になったら宿題を忘れても怖くありません
**例：困ったときは【doraemon-robotframework】に頼むことにするね**


## baka（ばか）

直近1年間で、49 DL
Pyramidのコアを使用するWebアプリケーションフレームワーク？のようです。

４月になったら試してみましょう
**例：パソコンに【baka】を入れてみたんだ**


## hncomments（えっちんこめんつ）

直近1年間で、52 DL

４月になったら何となくつぶやいてみましょう
**例：【hncomments】。ふふふ**


## sexytime（せくしーたいむ）sexy-fun（せくしーふぁん）

直近1年間で、52 DL、25 DL

４月になったら今後の期待を語りましょう
**例：これから【sexytime】をはじめようか！**


## 感想（かんそう）

英語からカタカナにするところが一番大変だったのですが、
英語の時点で既に**パワーワード**が多かったです。

４月になったら、ぜひ実際に職場や学校などで
声を出して読み上げてみましょう。
**周囲の方はきっと「春の訪れ」を感じると思います**。

---

以下は技術的な詳細なので~~多くの人は見なくてよいと思います。~~
興味のあるかたはぜひご参照ください。

**美しい名前のパッケージ群**を、**真面目に紹介**しており、
かつ、その**取得用コードを解説している本記事**が
**「検閲/削除」されることは全く心配していません**。

しかし、**心が汚れたオトナ**が見ると、
**本来の意図とは別な意味**に受け取ってしまうかもしれません。

**諸般の事情につき本記事は**
**不意に消えてしまう可能性がある点、あしからずご了承ください。**
消える前にぜひお手元でお試しくださいませ。

# ①パッケージ一覧＆ダウンロード数情報取得（pypinfo）

pipのパッケージが登録されているPyPI（ぱいぱい）では、
その統計情報のデータセットを
**Google/BigQuery**で公開しています。
その情報を容易に取得出来るツールが
**pypinfo**です。

BigQueryを操作するために、
下記のサイトの手順に従って、
https://github.com/ofek/pypinfo
Google Cloud Platform（GCP）のアカウントと、
認証情報（JSONファイル）を作る必要があります。

JSONファイルまで作成したら、ブラウザで
Colaboratory（https://colab.research.google.com/?hl=ja）
を立ち上げて、以下のようにコマンドを実行していきましょう。

```py:GoogleDriveをマウントします。
from google.colab import drive
drive.mount('/content/drive')
```

```py:今回の作業フォルダを作ります。
!mkdir "drive/My Drive/PYPI"
#さきほど作成した認証用のJSONファイルをここにアップロードしましょう。
```

```py:pypinfoをインストールします。
pip install pypinfo
```

```py:認証用のJSONファイルのパスを指定して、認証情報を取得します。
!pypinfo --auth "/content/drive/My Drive/PYPI/YourGCPProjectName-XXXXXXXXX.json"
```

```py:pypinfoの疎通確認（こんな感じに「request」のダウンロード数が取得出来ます）
!pypinfo requests

#Served from cache: False
#Data processed: 67.70 GiB
#Data billed: 67.70 GiB
#Estimated cost: $0.34
#
#| download_count |
#| -------------- |
#|     61,319,474 |
```

他にも、国ごと、バージョンごと、インストール先OSごとなど、
様々な情報を取得出来るので、公式サイトの例に従って試してみましょう。

上記の「Estimated cost: $0.34」にあるように、
BigQueryでは、クエリを投げるごとに、
読み取ったデータ量に応じて課金が生じることには注意が必要です。
が、1 TB/一か月のAlways Free枠と、
新規GCPユーザ用の300＄/年の無料枠があるため、
通常の使い方では大丈夫でしょう。
全量取得系の重いクエリだけは、連射しないように注意してください。

では、ついに今回のデータ取得用のクエリを投げてみます。

```py:直近１年間を指定してクエリを投げ、結果をファイルに保存。
!pypinfo --days 365 --limit 250000 "" project > "drive/My Drive/PYPI/PYPINFO_365_LIST.txt"

#Served from cache: False
#Data processed: 636.49 GiB
#Data billed: 636.49 GiB
#Estimated cost: $3.11

#| project                                                                           | download_count |
#| --------------------------------------------------------------------------------- | -------------- |
#|                                                                           urllib3 |    950,108,414 |
#|                                                                               six |    788,263,157 |
#|                                                                          botocore |    693,156,212 |
#|                                                                          requests |    656,942,399 |
#  ～～以下略～～

```

ご参考までに、
直近１年間の総ダウンロード数は、
約 37,498,000,000 回
パッケージの種類は、約 215,000種類 でした。

パッケージの総数が約22万種類なので、
直近１年間レベルで見ると、登録されているものは
ほとんどが「生きている」ことになります。
以前あったと言われているPychinko（ぱいちんこ）が無いことから、
定期的に棚卸しされているのかもしれません。
また、直近３０日で見ると13万4千種類ほどでしたので、
多少まともに使われているものは10万種類以下くらいでしょうか？

# ②取得データの加工

先ほど取得したパッケージ名＆ダウンロード数のファイルは、
手元で人が閲覧する分には見やすくて便利なのですが、
プログラミング的に扱うには、パースして加工する必要がありますね。

冒頭のクエリのコストの行や、表の見出し行/Total行などの除去に注意して、
下記のように加工してLIST形式にします。

```py:結果ファイルを加工しながら読み込んでLISTにする
f = open('/content/drive/My Drive/PYPI/PYPINFO_365_LIST.txt')
line = f.readline() # 1行ずつ読み込む(含：改行文字)

pypinfo_list = []
while line:
  #敷居が三つの場合＝見出しと枠とTotalがジャマだが、それ以外はこの条件で判別可能
  if line.count('|') != 3:
    line = f.readline()
    continue
  else:
    #改行コード、カンマ、半角スペースは除去
    parsed_line = line.replace('\n', '').replace(' ', '').replace(',', '')
    one_data = parsed_line.split('|')
    #['', 'urllib3', '950108414', '']の形の真ん中２個を使う
    # 備考：数値もいまのところ文字列扱い
    one_data = one_data[1:3]
    pypinfo_list.append(one_data)
    line = f.readline()
f.close

#最初の２行の見出し行と、最後の合計行は除去
pypinfo_list = pypinfo_list[2:-1]
```

pypinfoが提供していたりしないのかなーと思いながらも、
自作してしまいました。仮に有ったとしても、
一回約３＄かかるクエリなので、テキスト版と別に投げるより、
クエリ投入回数の節約にもなるでしょう。
この①と②は、Python関連の「データ分析」を行う際にも有用だと思います。

# ③パッケージ名をカタカナにする技術（alkana.py＆頑張る）

さて、パッケージ名の一覧化が出来ましたが、
例えば、urllib ⇒ユーアールエルリブ
python-dateutil ⇒ パイソン-デイトユティル
などのようにパッケージ名をカタカナ化するには
どうしたら良いのでしょうか？

方針は以下の４ステップです。
１．英単語として存在している言葉をカタカナにする
２．Pythonや、AWS、GITなどのIT特殊用語をカタカナにする
３．「ローマ字変換」を適用出来るだけ適用する
４．残った端数の文字は適当に変換しておく：ｆ⇒フ、など。

最初の、「英単語をカタカナに」は、下記の
**alkana.py** の変換テーブルを使わせていただきました。
https://github.com/cod-sushi/alkana.py/blob/master/README_ja.md

２～４については、主にローマ字の規則表から、
330行ほどの変換テーブルを作成しました。
前述のalkana.pyからのデータと足し合わせて、
alkana_listとして変換テーブルを作っておきます。

ここでのポイントは、その英語の文字列の長さをキーとして、
alkana_listを降順にソートしておくことです。

```py:x[0]の項目にはあらかじめ文字列の長さを入れておく
alkana_list = sorted(alkana_list, key=lambda x: x[0], reverse=True)
# py ⇒ パイ、や、python ⇒ パイソン など優先度の高いものについては、
# [30, 'py', 'パイ'] などと長さが長いことにして登録すれば優先度が上がる。
```

これで、長い単語から順に変換が適用されることになります。
実際に変換している様子は以下です。
分量があるため、一回５０分くらいかかります。
下記のようにtqdmで途中の進捗を表示したり、
処理終了後はpickleで保存しておくと使いやすいでしょう。

```py:全モジュールにカタナカ読み情報を付与する
from tqdm import tqdm

pypinfo_jp_list = []
for pypinfo in tqdm(pypinfo_list):
  #日本語モジュール名格納変数（この時点では英語を格納）
  jp_module_name = pypinfo[0]
  for data in alkana_list:
    #変換テーブルを、順番通りに変換していく。
    jp_module_name = jp_module_name.replace(data[1], data[2])
  pypinfo_jp_list.append([pypinfo[0], jp_module_name, int(pypinfo[1])])

print(len(pypinfo_jp_list))
print(pypinfo_jp_list[0:10])

import pickle
with open('/content/drive/My Drive/PYPI/pypinfo_jp_list.pickle', 'wb') as f:
    pickle.dump(pypinfo_jp_list, f)
```

特殊な自然言語処理ツールとして、
なにか用途もあるかもしれません。

# ④「美しい言葉」が使われているパッケージを探す

最後に、特定のキーワードが含まれているパッケージを探します。
予め「Beautiful_tango_list」に**お好みの単語**を登録しておき、
ひたすらループするだけです。
「ぱい」などの多数使われている用語を入れると、
結果が膨大になってしまう点は注意しましょう。
今回は、とある「お上品な単語をリストアップしているサイト」
の単語を拝借しました。

Colaboratoryではprint出力は5000行までだと思うので、
１万行くらいいくならば、下記のようにファイルへ出力する方が良いでしょう。

```py:Beautiful_tango_listの内容を検索してテキストに書く
result_str = ""
for word in Beautiful_tango_list:
  result_str += "■"+" "+ word + "\n"
  for data in pypinfo_jp_list:
    if word in data[1]:
      result_str += str(data) + "\n"
  result_str += "\n"
  
with open('/content/drive/My Drive/PYPI/Beautiful_Result.txt', 'w') as f:
  print(result_str, file=f)
```

**おつかれさまでした。**
これらの技術＆コードを駆使して、前述の結果のような、
美しい名前のパッケージを多数見つけることが出来たのです。


# あとがき

**Python（ぱいそん）のネーミングセンス**は奥が深いですね。
辞書をひくときに隣の単語もみるように、
名前との偶然の巡りあわせだけからでも、
お気に入りのパッケージとの出会いが生じたら素晴らしいことです。

**PyPI（ぱいぱい）が引き合わせた運命の出会い**、
とも言えるでしょう。
技術への興味のきっかけが「名前が気になったので」
でも良いのではないでしょうか？

いたって真面目にパッケージを紹介している記事ですので、
本来の意図とは違った意味を連想してしまうような、
**心が汚れたオトナのかたは、石を投げないでください。**
どうぞよろしくお願い申し上げます。

**さあみなさんも、もっと**
**ぱい○ん と ぱいぱ○ が**
**すきになりましたでしょうか？**

ここまでお読みいただいた賢明な読者諸氏には、
**○ に入る言葉は明らか**ですね。

誤解してしまう方や、本記事にあらぬ文句を言う方がいたとしたら、
普段から**そのようなことばかり考えている方**に違いありません。


現場からは以上です。