RHEL 7.5 で Python 2.7 が deprecated になりました

Red Hat Enterprise Linux 7.5 がリリースされ、そのリリースノートで "Python 2 has been deprecated" とアナウンスされました。

Chapter 54. Deprecated Functionality - Red Hat Customer Portal

Python 2 has been deprecated

Python 2 will be replaced with Python 3 in the next Red Hat Enterprise Linux (RHEL) major release.

次のメジャーバージョンでは Python 2 が Python 3 に置き換えられるから、 RHEL 7.5 から Python 2.7 が deprecated 扱いになるということです。

Ubuntu 18.04 LTS では main リポジトリから Python 2.7 を排除するのが間に合わなかったのですが、次の RHEL (8?) では Python 2.7 が無くなるようです。

さて、 Python コア開発者による Python 2.7 のサポートは2020年1月1日に終了しますが、主要なLinuxディストリビューションによるサポートがいつまで続くのかがこれでほぼ確定しました。 (Ubuntu 20.04 までには main から Python 2.7 を外すのは既定路線)

2025年を待たずに延命措置も終わるようです。 R.I.P.

Homebrew の Python で何が変わって何がもとに戻ったのか

rcmdnk.com

大分混乱した状態になってしまったので、今年何が変わってきたのか、今回の変更でどこまでもどったのかを整理しておきます。

1/19

python という formula が python コマンドをインストールしなくなりました。 python コマンドを起動すると、通常は /usr/bin/python が起動するようになりました。

1.5.0 — Homebrew

3/2

python という formula が Python 3 になり、 Python 2.7 は python@2 になりました。

python formula (Python 3) が python コマンドをインストールするようになったので、 python コマンドを起動すると通常は Python 3 が起動するようになりました。これが npm の gyp とか色んな所をぶっ壊す変更になっていました。

一方 python@2 formula は keg-only になっていたので、デフォルトではコマンドがインストールされず、必要に応じて brew link --force python@2 などする必要がありました。

コマンド名以外の変更として、多くの formula から depends_on "python" が消されました。今までは依存関係で python (Python 2) がインストールされることが多かったのが、システムの Python を使うようになります。

しかし、 vim など一部の formula では depends_on "python" が残っています。これらは Python 3 に依存するようになりました。

前回の記事

3/10

python@2 が keg-only でなくなりました。 python formula は python3 コマンドだけを提供し、 python@2 formula が pythonpython2 コマンドを提供するようになりました。 python コマンドが /usr/bin/python でなく Homebrew の Python 2 を起動するということで、この点については 1/19 以前の状態にまで戻りました。

1/19 以前の状態と現在の状態を比べると、次のようになります。

  • Python 2 の formula 名が python から python@2 になり、 Python 3 の formula 名が python3 から python になった。
  • 多くのパッケージから depends_on "python" が消えた。依存で Python がインストールされることが減り、代わりに macOSの /usr/bin/python が使われるようになった。 brew install python@2 をすることで macOS ではなく Homebrew の Python 2を使うことも可能で、そうすれば今まで通りの動作になる。
  • vim, macvim など幾つかのパッケージは、 depends_on "python" のまま、 Python 2 依存から Python 3 依存に切り替わった。オプションで Python 2 を使うようにビルドすることもできるが、 bottle が提供されるのはデフォルトの Python 3 依存版。

最終的に一番妥当な形に落ち着いたと思います。

これから 2020 年に向けて、 Python 3 をサポートしているソフトウェアには depends_on "python" を追加して、 Python 2 ではなく Python 3 上で動くようにしていくと良いと思います。

3月1日、Homebrew のデフォルトの Python が Python 3 になります。

以前からアナウンスされていた 通り、 3/1 (日本時間では 3/2 になるかも)にデフォルトの PythonPython 3 に切り替わる予定です。

現在そのプルリクエストがレビュー中です。

github.com

具体的には、今まで "python" という formula は Python2.7 でしたが Python 3.6 になります。 Python 2 をインストールするには brew install python2 もしくは brew install python@2 とします。(これまで使えていた python3 という Formula は python への alias になります。)

何らかの理由で意図的に Python 2 を選択しているユーザー以外は、 brew install python で(推奨される)Python 3をインストールできるようになるので、これは大きな前進です。

また、 Python 2 か 3 のどちらかに依存するパッケージが、今までデフォルトで Python 2 に依存していたのが、 Python 3 に依存するようになります。例えば vim をインストールする時、今までは brew install vim では Python 2 が有効になっていて、 brew install vim --with-python3 とすると Python 3 を有効にできるものの bottle (ビルド済みのバイナリパッケージ)が利用できずソースからビルドになってしまいました。それがこの変更でデフォルトで Python 3 が有効になります。

これで多くの vim, macvim ユーザーが +python から +python3 な vim に移行するので、vim プラグイン作者はより容易に Python 2 を切れるようになります。個人的に一番お世話になっているので例として vim を挙げていますが、多くのアプリで同じことがいえます。

Zenfone 4 を買ったけどスクフェスがダメだった

今のメイン端末は Zenfone 3。 会社の補助制度が使えたのと、最近アズールレーンなるゲームをやっててローディングや一覧画面のスクロールの重さに耐えかねて。

ZF3 の Snapdragon 625 はなかなかいいバランスのSoCではあるのだけれど、シングルスレッド性能がよろしくない。それがローディングの遅さにつながってるんだろうと踏んだ。ZF4 の Snapdragon 660 は、Snapdragon 625 に比べてシングルスレッド性能が倍になっているので期待。

まだ購入して数日でメイン端末を移行してないけど、感想。

  • 5.2" -> 5.5" に大きくなったので、大きさというか迫力がすごい。メインを切り替えたらなれるんだろうけど。付属のTPUケースをつけたら更にすごい。
  • 背面フラットは魅力に思ってたんだけど、今はケースつけたままにしてるので特に意味はない。
  • 画面分割で割合を変更するのに表示サイズを小にする必要があるのを今更知った。文字小さくなるので通常サイズでOKにしてほしい。
  • 指紋センサーが認識してくれない率がZF3から改善してない。ZF3では指紋登録画面でセンサーを触るとどの指紋に判断されてるかわかったので反応しない指紋を消して登録し直しできたんだけど、ZF4はホームボタン兼用になってるためにそれをやるとホーム画面に戻ってしまう。
  • アズールレーンはローディング倍速とは言わないものの快適になった気がする。あと今までフレームレートが低かった画面で多分60fpsのヌルヌルになってる事が結構あって、30fpsで良いからバッテリー消費抑えてくれと思ったり。
  • メモリが3GB→6GBに倍増してて、メールとか読んだあとでもゲームが落ちてない事が多いのも快適。
  • スクフェスのライブがダメ。ZF3ではエキスパート曲ほとんどフルコンしてるんだけど、ZF4じゃ全然できない。ノーツの速度が変動する。Nexus 5Xでも大丈夫だったはずなので、ASUSがサウンド周りでなんか余計なことをしたとしか思えない。

スクフェスの件が致命的でメイン端末の切り替えをどうするか悩み中。Oreoへのアップデートが上半期中に予定されているはずなので、それで直ると良いんだけど。

他のスクフェスプレーヤーたちが同じ罠にはまらないように記事に書いておく。


追記。ZF3にも4にもアップデートが来た。 ZF3 が Oreo になって劣化して、 ZF4 は変速がなくなって、同等になった気がする。 タイミング調整は両方共 -10 にしている。

Python の正規表現で IGNORECASE するときは気をつけよう

Python 3 で文字列が Unicode になりました。というだけで感のいい人は分かるかもしれません。

はい、大文字小文字の判断も ASCII じゃなくて Unicode になります。

In [6]: re.match("[a-z]", 'ı', re.I)
Out[6]: <_sre.SRE_Match object; span=(0, 1), match='ı'>

この文字は LATIN SMALL LETTER DOTLESS I だそうです。

予想外のものにマッチするのは単純にバグになりやすいのもそうですが、この [...] にマッチする部分を作るのも非効率的になります。Python の標準ライブラリの正規表現は最終段階以外が全部 pure Python で書かれているので、正規表現コンパイルが遅く非効率になります。

なお Python の標準ライブラリの正規表現は文字列だけでなくバイト列にも使えて、その場合はこういった罠はありません。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。