White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

10年間溜まったPython2 Twitter botの技術的負債を返済した話

(この記事は以前Qiitaに書いたものの転載になります) この記事はPython2アドベントカレンダー(https://qiita.com/advent-calendar/2019/python2 )の12/23分の記事です。(え?Python2ってPythonアドベントカレンダーって意味で、Python2のカレンダーじゃないんですか?)

TL;DR

Python2で動いてたシステムをPython3で動くようにしましている最中です

はじめに

10年ほど前に、Twitterで自動的に応答する人工無脳を作成しました。この人工無脳マルコフ連鎖によるテキストの自動生成と、特定の文字列に対する返信する機能をもっていました。

https://twitter.com/ha_ma

しゅうまい君ほど注目は浴びていないですが、一時期は(自分の知らない間に)NHKに取り上げられたりはしました。その時身につけたデータ収集に関する知識や自然言語処理の初歩知識等は、その後のキャリアに生かされております。 その後、東日本大震災の影響もあり自宅でマシンを常時稼働しておく余力も無くなったため、テキストの自動生成機能は止めて応答機能だけ残しております。 そうこうして10年近く回してきたのですが、Python2が2020年1月でメンテされなくなるのと、Python3の機能がそろって来たのとあり、Python3を中心としたシステムに置き換えることにしました。

構成

Before

After

ソース: https://github.com/showyou/docker-chatbot-lite/tree/add_db 使用に当たっては設定が必要なのと、一部まだ不完全なので、そこを後ほど修正します。

移行にあたって

Python2->3への移行は、割と簡単でした。ただし条件がありまして、Mecabを現在動かしてないのでその部分の移行は行っておりません。 うちのシステムの場合、Python2から3へ移行した時に変更した箇所は、次の部分くらいです。 - Print関数に()をつける - Unicode関数を削る

SQLAlchemyをバージョンアップさせた際にも、少し手直しが発生しました。 - BigIntegerが桁数を引数に取らなくなっているっぽいので、引数削除

他にも - tweepyのauth.access_token.keyがauth.access_token, 同access_token.secretがaccess_token_secretへ変わってるので変更

KVM(QEMU)からdockerへ

これは別にコード化してモダンにしようと思ったわけではありません。Ubuntuをアップデートした時にQEMU仮想マシンのネットワーク機能がおかしくなり、否が応でも変えざるを得ないからでした。

Serverlessについて

今動かしてる部分のコードであれば、データを貯めるDBさえなんとかなれば自分のサーバは破棄してAmazonとかのFunctionサービスあたり使ってもいいかもしれません。ただしバッチで既存のデータを学習させるのに使えるのかどうかは怪しいところです。

JenkinsからDigdagへ

digdagのWebUIに認証機能がないので、セキュリティ的にはかなり心配です。

Python2を使うか3を使うか

時期の問題はあります。少なくとも今から新規で開発するのにPython2はありえないです。しかしPython3出たての頃は、色々機能が足りない部分があったりしたので、早期に「Python3に移行しろ」って言ってた人は筋違いだと感じます。

最後に

ありがとう、さようならPython2

・・と思ったらサポートが2020/1から2020/4まで延長してるんだけど!どういうことだよ! http://pyfound.blogspot.com/2019/12/python-2-sunset.html

参考

https://qiita.com/kojisuganuma/items/15a6c50c05d80fbd60b1 https://qiita.com/kanga/items/7f2849ad5a2a625a662c

12/24追記

  • digdagをコンテナに入れて
  • 同じdockerクラスタmysqlのコンテナを入れて
  • digdagからbotのコンテナを起動する

場合、botのコンテナとmysqlのコンテナでネットワークが違って繋げないように見えるのですが、いかがなのでしょうか・・ f:id:showyou:20200328122640p:plain