Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

xonshの2018年の歩み

- はじめに -

この記事は、Xonsh Advent Calendar 2018 - Qiitaの1日目の記事です。
1日目という事ですので、2018年を振り返ってxonshにどんな動きがあったかの簡単な振り返りです。


私は社内チャットにおいても #xonsh なるxonshの情報を発信する部屋を運用しています(誰も発言してくれないので私しか発言してないですが)。そこでxonshのアップデート情報及び、xonsh関連の情報をまとめていまして、今回はそちらから引用しつつ2018年の節目とできればと思います。


 

- 2018年まとめ -

xonshの2018年の流れを順を追いながらまとめます。
重要なワードを節としていくので、気になるところは目次より飛んで頂けると良いかと思います。

2018年前半のpython shellとしての歩み

2018年の0.5.2から0.5.8

2018年のreleaseタグは少々混雑していまして3月に0.5.3から0.5.8までが一気に打たれました。
2018年、最初のreleaseは0.5.2で、そこから一気に0.5.8まで流れていきます。
 
 
0.5.3を軽く振り返ります。
Release 0.5.3 · xonsh/xonsh · GitHub

多くのbugfixに加えて、python-prompt-toolkit(以下、ptk)のpygments依存が解消しています。
2018年の多くのxonsh releaseにおいてこのptkとのやり取りは切っても切り離せません。

ptkはPythonにおける補完やサジェスト、Syntax highlightなどの機能を含んだPure Pythonなツールキットです。
github.com
xonshのshell機能における根幹を担っているパッケージで、他にもjupyterに含まれるIPython REPL、python実装のvimであるpyvimなど、多くの実装がこのptkを利用しています。

ここまでptkは、pygmentsというSyntax highlightのためのパッケージに完全に依存していました。pygmentsの別途installが必要かつ、環境によってはカラー設定が変化してしまう事から、ptkではansiカラーを利用してFormatted textベースなカラーリングもできるようになりました。
Welcome! — Pygments
Asking for input (prompts) — prompt_toolkit 2.0.7 documentation

また、このreleaseではTab completion xontribの追加、subprocessの結果のredirect等、shellとしての強化が多く成されています。
  
0.5.4ではXONSH_HISTORY_BACKENDやHistoryEntryなど、履歴関連周りが良くなりました。
Release 0.5.4 · xonsh/xonsh · GitHub
また、この時bash_completionが別プロジェクトとして切り離されました。
xonsh上でbash補完を利用したい場合は、bash_completionを別途導入する形になりました。
bash_completionについてはまたアドベントカレンダー内で書ければと思います)
  
0.5.5では、$UPDATE_COMPLETIONS_ON_KEYPRESSで補完出す出さないの管理が出来たり、configファイルとなるxonshrc関連が多く変更されています。0.5.6では、catやechoなどのaliasを追加するcoreutils xontribやjediベースのタブ補完が使えるjedi xontribが追加されています。
Release 0.5.6 · xonsh/xonsh · GitHub
Release 0.5.5 · xonsh/xonsh · GitHub
import文の前後で発火するイベントが増えたり、Windows上のコンソールにおけるbug fixなども入っています。
 
0.5.7です。
Release 0.5.7 · xonsh/xonsh · GitHub
subprocessのリスト、文字列のリダイレクトは非常に大きな改善だったかと思います。以下がやっと動くように。

echo hello world >/dev/null.

加えて、xonsh独特な@(...) syntax がgenerators、tuples をサポートするようになったり、python shellとしても改善が進みました。
 
0.5.8では_TeeStdクラスに変更が入っています。
Release 0.5.8 · xonsh/xonsh · GitHub
xonshでは標準入出力を独自のTeeStdクラスによって管理している事は知っておいた方が良いでしょう。
xonsh/base_shell.py at master · xonsh/xonsh · GitHub
前年度のアドベントカレンダーで、xonshの入出力をイジろうとした時、私もこのクラスでハマっています。
vaaaaaanquish.hatenablog.com

0.6.0に向けた怒涛のbugfixラッシュ

0.6.0に向けた細かなbugfixやrelease.xshの修正が続きます。
Release 0.5.9 · xonsh/xonsh · GitHub
Release 0.5.10 · xonsh/xonsh · GitHub
Release 0.5.11 · xonsh/xonsh · GitHub
Release 0.5.12 · xonsh/xonsh · GitHub

xonshにcontributeした時は、以下にあるように/newsディレクトリ配下に更新内容を書いた[branch名].rstを追加します。
(プルリク出すと「追加してくれ!」って言われます)
Developer’s Guide — xonsh 0.8.3 documentation

各プルリクで追加されたrstファイルがmergeされてreleaseタグの内容となる仕組みです。
自分出したプルリクで書いたrstがreleaseタグに書かれているとちょっと嬉しいですし、後で記録に残る良い習慣です。
開発者向けですが、それらが整備されているのも非常に大切なOSSの要素の一つだと感じます。

 

Python3.6以降もサポート0.6.xが出た!

0.6.0ではついにPython3.6のf-stringがサポートされました。
(といってもこの時はまだprint時に使えるかなくらいのレベルでしたが)
Releases · xonsh/xonsh · GitHub
またdeprecation用のデコレータ、xonsh関数のAssertion等が追加され、Python shellとしての機能拡張が進みます。
個人的には、この時追加されたTask Scheduler、cronの役割を担うschedule xontribも割と使っています。

0.6.1ではWindowsにおけるMSYS2のサポートや`~/.config/xonsh/rc.xsh`にあるrcファイルの読み込みが追加されています。
Release 0.6.1 · xonsh/xonsh · GitHub
0.6.xでの変更箇所は大きく、同僚とも「Linuxでlsできなくなった」「コメントが効かなくなった」等の会話をした記憶があります。0.6.0以降、毎週のreleaseにおいて数多くのbug fixが発生しています。ここでは書ききれないので省きますが、この辺りで多くのPython周りのbugが修正されています。

0.6.xのどこか辺りでimportも高速化されたんですが、ちょっと思い出せなかったです…
 

config.jsonの死

0.6.2より前では、xonshrcの他にconfig.jsonなるファイルを利用して設定できる項目がいくつか存在していました。
Release 0.6.2 · xonsh/xonsh · GitHub

ここでconfig.jsonは完全にサポートされなくなりました。
「Static configuration is dead (config.json), long live run control (xonshrc)!」
config.jsonに関する記載がWeb上には幾つかありますが、今はもう亡き存在として扱って大丈夫です。
 

Python3.7の問題児Async/Await対応

0.6.3でいくつかのbug fixとError入出力の変更を経て、0.6.4ではPython3系の革命児であり問題児であるAsync/Awaitをトークナイザーのキーワードに追加する対応をしています。
Release 0.6.3 · xonsh/xonsh · GitHub
Release 0.6.4 · xonsh/xonsh · GitHub
Python3.7で予約語に追加され、様々なフレームワークで課題になっているAsync/Await。
xonsh本体に大きな影響はなかったと捉えていますが、それでもやっぱり対策は大事です。

promptゾンビ問題の解消

0.6.5で設定ウィザードのI/Oが修正、0.6.7でEnvPathのメソッド拡充が行われた後、0.6.7でゾンビプロセス問題が解消しました。
Release 0.6.5 · xonsh/xonsh · GitHub
Release 0.6.6 · xonsh/xonsh · GitHub
Release 0.6.7 · xonsh/xonsh · GitHub
これは割と使う側から見て大きな改良かと思います。pythonのサブプロセスが結果を返せなかった時に発生していたissueで「xonsh使うとPCが重い」といった現象の元になっていました。この辺りから、不意にxonshが落ちる現象がほぼ無くなり、安定して常用できるshellになってきたように記憶しています。

 

2018年後半の山場 ptk2.xへの移行

ptk2.x対応スタート

大きな変更となったのが前述しているコアライブラリであるptkのバージョンアップです。
ptk 1.xから2.xにおいては、いくつかの破壊的変更が含まれており、それらを利用するjupyter等も順次対応していく形となったのが2018年の後半の動きです。

0.7.0がそろそろ出るか否かという時期の0.6.8で、ptk 2.x対応必要だよねという流れが出来てきました。
Release 0.6.9 · xonsh/xonsh · GitHub
ひとまずreadlineが起動する所まで、ここでfixされています。

その後小さなサブプロセス周りの拡充0.6.10を経て、ptk2.xに完全対応していく0.7.xが始まりました。
Release 0.6.10 · xonsh/xonsh · GitHub

怒涛のptk2.x対応

7月には0.7.0が出ました。

ptk2.xの対応は、ひとまず動くという状態でしたが、$SHELL_TYPEで切り替え可能になっていたりしたので一通り使えるようにはなっていました。

ユーザ目線では、prompt-toolkitに含まれるメソッドが大きく変更されたため、xonshrcの書き換えが必要になりました。
以下にも記載していますが、一番汎用的な例を出すとKeybindの書き方が変わります。
vaaaaaanquish.hatenablog.com
以下は複数行のコマンド入力中にctrl+vでvim編集できるようにする設定ですが、メソッド構成が変更になったことによって書き方を変える必要が出ました。

from prompt_toolkit.keys import Keys

@events.on_ptk_create
def custom_keybindings(bindings, **kw):

    # ptk 2.x
    @bindings.add('c-v')
    def edit_in_editor(event):
        event.current_buffer.tempfile_suffix = '.py'
        event.current_buffer.open_in_editor(event.cli)

    # ptk 1.x
    handler = bindings.registry.add_binding
    @handler(Keys.ControlV)
    def edit_in_editor(event):
        event.current_buffer.tempfile_suffix = '.py'
        event.current_buffer.open_in_editor(event.cli)

前年度のアドベントカレンダー等を見返してもptk 1.x形式で記載している場合があるため、注意が必要になってきます。


0.7.1では、その他ptk2.xで動かなくなった機能などの一斉fixが行われました。
Release 0.7.1 · xonsh/xonsh · GitHub
手前味噌ですが、私もここからcontributerになりました。最初は「コンソールが下までスクロールした時ptk2.xが補完出してくれない」というbugをptkのソース読みながら直しました。以降は、bugやドキュメントの整備などをやっています。

2018年の冒頭に出てきたpygmentsもptk2.xへの変更で更なる課題となってきました。
マルチプラットフォームに対応するだけでなく、新しいptkのcolor styleも取り入れながら0.7.3が登場しました。
Release 0.7.3 · xonsh/xonsh · GitHub

また、ここでjupyter notebookのxonsh Kernelも上手く動作するようになっていきます。
0.7.4でもxonsh-catなどjupyter kernel周り、ptk2.x移行時のcolors names、補完のバグが修正されています。
Release 0.7.4 · xonsh/xonsh · GitHub

0.7.4から数時間後には、ptk2におけるhistoryの順番がfixした0.7.5が出ました。爆速開発です。
Release 0.7.5 · xonsh/xonsh · GitHub

はじまるptk拡張

なんでこんな大きな変更を含んだptk2.xなんじゃいというのもあるんですが、ptk2.xの更新はデカいです。
例えば「補完を上下移動で選択」が「左右移動でも選択可能」になったのはptk2.xからです。

補完の拡張となるalias stackが0.7.6で出ました。メイン開発者のscopatzは個人的に使ってたみたいですが、乗っかる形ですね。補完魔改造時代のスタートです。
Release 0.7.6 · xonsh/xonsh · GitHub

def _f():
    def j():
        pass
    global aliases
    aliases['j'] = j
    def completions(pref, *args):
        return set(['hello', 'world'])
    completer add j completions "start"
_f()
del _f

f:id:vaaaaaanquish:20181118021840p:plain

続く0.7.7では、$XONSH_HISTORY_MATCH_ANYWHEREをTrueにする事で上矢印で履歴エントリを検索できるようになりました。
xonsh/xonsh https://github.com/xonsh/xonsh/releases/tag/0.7.7
これ自体はptk2.xの恩恵という訳ではないですが、shellとしてかなり一般的に使われている機能で、また一つ力強くなったように感じます。

opensource.comとクックパッド、そしてHacker News、GitHubトレンドへ

ちょうど0.7.7周辺でMoshe Zadka氏により「Why I love Xonsh」なる記事がOpensource.comに投稿されます。
opensource.com

また、0.7.8になる手前辺りでクックパッドインターンの体験記事に「インターン生がxonshを使っている」という文言が出てきました。
nanabyo.hatenablog.com
流石クックパッドさんですね。

少しずつxonshが話題にされていた9月頃、Hacker Newsに「Xonsh: Python-powered, cross-platform, Unix-gazing shell」なるスレッドが立ちました。
Xonsh: Python-powered, cross-platform, Unix-gazing shell | Hacker News
そこでは、メイン開発者であるscopatzが実際に投稿するなど盛り上がりを見せ、Hacker News内のトップスレッド20に入るなどしました。
世界を見た時にHacker Newsで話題になる事がどれだけ大きいか。

その後、9月のgithub trendにもxonshがランクインします。
https://github.motakasoft.com/trending/?d=2018-09-15&l=python
話題として今年最も躍進した月でした。

jupyterもptk2.xへ

この頃、ちょうどjupyter(より正確にはIPython)もptk2.xへの対応が進みました。

jupyterのptk2.x対応以前では、ptk2.xをインストールした状態でpython kernelを動かすと落ちるという課題を抱えており、xonshとjupyterを併用で利用するのが少々複雑な状態でした。私個人においても pip install prompt_toolkit==1.0.15 等を推奨していました。

github.com

現在、ptk2.xでの課題はほぼほぼ解消しています。この関係性によって、xonshにコミットしptkにコミットする事でjupyterプロジェクトにも貢献できるという所が非常に楽しいです。

2018年後半、そして0.8.xへ

増えるpython機能のサポート

0.7.8ではcollections.ChainDBがサポートされました。
Release 0.7.8 · xonsh/xonsh · GitHub

0.7.9では以下のように@(expr) syntaxが書けるようになり、かなり便利になりました。
Release 0.7.9 · xonsh/xonsh · GitHub

$ echo /path/to/@(['hello', 'world'])
/path/to/hello /path/to/world

0.7.10では、 f-stringを利用してf"{$HOME}" のように環境変数を参照できるようになりました。
Release 0.7.10 · xonsh/xonsh · GitHub

徐々にpython本体の便利なメソッドを吸収しつつ、shellとして進化していきます。

0.8.xが来た!Archにも来た!

いよいよ0.8.0の登場です。ここまで一部変更できず気になっていた色の問題も$PTK_STYLE_OVERRIDESの登場により、ほぼ完全にxonsh上の全ての色を完全に設定できるようになりました。
Release 0.8.0 · xonsh/xonsh · GitHub

0.8.1では、ついにforeign shellsからfishが消えました。また、この時からArch Linux official repositoriesからxonshが利用できるようになりました。Archは良いぞ。
Release 0.8.1 · xonsh/xonsh · GitHub

他にも以下のようにSubprocSpecにpipeline_indexなる属性が付くようになりました。
使い所は少々難しいですが、shellの結果をPythonに流すような場合に汎用性が高まったと言えるでしょう。

p = ![ls -l | grep x]
p.specs [0] .pipeline_index == 0

0.8.2ではf-stringsが完全に動作するようになりました。!を利用した構文とカニバるので!を犠牲にするわけですが、pythonの機能を優先するという意味で良い改修だったと思います。
Release 0.8.2 · xonsh/xonsh · GitHub

記事執筆時(2018/11/18)のlatest 0.8.3です。
Release 0.8.3 · xonsh/xonsh · GitHub
Annotation assignment statements (x : int = 42)がfix、from x import (y, z,)がfixするなど、Pythonの書き方をshell上で再現できるようになってきました。

あと私は使ってないんですがvirtualenvのサポートが含まれており、これは結構待望されてた感じなのではないでしょうか。


加えて、0.8.xから古い書き方に対して警告が出るようになり始めました。
徐々に移行していく必要があります。
(1.x.xの匂いが少しずつしている感じか…!?)

 

-おわりに -

急ぎ足で、主に追加された機能の多くを振り返っていきました。開発スピードも早く、2018年話題になった事で開発者も増えたxonshの動きをこれからも応援しcontributeしていければと思っております。

メジャーバージョン1.x.xも見えてきて、めちゃくちゃ楽しみな2019年になると思っています!
来年も良いxonshの年にしていきましょう!


明日はあの74thさんです!
アドベントカレンダーはまだまだ空きがありますので、ちょっと触ってみただけでも書いて頂けると助かります!!
qiita.com

宜しくお願いします!!