2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

mong続報 - Dockerの名前生成ツールは2年前にPythonに移植されていた-

Last updated at Posted at 2019-12-22

mong - Dockerのコンテナ名をランダム生成するコードをPythonに移植してみた -の続きです.

TL;DR

  • namesgenerator というパッケージが見つかりました.mongは見事に車輪の再発明でした.
  • 一方namesgeneratorは2017年12月からアップデートされていないので辞書が古く,生成できるパターンが本家やmongより少ないです.
  • mongでインスタンス生成が必須なのは使いにくかったので namesgeneratorを見習ってmong.get_random_name()を追加してみました

namesgenerator

Google, pypiで検索していて Dockerの名前生成ツールのPython版はないなぁと思っていました.しかしGitHubのコード検索をしてみたら,一瞬で下記が見つかりました.GitHubすごい.

上記のレポジトリにはPython版のほか,JavaScript/TypeScript版も含まれています.
pypiにも登録してあったので,インストールも一瞬です.
pypiの統計を見ると,月間1,000ダウンロードあるので,それなりに需要もあるようです.

もう,これを使えばいいじゃん,と思ったのですが,反省も兼ねてコードリーディングしてみました

namesgenerator と mong の違い

大きく下記の4点が違います

  1. 辞書の持ち方
  2. 関数 or クラス
  3. boring_wozniak のときの再生成の方法
  4. get_random_nameの引数

辞書の持ち方

mongは辞書を別ファイルにしているのに対して, namesgeneratorはpythonコード中にべた書きしています.べた書きすると,データ読み込み処理が不要で楽なのですが,メンテがつらそうです.

namesgeneratorは2年前に更新がとまっているので,それから本家に追加された語もあるかと思い,辞書のエントリ数で比べてみました:

  • namesgeneratorの辞書は形容詞が93語で人名が160語
  • mongの辞書(現在のmobyと同じはず)は形容詞が108語, 人名が235語

mongの方が形容詞で15語,人名で75語多いです.追加された語を調べる際に,べた書き方式だとGoのコードとPythonのコードを比較する必要があります.単純なdiffはできません.

一方でmongではmong/create_dict.pyを実行してGoコードからJSON形式の辞書を抜き出します.1行1単語にしてあるので,diffで差分が確認できます.もっとも,Goコードのフォーマットが大きく変わると辞書を抜き出すコードの修正が必要になるわけですが,mobyはそれなりに枯れているっぽいので大丈夫だと思います(思いたい).

以上から,メンテはmongの方が楽かもしれません.

関数 or クラス

namesgeneratorは名前生成を関数get_random_nameで提供していて,mongNameGeneratorクラスのget_random_nameで提供しています.クラスだといったんインスタンスを生成しないといけないので面倒です.mongを作り始めたときに,辞書を変更可能に,とか乱数シードの管理を別にできた方がよいのでは,などと考えてクラスにしましたが,一晩頭を冷やしてみるとそんなことはありませんでした.namesgeneratorの方式が良いです.

boring_wozniak のときの再生成の方法

namesgeneratorwhileループで生成ロジックを回している一方でmongget_random_nameメソッドを再帰呼び出しています.boring_wozniakが生成される確率は1/25,380なので,どちらでもいいかなと思います.

get_random_nameの引数

namesgeneratorretry関係のロジックがありません.ここ2年で追加されたのでしょうか.また,その代わりに形容詞と名詞をつなぐsepを変更できます.これも仕様変更でしょうか?

mongへの反映と今後の方針

いやー,見事に車輪の再発明をしてしまいました.

ただ,namesgeneratorの実装と比較することで良い点,悪い点の答え合わせができましたので,経験値が溜まってよかったかなと思います.また,良いところは見習おう,ということで関数方式を取り入れてmong.get_random_nameを追加しました.

つまり,今は下記のように書けるようになりました.

import mong
mong.get_random_name()  # 'trusting_engelbart'
mong.get_random_name()  # 'thirsty_brahmagupta'

今後ですが,namesgeneratorはメンテされていないので,mongをメンテしていくとそれなりに需要あるのかもと思います.

参考文献

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?