# 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](https://pyconjp.connpass.com/event/183507/)からお申し込み
* 会場/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のコードがふくまれています。
* Project https://github.com/miurhr/py7zr
* Document https://py7zr.readthedocs.io/en/latest/index.html
* Internal description https://py7zr.readthedocs.io/en/latest/contribution.html
* 7zipフォーマットspecificaiton [7zip archive format specification](https://py7zr.readthedocs.io/en/latest/archive_format.html)
* 7-zip originalはWindows上のPublic Domain http://7-zip.org/
* Portable 7-Zip(p7zip) は、POSIX環境への移植
## PiCast
[PiCast](https://github.com/miurahr/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を採用して実装している。
### 参考情報
* [Python-zstandard ライブラリドキュメント](https://python-zstandard.readthedocs.io/en/latest/)
* 参考: 各種compressorを、io.BufferedReaderないしは、io.BufferedWriterに変換する実験コードである。生成された結果は確認されていない。
https://gist.github.com/miurahr/b12b8a9f88365e113bf532ccb870fe60
#### デバッグのヒント
解凍のデバッグでは、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.cpp`の`ThrowIncorrect()`などの例外がどこで送出されるかをブレークポイントをおいて おいかけることになろう。
## 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()時に実施するように実装されている。
* https://github.com/miurahr/py7zr/blob/master/py7zr/py7zr.py#L504-L513
解凍をおこなう'r'モードのときは、コンストラクタ内で、アーカイブのヘッダをよみこみ、圧縮アルゴリズムのパラメータやフィアル一覧を取得している。
* https://github.com/miurahr/py7zr/blob/master/py7zr/py7zr.py#L364-L455
更新や追加の場合、解凍と同様、ヘッダーをよみこんで、各種パラメータやファイル一覧をオジェクト内で保持したうえで、write()やwriteall()されたときに、ファイル一覧を更新するなどして、close()時にペイロードに追加するかたちで圧縮して格納するとよい。
7zipのペイロードでは、Folder classで実装されているFolder単位で処理されるように仕様が既定されている。追加の場合は、二つ目以降のFolderを定義し、ペイロードの一つ目のfolderのデータの後ろにかきこむとよい。
* Folderの定義 https://py7zr.readthedocs.io/en/latest/archive_format.html#folders
* 7zipアーカイブの全体構成 (Signature header + payload + headerのつづき) https://py7zr.readthedocs.io/en/latest/archive_format.html#file-format
* Folder Class https://github.com/miurahr/py7zr/blob/master/py7zr/archiveinfo.py#L276
* Create時のFolder object生成 https://github.com/miurahr/py7zr/blob/master/py7zr/py7zr.py#L326-L336
# PiCast開発テーマ
## PiCast 開発テーマの概要
1. Raspberry Pi 3B+/4 対応
PiCastは、RaPi Zero/W をターゲットに開発されており、それ以外での動作確認ができていません。
2. ネイティブプレイヤー対応
現在、VLCをもちいて表示させていますが、Raspberry Piのハードウエアアクセラレーションを利用できていません。omxdecoderを使用できるGstPlayer classを完成させることが目標です。
https://github.com/miurahr/picast/blob/master/src/picast/player.py
3. さまざまなクライアントの対応
Android OSが動作する特定のスマートフォンからの接続のみ可能であり、汎用性や実用性はありません。Windows10からの接続や、最近のGNOMEに搭載されたことでLinuxでの接続ができるようになると、実用性がたかまります。
### 環境準備
#### 必要ハードウエア
* つぎのいずれかのWifi対応 Raspberry Pi
* Zero/W
* 3B+
* 4
* Raspberry Piに対応したFullHD以上のモニター
* Raspberry Piに対応したHDMIケーブル
* ワイヤレスディスプレー(MiraCast)に対応するクライアントPC/スマートフォン
* Windows 10が動作するPC
* Android スマートフォン、タブレット
* 注意:Apple製品はmiracastに対応しません。
* リファレンスとして、Microsoft社製の Wireless Display アダプタや、
シャープなどのTVセットのうち、Miracastに対応しているものを利用するといいでしょう。
* https://www.amazon.co.jp/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88-%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC-V2%E3%80%90Wi-Fi%E4%B8%8D%E8%A6%81%E3%80%91%E3%83%9F%E3%83%A9%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC-%E6%90%AD%E8%BC%89%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E5%AF%BE%E5%BF%9C-P3Q-00009/dp/B01BG9NG5E
* https://www.amazon.co.jp/%E3%82%A8%E3%83%AC%E3%82%B3%E3%83%A0-Miracast%E3%83%AC%E3%82%B7%E3%83%BC%E3%83%90%E3%83%BC-Windows10%E3%82%B9%E3%83%9E%E3%83%9B%E5%AF%BE%E5%BF%9C-Continuum%E6%A9%9F%E8%83%BD%E6%90%AD%E8%BC%89-LDT-MRC02/dp/B01M9FXX26
* https://jp.sharp/support/aquos/doc/aquos_connect.html
#### 推奨ソフトウエア
* 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に参加している企業、団体、個人が閲覧可能になっています。
* WiFi関連規格の入手
WifiアライアンスのTERMに合意のうえ、氏名連絡先をフォームに入力することで、ダウンロード可能
* WiFi Display 規格(Miracast)
* https://ja.wikipedia.org/wiki/Miracast
* https://en.wikipedia.org/wiki/Miracast
* https://www.wi-fi.org/discover-wi-fi/miracast
* [Download 規格書PDF](https://www.wi-fi.org/downloads-registered-guest/Wi-Fi_Display_Technical_Specification_v2.1_0.pdf/34726)
* WiFi Dirct(P2P)規格
* https://en.wikipedia.org/wiki/Wi-Fi_Direct
* https://www.wi-fi.org/discover-wi-fi/wi-fi-direct
* [Download 規格書PDF](https://www.wi-fi.org/downloads-registered-guest/Wi-Fi%2BP2P%2BTechnical%2BSpecification%2Bv1.7.pdf/29559)
* HDMI関連技術
MonitorやHDMIに関連する規格の一部について理解が必要です。
* 画面サイズやリフレッシュレートの規格
* https://ja.wikipedia.org/wiki/HDMI
* https://github.com/miurahr/picast/blob/master/src/picast/resolutions.json
* https://raspberrypi.stackexchange.com/questions/7332/what-is-the-difference-between-cea-and-dmt
* https://github.com/raspberrypi/documentation/blob/master/configuration/config-txt/video.md#hdmi_mode
* Raspberry Pi tvservice command
* https://elinux.org/RPi_Configuration
* OMX Decoder
* [OpenMAX](https://en.wikipedia.org/wiki/OpenMAX)
* [Gstreamer OpenMAX](https://github.com/GStreamer/gst-omx)
* http://raspbian.raspberrypi.org/raspbian/pool/main/g/gst-omx/
*
# おまけ 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#