Try   HackMD

PyConJP 2020 sprint targets

  • Leader: Hiroshi Miura (OpenStreetMap Foundation Japan)
tags: PyConJP, 2020, Sprint

紹介プレゼン https://hackmd.io/@miurahr/S1fwEzRzP#

実施記録

参加者1: Hiroshi Miura
  • テーマ Py7zr support update mode
    1. close()時に圧縮データの生成と書き出しを実施しているのを、write時におこなえるように、リファクタリングを実施。→Done →リリース済
    2. Appendする関数を追加しヘッダーをかきこむ→Done
    3. 従来のコードにおいて、read時とwrite時で状態変数の単位や用途の違う場合が存在するため、エラーになるので、調停する。
      • 追加のもとになる7zipが作成するアーカイブでは、creation timeが存在しない場合がある。→ 書き出ししないことにする。
      • 読み込み時は、ArchiveTime classの値、書き込み時は pythonのdatetimeになっていた。→双方 ArchiveTime classに統一。
      • 7zip versionをしめす変数がread/writeで型がちがう→統一
    4. トラブルシューティング
      • ヘッダー書き込み時に、PackInfo オブジェクトがassertionエラーになる
      • flush時に、値を代入からappendにすることで、問題解消
      • 逆に既存の機能にデグレード発生

Sprintスケジュール

  • 22日(土)
    • 13:00 - 14:00 公式キックオフ
    • 14:00 - 16:00 メンバー募集とQ&A
    • 16:00 - 18:00 各自作業
  • 23日(日)
    • 11:00 - 13:00 新規参加者集め や 各自作業
    • 13:00 - 17:00 各自作業
    • 17:00 - 18:00 中間フォローアップ
  • 24日(月) - 28日(金)
    • 時間が取れる時に作業
    • 昼休みや夜にチャットやボイスで相談できる
  • 30日(日)
    • 13:00 - 15:00 成果共有とフォローアップ
    • 15:00 公式成果発表

PyCon JP 2020 Sprintの概要

https://pyconjp.blogspot.com/2020/07/pycon-jp-2020-sprint.html

  • 日時 2020/08/22(土)〜2020/08/30(日)
  • 参加費/Fee 無料/Free
  • 参加方法/Registration Connpassからお申し込み
  • 会場/Venue Online(Discord and/or Zoom)

Schedule

日付 時間 ツール 内容
2020/08/22(土) 13:00開始 Zoom/Discord キックオフイベント
2020/08/23(日)〜8/29(土) ー Discord スプリント
2020/08/28(金)〜8/29(土) ー - PyCon JP 2020 カンファレンス
2020/08/30(日) 15:00開始 Zoom/Discord 成果報告会

Date(JST) Time(JST) Tools Content
Aug-22(Sat.), 2020 13:00 Zoom/Discord Kick-off
Aug-23(Sun.)〜Aug-29(Sat.) ー Discord Sprint Week
Aug-28(Fri.)〜Aug-29(Sat.) ー ー PyCon JP 2020 Conference day
Aug-30(Sun.) 15:00 Zoom/Discord Result Presentation

対象とするプロジェクトの概要

py7zr

py7zr は、Pure pythonによる7zipライブラリです。現在、ベータレベルであり、圧縮、解凍、暗号化、復号化に対応しております。
圧縮にあたっては、新規作成にのみ対応していて、ファイル追加やファイル更新の実装は、まだされていません。
解凍にあたっては、マルチスレッドによる高速化に対応しています。

利用可能なアルゴリズムは、Python の標準ライブラリがサポートする LZMA1, LZMA2, Delta, BCJに加え、BZip2, Deflate, COPY, 7zAES(AES256+SHA256)に対応しています。
7-zip のオリジナルがサポートするアルゴリズムのうち、PPMd, BCJ2, Deflate64には対応しません。

オリジナルの7-zipはプラグインに対応しており、Facebookが開発公開している最新の圧縮アルゴリズムのZStandardなどのプラグインが公開されています。
また、p7zipにも、ZStandardなどを実装したfork版が公開されています。

2020.8.9 現在、v0.9.4 および v0.10.0a1 が公開されており、これらには実験的なZStdのコードがふくまれています。

PiCast

PiCastは、WiFiに対応したRaspberry Piを、ワイヤレスモニターアダプターとして動作させるためのアプリケーションです。
開発ステータスは、早期アルファであり、動作しないケースが多々あります。

picast is a simple wifi display receiver written by Python3 on Raspberry Pi. Current status is early alpha.

Project https://github.com/miurahr/picast

py7Zrの開発テーマたち

開発テーマ: Py7zr のZStandard 対応

py7zrにZStandardアルゴリズムのサポートを追加いただきます。

開発環境

  • Compiler

    • gcc または clang
    • gdb
    • 相互運用性を確認し、デバッグするためにC++コンパイラとデバッガが必要です。
  • IDE:

    • PyCharmと CLion+Pythonプラグイン 推奨
    • Testには、ToxとPyTestを使用します。
  • 相互運用性確認

    • https://github.com/szcnick/p7zip
      • Zstandard拡張がふくまれたPortable版7-zip
    • fork版p7zipをCompileし、パスの設定されているところにInstallしてください
    • pytestで7zコマンドが存在する場合、互換性が試験されます。
  • Py7zrの導入でpip install py7zr[zstd]とすることで、必要なライブラリが導入されるように設定されています。

コードのポイント

Compressor/Decomprssorの実装

  • https://github.com/miurahr/py7zr/blob/master/py7zr/compressor.py#L249-L285

  • https://github.com/miurahr/py7zr/blob/master/tests/test_extra_codecs.py#L84-L108

  • https://github.com/miurahr/py7zr/blob/master/tests/test_extra_codecs.py#L198-L210

  • https://github.com/miurahr/py7zr/blob/master/tests/test_archive.py#L758-L781

  • 一見、圧縮は正常動作しているようにみえる

  • 解凍は、内部エラーになる。

  • ZStdCompressor classの問題点

    • 使用しているpython-zstandardのメソッドはワンショット圧縮である。
    • そのため、ワンショット圧縮を各ファイル毎に実施しており、連続圧縮できていないため、圧縮率も速度も期待できない。
    • 7zipの規格やZStandardの規格上は問題ない形式となるが、適切ではない。
  • ZStdDecompressor classの問題点

    • 使用しているpython-zstandardのメソッドはワンショット解凍である。
    • 7zipでは、ペイロード全体で一つのZstdデータとなっているSolid圧縮が既定である。
    • そのため、バッファーサイズ未満のデータの場合は動作しているが、バッファーサイズよりおおきなデータの場合、二度目の呼出しにおいて、状態が不正になる。
    • python-zstandardのドキュメントによると、stream_reader()メソッドを推奨されているが、その引数はファイルハンドルである。
    • py7zrでは、複数の圧縮、暗号化フィルターをスタックするため、引数は Bytesであり、python buffer protocolを採用して実装している。

参考情報

デバッグのヒント

解凍のデバッグでは、PyCharmなどでPython codeにブレークポイントを設定してデバッグ可能である。
圧縮のデバッグでは、生成されるファイルが互換性のある状態になっていることを確認する必要がある。もし、fork版p7zipでエラーになる場合に、p7zipは有益な情報を出力しないので、gdbなどのCPPのデバッガか、CLionなどのCPPのIDEでp7zipにブレークポイントを設定し、どこの処理でエラーと判別しているか、確認する必要がある。

p7zipのポイント

ターゲットとなるソースコード

  • CPP/7zip/Archive/ZStdHandler.cpp
  • CPP/7zip/Compress/ZstdEncoder.cpp
  • CPP/7zip/Compress/ZstdDecoder.cpp
  • CPP/7zip/Archive/7z/7zIn.cpp

Zstandardの圧縮パラメータについては、前者の3つが対象となろう。
エラーについては、7zIn.cppThrowIncorrect()などの例外がどこで送出されるかをブレークポイントをおいて おいかけることになろう。

Multi-volume support for py7zr

7zipには、マルチボリュームサポートがある。現在は、ライブラリ外での対応が必要である。

例: example.7z.001, example.7z.002 があったとき、

filenames = ['example.7z.001', 'example.7z.002']
with open('result.7z', 'ab') as outfile:  # append in binary mode
    for fname in filenames:
        with open(fname, 'rb') as infile:        # open in binary mode also
            outfile.write(infile.read())
with SevenZipFile('result.7z', 'r') as szf:
    szf.extractall()

とする必要があるが、シームレスにあつかればすばらしい。

機能要望チケット: https://github.com/miurahr/py7zr/issues/197

Update/Append support for py7zr

py7zrで未実装のファイル更新や追加の機能を追加するチャレンジ

実装上のポイント

圧縮ファイルの作成は、writeメソッドを一通り実施したあと、最後によびだされるclose()時に実施するように実装されている。

解凍をおこなう'r'モードのときは、コンストラクタ内で、アーカイブのヘッダをよみこみ、圧縮アルゴリズムのパラメータやフィアル一覧を取得している。

更新や追加の場合、解凍と同様、ヘッダーをよみこんで、各種パラメータやファイル一覧をオジェクト内で保持したうえで、write()やwriteall()されたときに、ファイル一覧を更新するなどして、close()時にペイロードに追加するかたちで圧縮して格納するとよい。

7zipのペイロードでは、Folder classで実装されているFolder単位で処理されるように仕様が既定されている。追加の場合は、二つ目以降のFolderを定義し、ペイロードの一つ目のfolderのデータの後ろにかきこむとよい。

PiCast開発テーマ

PiCast 開発テーマの概要

  1. Raspberry Pi 3B+/4 対応

PiCastは、RaPi Zero/W をターゲットに開発されており、それ以外での動作確認ができていません。

  1. ネイティブプレイヤー対応

現在、VLCをもちいて表示させていますが、Raspberry Piのハードウエアアクセラレーションを利用できていません。omxdecoderを使用できるGstPlayer classを完成させることが目標です。

https://github.com/miurahr/picast/blob/master/src/picast/player.py

  1. さまざまなクライアントの対応

Android OSが動作する特定のスマートフォンからの接続のみ可能であり、汎用性や実用性はありません。Windows10からの接続や、最近のGNOMEに搭載されたことでLinuxでの接続ができるようになると、実用性がたかまります。

環境準備

必要ハードウエア

推奨ソフトウエア

  • Raspberry Pi OS
    • SSHを有効化してください。
  • PyCharm Professional
    • リモートデバッグが必要となるため、Pro版のPyCharmを推奨します。
    • Community版では手動でデプロイやpythonデバッガーのアタッチが必要です。
    • Community版やその他のIDE環境やCUIでの開発のアドバイスはできませんので、自己解決をおねがいします。
  • WireShark/tcpdump
    • 通信デバッグのため、パケット解析ツールの利用が推奨となります。

Raspberry PiへPiCastの導入

README参照のこと

https://github.com/miurahr/picast/blob/master/README.rst

リファレンス実装

MiracleCast project https://github.com/albfan/miraclecast
LazyCast project https://github.com/homeworkc/lazycast
Gnome network displays https://gitlab.gnome.org/GNOME/gnome-network-displays
piracast https://github.com/codemonkeyricky/piracast

事前学習

  • WiFi関連

通信規格について、インターネットで公開されている情報を読んで、ご理解ください。
公式な規格は、WiFiの業界団体WiFi Allianceに参加している企業、団体、個人が閲覧可能になっています。

MonitorやHDMIに関連する規格の一部について理解が必要です。

おまけ Raspberry Pi財団の翻訳プロジェクト

Raspberry Pi財団の翻訳ボランティアへの参加

概要説明

https://www.raspberrypi.org/translate/

ステップバイステップ説明

https://projects.raspberrypi.org/en/projects/translating-for-raspberry-pi

registration form

https://www.raspberrypi.org/forms/volunteer-translator-form/

Crowdinアカウント作成

https://crowdin.com/join

SlackとJiraへの招待をまつ

Jiraにログインして、チケットをひらいて、作業をおこなう。

Pythonのプログラミングコンテンツのテストをおこなう。

対象プロジェクトたち

https://projects.raspberrypi.org/ja-JP/projects?software[]=python

以上

成果プレゼン資料の編集リンク https://hackmd.io/@miurahr/B1bgWXT-v/edit

成果プレゼン資料のスライドモード https://hackmd.io/@miurahr/B1bgWXT-v#