# PyConJP20 Sprint成果
オープンストリートマップジャパン 三浦広志
<!-- Put the link to this slide here so people can follow -->
slide: https://hackmd.io/@miurahr/B1bgWXT-v
---
## テーマの状況
リーダー1名でスプリント実施でした
---
### 選択したテーマ
- Py7zrは、圧縮、伸張、暗号化、復号化ができていますが、圧縮されたアーカイブファイルへの**追記モードは未実装**でした。これに挑戦しました。
---
### 課題と解決の方向(1/2)
- 従来圧縮するときは、write()では、メタ情報と、元ファイルを記録して、close()時に圧縮する方式でした。
- **write()時に随時圧縮する**ように変更しました。
---
### 課題と解決の方向(2/2)
- 解凍のようにヘッダーを読み込んだあとに、ファイル情報と圧縮データを追記します。
- **「解凍と同様にヘッダーを読み込んだ」** 状態が、**「write()を実施している途中」** と同じ状態になるようにするのがポイントです。
---
### py7zrの内部構造を確認する
---
#### py7zrのパッケージ構造
```graphviz
digraph "packages" {
charset="utf-8"
rankdir=BT
"0" [label="py7zr", shape="box"];
"1" [label="py7zr.__main__", shape="box"];
"2" [label="py7zr.archiveinfo", shape="box"];
"3" [label="py7zr.callbacks", shape="box"];
"4" [label="py7zr.cli", shape="box"];
"5" [label="py7zr.compressor", shape="box"];
"6" [label="py7zr.exceptions", shape="box"];
"7" [label="py7zr.helpers", shape="box"];
"8" [label="py7zr.properties", shape="box"];
"9" [label="py7zr.py7zr", shape="box"];
"10" [label="py7zr.win32compat", shape="box"];
"0" -> "6" [arrowhead="open", arrowtail="none"];
"0" -> "8" [arrowhead="open", arrowtail="none"];
"0" -> "9" [arrowhead="open", arrowtail="none"];
"2" -> "5" [arrowhead="open", arrowtail="none"];
"2" -> "6" [arrowhead="open", arrowtail="none"];
"2" -> "7" [arrowhead="open", arrowtail="none"];
"2" -> "8" [arrowhead="open", arrowtail="none"];
"4" -> "3" [arrowhead="open", arrowtail="none"];
"4" -> "5" [arrowhead="open", arrowtail="none"];
"4" -> "7" [arrowhead="open", arrowtail="none"];
"4" -> "8" [arrowhead="open", arrowtail="none"];
"4" -> "9" [arrowhead="open", arrowtail="none"];
"5" -> "6" [arrowhead="open", arrowtail="none"];
"5" -> "7" [arrowhead="open", arrowtail="none"];
"5" -> "8" [arrowhead="open", arrowtail="none"];
"9" -> "2" [arrowhead="open", arrowtail="none"];
"9" -> "3" [arrowhead="open", arrowtail="none"];
"9" -> "5" [arrowhead="open", arrowtail="none"];
"9" -> "6" [arrowhead="open", arrowtail="none"];
"9" -> "7" [arrowhead="open", arrowtail="none"];
"9" -> "8" [arrowhead="open", arrowtail="none"];
}
```
---
#### 7zip Headerを表現するクラスたち
[](https://py7zr.readthedocs.io/en/latest/_images/graphviz-4e317b362c07c931b481ecb1f69049904f51f5c2.png)
---
### リファクタンリング
- :bulb: PyCharmで、リファクタリングをおこなった。
- 処理の塊を分解、移動させて、圧縮処理のタイミングを変更。
- 途中状態ごとにCIテストをおこなって安心して変更を大胆に適用。
---
### CI tests
250case - win/mac/linux - py3.6,3.7.3.8,pypy3

---
### coverage

---
### 遭遇した問題
- いままで、圧縮と解凍の処理フローがまじることがなかった。
- 同じ変数で、圧縮と解凍のメソッドで、単位や型がちがう事象に。
- intとbytes、UNIX時間(int)とPython datetime(float)など
---
### 成果
- :tada: 圧縮について、write()中におこなわれるようになった。
- :tada: 追記(mode='a')について、一通りの処理を実装完了。
- CI test デグレード発生
---
### 今後
- デグレード解消
- :muscle: テストケースを追加して、実装の品質向上をはかる
---
### まとめ
- 新バージョン v0.10.0a3 (alpha) がリリース:tada: されました。
- 今後、追加機能を搭載して v0.10.0 をリリース :tada: 予定です。
---
### その他 期間中のできごと
- OpenStreetMapのカンファレンス(11月7日開催)準備も並行してました。
- 募集を開始しました。
- 翻訳ツール(OmegaT/Java)修正も並行して結構たいへんでした。
---
### Thank you! :sheep:
OpenStreetMap イベント 11/7 https://stateofthemap.jp/2020/
- GitHub [miurahr](https://github.com/miurahr/py7zr)
---
{"metaMigratedAt":"2023-06-15T11:32:10.325Z","metaMigratedFrom":"YAML","title":"PyConJP 2020 sprint result","breaks":true,"description":"View the slide with \"Slide Mode\".","contributors":"[{\"id\":\"a39fef58-9b07-42cd-973a-4a7e5bdc85cf\",\"add\":5667,\"del\":2148}]"}