GET /api/events/pyconjp2022/submissions/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "count": 56,
    "next": "https://pretalx.com/api/events/pyconjp2022/submissions/?limit=25&offset=25",
    "previous": null,
    "results": [
        {
            "code": "TLNEJQ",
            "speakers": [],
            "title": "Keynote: Mark Shanonn",
            "submission_type": {
                "en": "Keynote",
                "ja-JP": "基調講演"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "基調講演(全体配信)",
            "description": "### プロフィール\r\n\r\nMark has been using Python since 2005, and has been contributing to CPython since 2010.\r\n\r\nAfter a long interlude working on static analysis tools, he has returned to working on speeding up Python over the last couple of years.\r\n\r\nHis academic and commercial work is focused on compilers, virtual machines and static analysis for Python. His PhD was on building virtual machines for dynamic languages. He is the author of various PEPs including 412, 590, 626 and 659.\r\n\r\nMark is currently working as the technical lead of the \"Faster CPython\" team funded by Microsoft.",
            "duration": 60,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "en",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-14T10:30:00+09:00",
                "end": "2022-10-14T11:30:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "K3GJVU",
            "speakers": [
                {
                    "code": "AWYNBT",
                    "name": "Shinichi Nakagawa(@shinyorke)",
                    "biography": "## Profile\r\n\r\n外資系ITコンサル企業のエンジニアなマネージャーで, Google Cloudを中心としたクラウド活用・クラウドネイティブ化をミッションとするプロジェクトのソリューション・アーキテクトとしてマイクロサービス構築・サーバレス活用等の支援をしているPython使い.\r\n\r\n個人としては「欲しい物・好きなものをPythonで作って運用する」個人開発を「野球データサイエンス」「ヘルスケア」の領域でやっています.\r\n\r\nエンジニアとしての得意領域はサーバーサイド・データエンジニアリング・SRE関連で何よりも野球のデータを扱うのが大好きです.\r\n\r\n- https://shinyorke.hatenablog.com/\r\n- https://github.com/Shinichi-Nakagawa\r\n- https://twitter.com/shinyorke",
                    "avatar": "https://pretalx.com/media/avatars/profile_casual_ThLsDNi.png"
                }
            ],
            "title": "Python使いのためのスポーツデータ解析のきほん - PySparkとメジャーリーグデータを添えて",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Tips of development with Python",
                "ja-JP": "Tips of development with Python"
            },
            "state": "confirmed",
            "abstract": "## 概要\r\n\r\nビジネス目的のデータ・アナリティクスおよび機械学習でPythonを使ったアプローチはたくさんあります. \r\n\r\nこれらのノウハウや考え方を活用し, 普段楽しんでいるスポーツデータの解析・可視化を行うことで普段見ているスポーツの違った側面が見えたり, 何よりもPython使いが大量のデータを扱ってエンジニアリングやデータ解析・分析をするという自学自習の場にもつながると思っています.\r\n\r\nこの発表では私が実践している「メジャーリーグのビッグデータ解析をPySparkで行う」という事例を元に, Pythonを使ったスポーツデータ解析およびビッグデータの扱い方の入門的なお話をいたします.",
            "description": "# Python使いのためのスポーツデータ解析のきほん - PySparkとメジャーリーグデータを添えて\r\n\r\nPySparkおよび, Google CloudのSparkマネージドサービス「Dataproc」を用いて, スポーツデータ解析を行うためのノウハウを紹介します.\r\n\r\n年間約30〜40万球, 数百MBのデータが存在するメジャーリーグのトラッキングデータ「Baseball Savant」のデータを用いて,\r\n\r\n- スポーツデータの収集と前処理\r\n- PySparkとDataprocを使ったデータ収集・解析のノウハウ\r\n- PySparkおよびBigQuery等のクラウドサービスを活用したスポーツデータ解析\r\n\r\nこれらの話を私が実践している事例を元に紹介いたします.\r\n\r\n\r\n## Abstract\r\n\r\n- スポーツデータの収集と前処理\r\n    - メジャーリーグのビッグデータ「Baseball Savant」とは?\r\n    - スポーツデータ収集と前処理の基礎知識\r\n- データ収集\r\n    - Pythonでクローラーを実装\r\n    - Cloud Functionsで動かす\r\n- PySparkとDataprocを用いたデータ解析とクラスタリング\r\n    - Google DataprocのPySparkで解析処理を実装・運用 with Serverless\r\n    - PySparkを使うときの注意点\r\n    - 格好が良い可視化\r\n- スポーツデータ解析・分析の実践 - メジャーリーグ編\r\n    - Shohei Ohtani\r\n    - ビッグデータで見つけた「エグい」選手たち\r\n- 結び\r\n\r\n※内容と順番は変更の可能性があります\r\n\r\n## Reference\r\n\r\n私が実際に開発しているプロダクトの事例を元に発表する予定です.\r\n\r\n**[PythonとGoogle Cloudを使って年間70万球の野球データをいい感じに可視化・分析するダッシュボードを作った](https://shinyorke.hatenablog.com/entry/baseball-data-visualization-app) ※発表内容のダイジェストとなります**\r\n\r\n[野球のビッグデータをGCPとPySparkでいい感じに使いやすくしてみた - DataprocとGCFを使った緩いデータ基盤](https://shinyorke.hatenablog.com/entry/dataproc-baseball)\r\n\r\n[Webアプリとデータ基盤をサクッと立ち上げるためのプラクティス - Google Cloudとサーバレスなサービスで良しなにやってみた](https://shinyorke.hatenablog.com/entry/cloud-arch-serverless)\r\n\r\n[Sparkをサーバー管理せずに使う方法 - Dataproc ServerlessでPySparkを動かしてみました](https://shinyorke.hatenablog.com/entry/dataproc-serverless)",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-15T16:00:00+09:00",
                "end": "2022-10-15T16:30:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "QS8ZYM",
            "speakers": [],
            "title": "Opening Day1",
            "submission_type": {
                "en": "30min box",
                "ja-JP": "30min box"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "Day1のオープニングです",
            "description": "",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "en",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-14T10:00:00+09:00",
                "end": "2022-10-14T10:30:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "AUNGB9",
            "speakers": [],
            "title": "Closing Day1",
            "submission_type": {
                "en": "30min box",
                "ja-JP": "30min box"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "Day1のClosingです。",
            "description": "",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-14T18:30:00+09:00",
                "end": "2022-10-14T19:00:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "S3DU8Z",
            "speakers": [],
            "title": "Lunch & PyCon JP Association 公開 MTG",
            "submission_type": {
                "en": "90min box",
                "ja-JP": "90min box"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "Day1のランチとPyCon JP Association 公開MTGの時間。Association公開MTGの時間は11:45~12:45。",
            "description": "",
            "duration": 90,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-14T11:30:00+09:00",
                "end": "2022-10-14T13:00:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "EB87SG",
            "speakers": [],
            "title": "Coffee Break",
            "submission_type": {
                "en": "50min box",
                "ja-JP": "50min box"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "休憩時間。",
            "description": "",
            "duration": 50,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-14T15:30:00+09:00",
                "end": "2022-10-14T16:20:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "V9SGFS",
            "speakers": [],
            "title": "Opening Day2",
            "submission_type": {
                "en": "30min box",
                "ja-JP": "30min box"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "Day2のOpeningです。",
            "description": "",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "en",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-15T10:00:00+09:00",
                "end": "2022-10-15T10:30:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "UD8FLV",
            "speakers": [],
            "title": "Coffee Break",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "休憩時間",
            "description": "",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-15T14:40:00+09:00",
                "end": "2022-10-15T15:10:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "UQP9YT",
            "speakers": [],
            "title": "Closing Day2",
            "submission_type": {
                "en": "50min box",
                "ja-JP": "50min box"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "Day2 のClosingです。Lost and found, 一社振り返り, 座長挨拶。",
            "description": "",
            "duration": 50,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-15T16:50:00+09:00",
                "end": "2022-10-15T17:40:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "NHY3TK",
            "speakers": [],
            "title": "Lunch + session Day2",
            "submission_type": {
                "en": "90min box",
                "ja-JP": "90min box"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "Day2のランチとセッションの時間。Day2はスポンサー企画です。",
            "description": "",
            "duration": 90,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-15T11:30:00+09:00",
                "end": "2022-10-15T13:00:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "RLTBKP",
            "speakers": [],
            "title": "LT",
            "submission_type": {
                "en": "30min box",
                "ja-JP": "30min box"
            },
            "track": null,
            "state": "confirmed",
            "abstract": "Day1のLTです。",
            "description": "",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-14T18:00:00+09:00",
                "end": "2022-10-14T18:30:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "ANQJZ9",
            "speakers": [
                {
                    "code": "YNUGPS",
                    "name": "Phebe Polk",
                    "biography": "Sr. Software Engineer at Guardant Health\r\n\r\nCo-Organizer of Pyninsula\r\n\r\nCo-Organizer of PyBay",
                    "avatar": "https://pretalx.com/media/avatars/avatar_jpeg_GXNYjCo.jpg"
                }
            ],
            "title": "Building Pytest Plugins",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Test for development",
                "ja-JP": "Test for development"
            },
            "state": "confirmed",
            "abstract": "Pytest Plugins are a useful tool for expanding Pytest's core functionality. Building a pytest plugin is not that hard and can encourage developers to better understand how to use your companies internal microservice or tool. Help your developers get the most out of your microservice by building a pytest plugin.",
            "description": "Pytest is an example of excellent modular design.  The modular design of pytest enables plugins for expanded functionality.  Custom plugins that are designed specifically to mock or test the functionality of a companies microservice can ensure reliable api interaction and also teach developers how to use or implement that microservice in a safe testing environment.",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "en",
            "slot": {
                "room": {
                    "en": "pyconjp_2",
                    "ja-JP": "pyconjp_2"
                },
                "start": "2022-10-15T15:10:00+09:00",
                "end": "2022-10-15T15:40:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "RV9ZK9",
            "speakers": [
                {
                    "code": "WACYH8",
                    "name": "Takahiro Hama",
                    "biography": "福岡在住の地方エンジニアです。 \r\nP九州でPythonのコミュニティ活動も行っています。 \r\n・PyConKyushu実行委員会(運営代表)  \r\n・Python Boot Camp Fukuoka2nd(スタッフ)など。",
                    "avatar": null
                }
            ],
            "title": "Playwrightを使って簡単に自動テストしてみる",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Test for development",
                "ja-JP": "Test for development"
            },
            "state": "confirmed",
            "abstract": "PythonのWeb自動テストではSeleniumを使う方法が有名ですが、\r\n作成・メンテナンスするのに、結構手間がかかります。\r\n\r\n他の言語であれば、PupeteerやCypressという選択肢もありますが\r\nできればPythonで実装したいと感じていました。\r\n\r\nPlaywrightは、TypeScriptで作成されたテスト自動化フレームワークで\r\n多言語対応されており、Pythonでも利用できます。\r\n\r\nこのトークでは、Pythonで実装できるいくつかの自動化の方法と比較し、\r\nPlaywrightを使うことでより簡単に実装できることをお話します。",
            "description": "Playwrightは、Microsoft社製のWebテスト・自動化のための\r\nフレームワークです。\r\n言語はTypeScriptですが、多言語対応されているため\r\npython用のライブラリも公開されています。\r\n\r\n私はこれまで、\r\nSelenium IDE\r\nSelenium Webdriver(pythonによる)\r\nRobot Framework + SeleniumLibrary\r\nPylenium.io\r\nと、いくつかの方法を試してきました。\r\n\r\nそれぞれとても良いツール、ライブラリで、\r\n作成することは当然可能なのですが、\r\nもっと簡単に作成できる方法はないかなと感じていたところに\r\nPlaywrightの存在を知りました。\r\n\r\nPlaywrightは直感的に書けるだけでなく、\r\nSelenium IDEのようなレコーディング機能も用意されており\r\nこれまでの方法に比べて圧倒的に簡単に作成することができます。\r\n\r\nこのトークではPythonを使ったテスト自動化について、\r\n私が試してきた方法を例として取り上げて、\r\nそれぞれの特徴と比較しつつ、Playwrightの良さを伝えたいと考えています。\r\n\r\n参考)実装例\r\n① Chromeを起動\r\n② Googleのサイトを表示\r\n③ PyConJP2022を検索\r\n④ 検索結果にPyConJP2022という文字がある要素をリンク\r\n⑤ PyConJP2022のサイトを表示する\r\n\r\n\r\n### Seleniumを使った実装\r\nSeleniumでテストを作った場合は、\r\n以下のようなロジックになります。\r\n\r\n```\r\nfrom selenium import webdriver\r\nfrom webdriver_manager.chrome import ChromeDriverManager\r\nfrom selenium.webdriver.common.by import By\r\nfrom selenium.webdriver.support.ui import WebDriverWait\r\n\r\ndriver = webdriver.Chrome(ChromeDriverManager().install())\r\n\r\ntry:\r\n    wait = WebDriverWait(driver, timeout=10)\r\n    driver.get('https://google.com')\r\n    \r\n    search = driver.find_element(By.NAME, 'q')\r\n    search.send_keys('PyConJP 2022')\r\n    \r\n    btn = driver.find_element(By.NAME, 'btnK')\r\n    btn.submit()\r\n    \r\n    elements = driver.find_elements_by_xpath(\"//a[@href]\")\r\n    for element in elements:\r\n        if element.text.count('PyCon JP 2022') >= 1:\r\n            element.click()\r\n            break\r\n    \r\nfinally:\r\n    driver.quit()\r\n\r\n```\r\n\r\n今回は単純なものなので、それほど難しいコードにはなっていませんが、\r\n複雑なものになると、待ちを入れたり動作させるまでの手間は増えていくと考えています。\r\n\r\n### RobotFramework + Seleniumを使った実装\r\nRobotFrameworkは、Pythonで作成された自動化フレームワークです。\r\nテスト自動化やRPAに使用することができます。\r\nRobotFramework用のテストは独自の記法になりますが、\r\nPythonでメソッドを作成することもできます。\r\n\r\n```\r\n*** Settings ***\r\nDocumentation     Search PyConJP 2022 Site\r\nLibrary           SeleniumLibrary\r\nLibrary           my_library.py\r\n\r\n*** Test Cases ***\r\nPyConJP2022のサイトを検索して開く\r\n    Chromeで https://google.com を開く\r\n    ブラウザで PyCon JP 2022 を検索する\r\n    検索結果から PyCon JP 2022 をクリックする\r\n\r\n    [Teardown]\r\n    ブラウザを閉じる\r\n\r\n\r\n*** Keywords ***\r\nChromeで ${URL} を開く\r\n    ${driver_path} =    my_library.Get Driver\r\n    Create Webdriver  Chrome  chrome  executable_path=${driver_path}\r\n    Go To    ${URL}\r\n\r\n\r\nブラウザで ${KEYWORD} を検索する\r\n    Wait Until Element Is Visible    CSS=[name=q]\r\n    Input Text    CSS=[name=q]    ${KEYWORD}\r\n    Wait Until Element Is Visible    CSS=[name=btnK]\r\n    Click Element    CSS=[name=btnK]\r\n\r\n\r\n検索結果から ${KEYWORD} をクリックする\r\n    @{elements} =     Get WebElements    xpath=//a[@href]\r\n    FOR    ${element}    IN    @{elements}\r\n        ${el_text} =    Get Text    ${element}\r\n        ${el_text} =  Replace Lf    ${el_text}\r\n        ${check_result} =  Check Include Str    ${el_text}    PyCon JP 2022\r\n        Run Keyword If    ${check_result}\r\n        ...    Click Element    ${element}\r\n        Exit For Loop If    ${check_result}\r\n    END\r\nブラウザを閉じる\r\n    Close Browser\r\n```\r\nコード量は、むしろ普通にSeleniumを使うよりも多くなっていますが、\r\nRobotFrameworkを使うことで、可読性の高いテストが作れるところが魅力です。\r\n例のような日本語のテストも作ることができます。\r\nまた標準で実行結果のレポートも作成してくれるところも魅力です。\r\n\r\n### Pylenium.ioを使った実装\r\nPylenium.ioはCypressのように使いやすい構文でSeleniumを使いやすくした\r\nフレームワークになっており\r\n- 簡単にテスト環境をセットアップできる\r\n- Webドライバーの自動インストール - Cypressのように使いやすい構文でSeleniumを利用できる\r\n\r\nを実現したPythonのフレームワークです。\r\n\r\n\r\n```\r\ndef test_pyconjp_google_search(py):\r\n    py.visit('https://google.com')\r\n    py.get('[name=\"q\"]').type('PyConJP 2022')\r\n    py.get('[name=\"btnK\"]').submit()\r\n    elements = py.findx('//a[@href]')\r\n    for element in elements:\r\n        if 'PyCon JP 2022' in element.text():\r\n            element.click()\r\n            break\r\n```\r\n\r\nマイナーなフレームワークですが、seleniumで普通にコーディングするよりも\r\nコード量は、圧倒的に少なく書くことができます。\r\n尚、このフレームワークは基本的にはSeleniumを使いやすくしたものになるので\r\nSeleniumで出来ていたことは基本実施できます。\r\n但しpytest上で動作することが前提なので、自動化への利用には向いていないかと思います。\r\n\r\nGithubのスター数は少ないですが、私は個人的にはとても気に入っています。\r\n\r\n\r\n\r\n### 4.Playwrightを使った実装\r\n\r\n#### (1)Playwright-pythonを使った実装\r\nplaywright-pythonは標準のpython用ライブラリです。\r\nPlaywright InspectorというGUIツールを呼び出すことができます。\r\nこのツールを使うことで、操作をレコードすることができ、\r\n以下のコードであれば、すぐに生成できます\r\n\r\n```\r\nfrom playwright.sync_api import sync_playwright\r\n\r\nwith sync_playwright() as p:\r\n    browser = p.chromium.launch(headless=False)\r\n    page = browser.new_page()\r\n    \r\n    page.goto(\"https://www.google.com/webhp\")\r\n    page.locator(\"[aria-label=\\\"検索\\\"]\").click()\r\n    page.locator(\"[aria-label=\\\"検索\\\"]\").fill(\"PyConJP 2022\")\r\n\r\n    with page.expect_navigation():\r\n        page.locator(\"[aria-label=\\\"検索\\\"]\").press(\"Enter\")\r\n    \r\n    with page.expect_navigation():\r\n        page.locator(\"text=PyCon JP 2022https://pycon.jp >> h3\").click()\r\n```\r\nこれで動作としては同じように動作します。\r\n\r\n尚、これまでの例と同じような書き方をしたい場合は、\r\n以下のように書くことも可能です。\r\n\r\n```\r\nfrom playwright.sync_api import sync_playwright\r\n\r\nwith sync_playwright() as p:\r\n    browser = p.chromium.launch(headless=False)\r\n    page = browser.new_page()\r\n    \r\n    page.goto(\"https://www.google.com/webhp\")\r\n    page.locator(\"[name=q]\").fill(\"PyConJP 2022\")\r\n    with page.expect_navigation():\r\n        page.locator(\"[aria-label=\\\"検索\\\"]\").press(\"Enter\")\r\n\r\n    for element in page.query_selector_all('//a[@href]'):\r\n        if 'PyCon JP 2022' in element.text_content():\r\n            element.click()\r\n            break\r\n```\r\n作成までに掛かる時間が圧倒的に短く、Seleniumよりも高速に動作します。\r\n\r\n\r\n#### (2)RobotFramework-Browserを使った実装\r\nrobotframework用のライブラリとして、playwrightを使ったPlaywight-browserというライブラリがあります。\r\nSeleniumlibraryと書き方は異なりますが、同じように書くことはできそうです。\r\n\r\n```\r\n*** Settings ***\r\nLibrary    Browser\r\nLibrary    my_library.py\r\n\r\n*** Test Cases ***\r\nPyConJP2022のサイトを検索して開く\r\n    Chromeで https://google.com を開く\r\n    ブラウザで PyCon JP 2022 を検索する\r\n    検索結果から PyCon JP 2022 をクリックする\r\n\r\n\r\n*** Keywords ***\r\nChromeで ${URL} を開く\r\n    Open Browser  ${URL}    headless=False\r\n\r\n\r\nブラウザで ${KEYWORD} を検索する\r\n    Fill Text    [name=q]    ${KEYWORD}\r\n    @{btns} =     Get Elements    [name=btnK]\r\n    FOR    ${btn}    IN    @{btns}\r\n        Click  ${btn}\r\n        Exit For Loop\r\n    END\r\n\r\n\r\n検索結果から ${KEYWORD} をクリックする\r\n    @{elements} =     Get Elements    xpath=//a[@href]\r\n    FOR    ${element}    IN    @{elements}\r\n        ${el_text} =    Get Text    ${element}\r\n        ${el_text} =  Replace Lf    ${el_text}\r\n        ${check_result} =  Check Include Str    ${el_text}    ${KEYWORD}\r\n        Run Keyword If    ${check_result}\r\n        ...  Click    ${element}\r\n        Exit For Loop If    ${check_result}\r\n    END\r\n```\r\n今回作成した程度では、速度比較は難しいですが、\r\n実際にはSeleniumlibraryよりも高速により安定的に動作するようです。\r\nrobotframeworkでWEB自動化を行う場合は、今後はこちらが使われることが多くなりそうです。",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_2",
                    "ja-JP": "pyconjp_2"
                },
                "start": "2022-10-14T16:20:00+09:00",
                "end": "2022-10-14T16:50:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "GFM7LS",
            "speakers": [
                {
                    "code": "TF8G77",
                    "name": "安本雅啓",
                    "biography": "- SIerのR&D、アラヤCTO(AIスタートアップ)を経て、アルゴリズムエンジニア@atama plus。現職では、Django、Pythonを使って主にwebアプリの開発を行っています。\r\n- 興味:機械学習、強化学習、DDD",
                    "avatar": "https://pretalx.com/media/avatars/yasumoto_notrimming_SE8S6vM.jpg"
                }
            ],
            "title": "AST(Abstract Syntax Tree)に入門する",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Niche technique",
                "ja-JP": "Niche technique"
            },
            "state": "confirmed",
            "abstract": "AST(Abstract Syntax Tree、抽象構文木)は、Pythonインタープリターがソースコードを解析した結果を木構造で保持したもので、これがさらにbytecodeに変換された後、実行されます。また、CPythonでは、astモジュールを使って、ASTの中身を覗いたり、ASTの中身を書き換えることができるようになっており、この機能は、testingフレームワークやlinterなどのライブラリの中で活用されています。\r\nこのセッションでは、ASTを初めて知る方に向けて、ASTの概要と、astモジュールの活用事例について紹介します。",
            "description": "CPythonでは、コードを解釈して実行する過程で、AST(Abstract Syntax Tree、抽象構文木)を生成します。astモジュールを用いると、生成されたASTにアクセスでき、また書き換えることもできるようになります。\r\n\r\nこのセッションでは、ASTを初めて知る方に向けて、まずASTとは何か?という説明と、astモジュールを使うことでどのようなことが可能になるのかについて、具体的な事例をいくつか紹介します。\r\n\r\n- 自己紹介(1分)\r\n- 本セッションの概要説明(2分)\r\n- Pythonコードはどのようにして実行されるか(5分)\r\n -  読み込まれたソースコードが、CST(Concrete Syntax Tree)→AST(Abstract Syntax Tree)→バイトコードと変換されて実行される過程について説明します。\r\n- ASTの構造(5分)\r\n - ASTを構成するノードの種類について説明します。\r\n - ASTを可視化できるツールを紹介します(instavizなど)\r\n- astモジュールについて(5分)\r\n - ユーティリティ関数であるget_docstringや、NodeVisitor、NodeTransformerクラスとその使い方について紹介します。\r\n- astモジュールの活用事例\r\n - 紹介したastモジュールの関数やクラスを活用するアイデアとその簡単なプロトタイプを紹介します。\r\n - (1) 自作linterを書いてみる(5分)\r\n   - 例:未使用の変数をチェックできるようにする、等\r\n - (2) 自作testingフレームワークを書いてみる(5分)\r\n   - 例:assert実行時にデバッグのための情報を合わせて出力する、等\r\n- まとめ(2分)",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_2",
                    "ja-JP": "pyconjp_2"
                },
                "start": "2022-10-14T17:10:00+09:00",
                "end": "2022-10-14T17:40:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "PAQPX8",
            "speakers": [
                {
                    "code": "URK3BB",
                    "name": "Raihan Seraj",
                    "biography": "Raihan Seraj is a PhD student at McGill University. He is affiliated with Mila- Quebec Artificial Institute.  His research focuses on Reinforcement learning for multi-agent system and designing learning algorithms for human in the loop systems. He completed his Masters in Electrical and Computer Engineering from McGill University. Besides being an avid tech enthusiast, Raihan enjoys trying out different cuisines.",
                    "avatar": "https://pretalx.com/media/avatars/25438868_10215427950957770_8964397023892764267_o_r42xu3D.jpg"
                }
            ],
            "title": "Reinforcement learning for guiding swarm of robots using python",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Machine learning",
                "ja-JP": "Machine learning"
            },
            "state": "confirmed",
            "abstract": "Swarm intelligence is applied in robotics for guiding robots in unstructured environments. Applications where swarm robots are required to maintain a particular formation ranges from fire fighting to underwater exploration. We will see how the swarm robots can learn to acquire a target formation using reinforcement learning algorithm implemented with python using scipy,matplotlib,numpy framework.",
            "description": "Description:\r\n\r\nSwarm intelligence in robotics has been inspired from the interaction of social insects, mammals that occur naturally in the environment. I have been actively involved in research in reinforcement learning for multi-agent systems and I am thrilled to explain how learning can be used to guide swarm of robots using python and how visualization using matplotlib is used to understand the robustness of the learning framework. \r\n\r\n\r\nProgram:\r\n\r\n•\tSelf introduction (1 minute)\r\n\r\n•\tMotivation (1 minute): Reinforcement learning has been widely used for behavior generation in robotics and provides appealing approach for robots to learn new tasks. The probabilistic and distributed control of large scale swarms where the swarms adapt the formation of a static shape is an important aspect that is sought in many applications including extinguishing fire with drones. \r\n\r\n•\tIntroduction to Reinforcement learning (4 minutes)\r\n\r\n            o\tModel Based Reinforcement learning (2 minutes)\r\n\r\n            o\tModel Free Reinforcement learning (2 minutes)\r\n\r\n\r\n•\tDistributed control algorithm for swarm(2 minutes)\r\n\r\n            o\tLagrangian framework (1 minute)\r\n            o\tEulerian framework (1 minute)\r\n\r\n•\tSolution Approach( 11 minutes)\r\n\r\n            o\tComputing Hellinger distance using python  (show the code) (1 minute)\r\n            o\tGenerate the transition matrix using the closed form solution with numpy(1 minute)\r\n            o\tStatic framework without local movements by computing cost function using Hellinger distance (2 minutes)\r\n            o\tOptions framework (2 minutes)\r\n            o\tLocal restriction to agent movements (2 minutes)\r\n            o\tReadjustments of the swarm configuration when the number of agents reduces (3 minutes)\r\n•\tResult Presentation (5 minutes)\r\n\r\n            o\tVisualization and processing of target distribution from image using PIL (2 minutes)\r\n            o\tError plot between the target and the acquired distribution using matplotlib (1 minute)\r\n            o\tReal-time visualization of automatic agent reconfiguration to take the target shape when the number of agents reduces by half (code) (2 minutes)\r\n•\tSummary (2 minutes)",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "en",
            "slot": {
                "room": {
                    "en": "pyconjp_3",
                    "ja-JP": "pyconjp_3"
                },
                "start": "2022-10-15T13:50:00+09:00",
                "end": "2022-10-15T14:20:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "7WEVVE",
            "speakers": [
                {
                    "code": "AXV3SL",
                    "name": "Tabassum Mushtary Meem",
                    "biography": "Tabassum Mushtary Meem is a Masters student at the Department of Construction Engineering at École de technologie supérieure (ÉTS), Montreal, QC, Canada. Her research focus is on efficiency and sustainability in construction process and automation in building information modelling (BIM). \r\nMeem is a strong believer in the ability of sustainable design and research practices combined with critical thinking for strengthening our communities and having a positive effect on the ecological balance of the world.  She is from Bangladesh and is working passionately to encourage women from under developed and developing countries to pursue a career in engineering.",
                    "avatar": "https://pretalx.com/media/avatars/meem_pic_Il4HcPT.jpg"
                }
            ],
            "title": "Data driven approach to analyze the efficacy of LEED certified buildings using python.",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Machine learning",
                "ja-JP": "Machine learning"
            },
            "state": "confirmed",
            "abstract": "Leadership in Energy and Environment Design (LEED) rating system claims to combat the increasing carbon footprint of buildings and certifies the ones with superior energy consumption performance. This talk presents a python led data-driven analysis to determine whether LEED certified buildings have reduced carbon footprint as claimed and test the validity of the LEED rating system.",
            "description": "Description:\r\n\r\nDeveloped by the US Green Building Council (USGBC), LEED is universally the most celebrated rating system. In recent years engineers and project owners are increasingly inclined towards obtaining this coveted LEED certificate because of the alleged “green” and “eco-conscious” connotations that comes with a high LEED score. However, a high LEED score is not enough to convince many engineers and researchers that the building will be as environment-friendly as LEED claims it to be. In this presentation I will outline how machine learning is used using python scikit-learn, beautiful soup, pandas, follium, matplotlib, seaborn packages to check whether LEED score can be a good predictor of a building’s energy efficiency. This analysis will help engineers to make the better choice regarding the carbon footprint reduction of construction industry which holds the utmost importance right now.  \r\n\r\n\r\n\r\nProgram:\r\n\r\no\tSelf introduction (1 minute)\r\n\r\no\tOverview of the session (1 minute)\r\n\r\no\tMotivation (1 minute): A significant number of professionals and academics are not convinced by the efficacy of LEED score or whether it adds any value to construction industry. To test this hypothesis, a systematic analysis of large number of building data  is required.\r\n\r\no\tObjectives (2 minute)\r\n\r\no\tDataset introduction and extraction using python beautiful soup (4 minutes)\r\n\r\no\tData processing (6 minutes)\r\n\r\n      o\tUse pandas to create and filter LEED building dataframe (2 mins)\r\n      o\tAugmentation with LEED score breakdown using custom web scrapper (2mins)\r\n      o\tHandling missing values using pandas (1 min)\r\n      o\tFeature selection and outlier removal using numpy (1 min)\r\n\r\no\tEarly data analysis and visualization (6 mins):\r\n\r\n      o\tMapping location of LEED certified building based on their zip code and geofile using folium, json and web-browser  (2 minute)\r\n      o\tVisualizing and comparing the average points earned by LEED buildings for each LEED scorecard category using matplotlib (1 minute)\r\n      o\tVisualizing the correlation between LEED score and building energy attributes using seaborn.  (3 mins) \r\n\r\no\tAnalyze the impact of LEED score as an attribute to predict energy use intensity (EUI) for LEED building dataset (2 mins) \r\n\r\n      o\tAlgorithm selection (Multilinear Regression, Support Vector Machine, Random Forest, using scikit learn and Artificial Neural Network implemented using Tensorflow) (1 minute)\r\n      o\tResult comparison using mean squared error (MSE), mean absolute error (MAE) and R-squared. Predict LEED score of non-LEED certified buildings (1 minute)\r\n\r\no\tTrain a predictive model to predict EUI when training set is the complete building dataset (LEED + NON-LEED) to analyze the impact of LEED score on the predictive performance (1 minute)\r\n\r\no\tResult discussion and summary (3 minutes) \r\n\r\n      o\tIs LEED score a good predictor for building energy performance (1 minute)\r\n      o\tWhich learning algorithm performs well for the prediction model and why? (1 minute)\r\n      o\tLimitations of open data accuracy and recommendations (1 minute)",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "en",
            "slot": {
                "room": {
                    "en": "pyconjp_3",
                    "ja-JP": "pyconjp_3"
                },
                "start": "2022-10-15T13:00:00+09:00",
                "end": "2022-10-15T13:30:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "3EUVUY",
            "speakers": [
                {
                    "code": "TX88YQ",
                    "name": "Kento Kawasaki",
                    "biography": "人工知能と自然言語処理が専門の研究者。",
                    "avatar": "https://pretalx.com/media/avatars/portrait_gTjUlyr.PNG"
                }
            ],
            "title": "エッジAI開発入門",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Hardware",
                "ja-JP": "Hardware"
            },
            "state": "confirmed",
            "abstract": "Jetson Nanoを用いたエッジAIの構築方法を紹介します。Jetson NanoはGPUを搭載した小型コンピュータです。画像認識や物体検知などAIを用いたリアルタイム処理が可能でコロナ禍の今、その活用の場は増えています。Jetson Nanoの開発に欠かせないJetPack SDKでは、エッジAI開発の助けとなるツールやPythonライブラリが豊富にそろっており、エンジニアも独自のアプリケーションを開発し世の中の課題を解決できるようになってきました。この発表ではエッジAIの構築におけるノウハウやエッジデバイスでアプリケーションを動かす上で経験した課題やその解決策を紹介します。",
            "description": "#### 詳細\r\n近年、感染症の流行や人材不足が社会問題として取り沙汰されていますが、そんな中、製造、農業、ヘルスケアをはじめとする様々な分野でエッジAIによる自動化が進んでいます。皆さんはエッジAIの開発にどのような印象をお持ちでしょうか。ハードウェアを用いることから難しいと感じるかもしれません。しかしながら、Jetson Nanoを使うことで比較的簡単にエッジAIを構築することができます。JetPack SDKでは、開発の助けとなるツールやPythonライブラリ(TensorRT、cuDNNなど)が提供されており、AIやハードウェアに詳しくない方でもチャレンジしやすいです。この発表ではこれからエッジAIの開発をやってみたい方向けに、その構築方法を紹介します。具体的には、私自身が取り組んだDarts Score Detectionというプロジェクトを例にデータの収集方法、AIモデルの学習方法、エッジデバイス上での推論などエッジAIを開発する上で欠かせないノウハウを共有します。\r\n\r\n#### Darts Score Detectionについて\r\nこのアプリケーションは、ダーツボードに刺さった矢を検知して自動的にスコアを計算し表示するというものです。通常の物体検知とは異なり、その物体が何であるかを検知するだけではなくダーツボードと矢の位置関係からスコアを予測することができます。身近なトイプロブレムを題材に扱うので、初心者の方でも理解しやすいと思います。  \r\nGitHub:https://github.com/kawasaki-kento/darts-score-detection\r\n\r\n#### 構成とタイムライン\r\n + 導入(4min)\r\n\t - 自己紹介\r\n\t - 発表のきっかけと目的  \r\n  \r\n + Jetson Nanoとは(5min)\r\n\t - Jetson Nanoのハードウェア的特性やJetPack SDKを紹介\r\n\t - 実際にどんなアプリケーションが作れるのか  \r\n\r\n + エッジAIの構築方法(15min)\r\n\t - Darts Score Detectionの概要\r\n\t - 画像データの収集方法\r\n\t - SSD-MobileNetからの転移学習\r\n\t - 矢の検知とスコアの推定\r\n\t - エッジデバイスでプログラムを動かすときの課題とそれに対する解決策  \r\n\r\n + まとめ(1min)\r\n\t - これからエッジAI開発を始めようとされている方に向けて役立つ情報を共有  \r\n\r\n + 質疑応答(5min)",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_4",
                    "ja-JP": "pyconjp_4"
                },
                "start": "2022-10-14T17:10:00+09:00",
                "end": "2022-10-14T17:40:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "ZX3NRW",
            "speakers": [
                {
                    "code": "VCGM7L",
                    "name": "denzow",
                    "biography": "大学卒業後、データベースエンジニアとして7年間活動。趣味で書いていたPythonのコードやStart Python Club等のイベント活動等がscouty(現 LAPRAS SCOUT)のサービスにヒット。scouty(現 LAPRAS SCOUT)経由のスカウトを受け2017年にscouty(現 LAPRAS)の9人目としてjoin。基本的にはウサギの姿を借りて活動中。",
                    "avatar": "https://pretalx.com/media/avatars/usagi_UgCnr4Q.jpeg"
                }
            ],
            "title": "お前はまだ本当のDjango ASGIを知らない。",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Web programming",
                "ja-JP": "Web programming"
            },
            "state": "confirmed",
            "abstract": "Django は3.0よりASGIをサポートしました。WSGIの後継として登場したASGIですが、実際にこうすれば使える、async/awaitで書きます。といった情報は多く見かけるようになりました。しかし、結局運用的に何が美味しいのか、パフォーマンス的に何が美味しいのか、そもそも実際に美味しいのかといった観点の情報はまだあまり世の中に多くありません。\r\n\r\n今回はDjangoが正式にASGI対応を始める前のDjango 2.x時代からDjango Channelsを利用したASGIウェブアプリケーションを運用してきたLAPRASでの経験を踏まえ、Django標準のASGI対応をお伝えしていきます。",
            "description": "Djnago は3.0よりASGIをサポートしました。WSGIの後継として登場したASGIですが、実際にこうすれば使える、async/awaitで書きます。といった情報は多く見かけるようになりました。しかし、結局運用的に何が美味しいのか、パフォーマンス的に何が美味しいのか、そもそも実際に美味しいのかといった観点の情報はまだあまり世の中に多くありません。\r\n\r\nこのセッションではDjangoのASGI対応について、ASGI自体の知識やDjangoの運用について等の実運用的な観点を中心に生きた情報をまとめていきます。体系だったASGIへの理解よりはTips的な内容が多くなります。\r\n\r\n## 予定稿\r\n\r\n\r\n- 自己紹介(1分)\r\n- 本セッションの概要説明 (1分)\r\n- モチベーション (1分)\r\n- DjangoのASGI対応(7分)\r\n    - WSGI/ASGIの違い\r\n    - ASGIのモチベーション\r\n    - async/await/asyncio\r\n- Django ChannelsとASGIの関係(7分)\r\n    - Django Channelsとは\r\n    - Websocket対応\r\n    - そもそもASGIならWebsocketができるのか?\r\n- パフォーマンスメリット(7分)\r\n    - 書き換えはどれくらい大変か\r\n    − ASGIを動かすためには\r\n        - asgi.pyの追加\r\n        - 対応サーバの移行(daphne/hypercorn/uvicorn)\r\n    - 既存のViewのasync化はパフォーマンスに寄与するのか\r\n- まとめ(2分)\r\n\r\n\r\n## このトークで話さないこと\r\n\r\n- Django自体の基本的な知識\r\n- dockerの基本的な知識\r\n- Websocketのチュートリアル的な内容",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_4",
                    "ja-JP": "pyconjp_4"
                },
                "start": "2022-10-15T13:00:00+09:00",
                "end": "2022-10-15T13:30:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "JDAAHW",
            "speakers": [
                {
                    "code": "LXUDSQ",
                    "name": "清原弘貴",
                    "biography": "kyです。\r\n\r\n僕のことはky(さん)と呼んでください!\r\n\r\nPython大好き、Webサービス大好き、自然言語処理やAIも大好きなエンジニアです。Python、Django歴は10年以上です。\r\n\r\n[株式会社ゼンプロダクツ](https://we.shodo.ink/)というスタートアップの代表取締役です。清原弘貴といいます。 Shodoという、日本語をAIが校正してくれるWebサービスを開発・運営しています。オンライン上でMarkdownの執筆・レビューができるサービスですので、テックブログの運営にもおすすめです。ちなみに、この発表概要や自己紹介もShodoで書きました。\r\n\r\n[DjangoCongress JP](https://djangocongress.jp/)というカンファレンスも毎年主催しています。\r\n\r\n* ブログ:[Make組ブログ](https://blog.hirokiky.org/)\r\n* Twitter:[@hirokiky](https://twitter.com/hirokiky/)\r\n* 著書:[Amazonの著者ページ](https://bit.ly/kybooks)\r\n\r\nぜひフォローしてください!",
                    "avatar": "https://pretalx.com/media/avatars/django_axn0pXw.jpeg"
                }
            ],
            "title": "Pythonに上級テクニックは要らない(そして正しい付き合い方)",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Tips of development with Python",
                "ja-JP": "Tips of development with Python"
            },
            "state": "confirmed",
            "abstract": "Pythonのテクニックは何があるでしょうか? ContextManager、デコレーター、継承、特殊メソッドなど色々な文法や知るべき技術があります。\r\n\r\nですがそれらを普段の開発でどれほど活用すべきでしょうか?\r\n「新しく学んだので使ってみた技術が、後々のメンテナンス性を大きく下げていた」そんなことはよくあります。Pythonの文法や使える技術がそれぞれどういった場面に適しているか、むしろ使うべきでないかをお伝えします。\r\n作りたいものの複雑さや、仕事とライブラリーのコードの違い、関わる人の人数などを念頭に説明します。\r\n\r\nとくにこれから中堅になってくるPythonエンジニアが聴くべき(そして未来の失敗を避けるべき)トークになるでしょう。",
            "description": "トークのレベルとしては初級から中級にステップアップするPythonエンジニア向けとなります。ContextManager、デコレーターなど基本的なテクニックから、特殊メソッドやMixinといった少し複雑なテクニックまでを説明します。それぞれどういった場面で使うべきものであるかを伝えつつ、どういった使い方をすべきでないかを強調するのが本トークの特徴です。\r\n\r\nさらに使う場面に応じたレベルを5段階で明示し、それぞれの文法やテクニックがどこに当てはまるかを説明します。具体的には以下の5つです。\r\n\r\n* ★☆☆☆☆:手元でも使っていくテクニック\r\n* ★★☆☆☆:使う機会があれば手元でも良いが、使いどころを考えたほうが良いテクニック\r\n* ★★★☆☆:プロジェクト内で他の人に使ってもらう部品を作るときのテクニック\r\n* ★★★★☆:仕事で難しい要件がきたときや、ライブラリーなどで他の人が楽できるように使うテクニック\r\n* ★★★★★:基本、使わない。フレームワークなどを作りたいなら使うテクニック\r\n\r\nこのように作りたいものの規模や関わる人の人数、オープンソースのライブラリーなのかどうかといった切り口でレベルを分けます。「初心者であればレベル3以上は先輩の社員と相談することをおすすめ」など具体的に仕事で使える切り分けを提示します。\r\n\r\nトークを準備している現時点では以下のようなレベル分けになる想定です。\r\n\r\n* ★☆☆☆☆:手元でも使っていくテクニック\r\n    * リスト内包表記(短めに使おう)\r\n    * ジェネレーター\r\n    * yield\r\n    * yield from\r\n    * 型ヒント\r\n    * itertools\r\n    * collections\r\n* ★★☆☆☆:使う機会があれば手元でも良いが、使いどころを考えたほうが良いテクニック\r\n    * クラス、dataclass\r\n    * デコレータ(簡易)\r\n    * contextlib(with作るやつ)\r\n    * argparseやclick等のコマンド作成\r\n    * `@property`\r\n    * global、local(基本はやめてほしい)\r\n    * subprocess(基本はやめてほしい)\r\n* ★★★☆☆:プロジェクト内で他の人に使ってもらう部品を作るときのテクニック\r\n    * 基底クラス(継承を前提としたクラス)\r\n    * 少し凝ったクラス\r\n        * `__iter__`、 `__next__`\r\n        * `__enter__`\r\n        * `__call__`\r\n    * エラークラスの定義\r\n    * デコレータ(引数ありや例外処理を含む)\r\n    * パッケージング\r\n* ★★★★☆:仕事で難しい要件がきたときや、ライブラリーなどで他の人が楽できるように使うテクニック\r\n    * Mixinクラス\r\n    * attr.s\r\n    * `@my_propaty.setter`\r\n    * import_module(動的インポート)\r\n    * `__add__`、`__sub__`、`__len__` 拡張\r\n    * 他言語拡張\r\n* ★★★★★:基本、使わない。フレームワークなどを作りたいなら使うテクニック\r\n    * メタクラス\r\n    * `abc`\r\n    * `__getattr__` 拡張\r\n    * `slice()`\r\n\r\nトークのボリュームに応じて説明できる範囲は変わります。\r\n\r\n中級エンジニアにステップアップする際に失敗しがちな『やりすぎ』を防ぎ、どの技術をどこまで安全に使えるかを説明します。スキルは使うことで磨かれていきます。ですがいきなり仕事に持ち込みすぎると大失敗の原因となります。そうでなく、よくある失敗やチームで相談すべき点を知っておくことで、安心して次のPythonのレベルに成長できるようにします。",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-14T14:40:00+09:00",
                "end": "2022-10-14T15:10:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "NPMTSH",
            "speakers": [
                {
                    "code": "KQWEL7",
                    "name": "まりーな",
                    "biography": "Developer\r\nData visualization",
                    "avatar": null
                }
            ],
            "title": "業務改善の面白さ ~毎日更新されるビジュアルコンテンツの差分をわかりやすくするためのプロトタイプを作るまで~",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Test for development",
                "ja-JP": "Test for development"
            },
            "state": "confirmed",
            "abstract": "## 課題の背景\r\n日本経済新聞社では、日々報道機関としてニュースを配信している。その中でも定期的にデータを更新する「チャートで見る日本の接種状況 コロナワクチン」コンテンツがある。このコンテンツは 特に人の健康や生命に関わる大事な情報であるため、データの間違いや表示の間違いは許されない。\r\n\r\n## 課題\r\n記者チームが公開されるデータに責任を持っている。\r\n記者側がスプレッドシート上でデータを確認していたとしても、実際にWebページ上で正しく更新されているかは、いちいちページにアクセスして見ないと確認できない状態だった。\r\n\r\n## 解決手段\r\nそこで、ビジュアルリグレッションテストのように、何が画面に変更があればその差分をわかりやすく並べ表示することで、それが意図された変更なのかが誰でも判別することができる状態を目指せるのではないかと考えプロタイプを作ってみた。",
            "description": "## 技術的な要件\r\n### 前提\r\n表示されるデータは記者が責任を持つ。記者が管理しやすいスプレッドシートにデータが集まっている。\r\nこのコンテンツは、スプレッドシートのデータをコンテンツに表示している\r\n\r\n### 要件\r\n聞き取りをして考えた要件は下記となった\r\n- 記者チーム側がデータを更新するときに、前の状態と今の状態とその差分が表示されると良い\r\n- 記者チームやディレクターやエンジニアやデザイナー職種問わず、誰もがその差分を確認することができる\r\n- 連絡手段にSlackを利用しているので、その結果をSlackにまとめられるとよい\r\n\r\n## 検討したこと\r\n*reg-suitを利用して、CIに乗せてシステムを起動する*\r\n\r\nreg-suitを用いた流れとしては、下記のようにできればと考えた\r\n- GitHubにpushすると、CircleCI上でPuppeteerを動かし、スクリーンショットを撮影し指定したフォルダに収める。\r\n- そのフォルダをreg-suitで指定すると、reg-suit側で指定したS3に、静的サイトとしてアップロードされる。 \r\n- それが完了すると、GitHubのコメントに通知が飛ぶ。\r\n\r\nPuppeteerで、スクリーンショットを撮影するコードは自分で書く必要はあるが、まさしく、これが欲しかった!がまとまったツールだ。しかし、このように便利なreg-suitですが、このプロジェクトでは利用できなかった。\r\n\r\nこのページは、前項でも記述したとおり、2つのチームの成果物から成り立つ。 一つはGitHubで管理しているリソース、もう一つは記者チームがチェックしているスプレッドシートのデータである。\r\n\r\nreg-suitでは、GitHubで管理しているリソースの範囲内であれば、スクリーンショットを取得して差分を比較することはできるが、本番環境に反映されるデータ自体は反映されていない。 本当に差分を比較したいのは、本番環境で表示されているものと、過去表示されたものである。\r\nまた、レポートの通知自体もGitHubのアカウントを持っていないと確認できず記者チームにとっては負担になる。差分をさっと見たいのにクリック数が多いなどの要件に対する不備もあった。よって、reg-suitでは実現できないという判断をした。 こうなると残された手段は、自作するしかなかった。\r\n\r\n## 差分を検出して、Slackに投下するしくみ\r\n\r\n### 利用したツール\r\n- CircleCI\r\n- Python3\r\n- スクリーンショット撮影:selenium :webdriver-manager\r\n- S3にアップロード :Boto3 :python-dotenv\r\n- 画像加工: opencv-python: NumPy\r\n- Slack通知: Python Slack SDK\r\n\r\n\r\n\r\n### 実行方法を決める\r\n記者チームが、データの更新を行った後にすぐに差分を撮影して、自動で投稿するのがベストではあるが、時間がかかりそうだった。今回は、早めにプロトタイプを作って便利か検証したかったので、データの整形が終わり本番反映される時間帯の後である毎日17時頃に、CirlceCIで定期実行するように設定した。\r\n\r\n### 比較画像を用意する\r\nCircleCI上でブラウザをheadlessモード(バックグラウンドで動くモード)で立ち上げてページを表示し、スクリーンショットを取る。 次に、S3にアップロードしてある、前回変更時に撮影した画像をダウンロードしておく。\r\n\r\n### 画像の高さを揃えて、比較や加工しやすくする\r\n改修作業がはいると大幅にページの高さが変わる可能性がある。そのページの高さの変更に備えて、現在のページのスクショと過去のページのスクショの高さを揃えるようにOpenCVで足りない高さ分白画像を追加する。\r\n\r\n### 画像の差分を検出するための準備をする\r\nOpenCVで画像の差分を比較し、差分マスクを作成する。\r\n差分マスクだけだと、何もわからないので、画像を暗くしてマスクと重ね差分が明確になるように合成した。\r\n\r\n### 画像の差分を検出し、差分があれば作成したスクリーンショットをS3にアップロードする\r\n作成したマスク画像から、白色ピクセル数を算出し、白色の部分が全体のどれくらいの割合を占めているのかを計算する。計算式は 白色ピクセル数/画面ピクセル数 とした。今回はなにか少しでも変化があれば変更だとみなしたため、 白色ピクセル数/画面ピクセル数>0 であれば変更として検知した。\r\n\r\n変更を検知しなかった場合は、ここで処理を終了します。 変更を検知した場合は、S3に今回撮影した画像をアップロードし、次回の検出で用いるようにした。\r\n\r\n###  Slack投稿用に画像を合成する\r\n変更を検知した場合、Slack投稿用に変化後、変化前、差分の3種類の画像を並べて合成する。ここでまとめた理由はSlackで画像をクリックしたときに、一画面でまとめて見ることができるようにするためである。\r\n\r\n### Slackに投稿する\r\n最後に、files.uploadAPIでSlackに画像とともに通知します。 Slackには下記のように、投稿する事ができた。\r\nこの画像をクリックすると、左側から「変更後」「変更前」「差分」を一覧で見ることができるようになった。 Slackからワンクリックで、差分の変更を見られるようになり、reg-suitよりも少ない手数で目的を達成することができた。\r\n\r\n### 導入後の声\r\n記者の方からのコメントとしては、「便利な仕組みをありがとうございます」という声をいただいた。\r\nディレクターやデザイナーからのコメントとしては「明らかにおかしい箇所がないか簡単に判別できるのはありがたいです。\r\n特にデザイナーの視点からだと、データの桁数によってレイアウトが変わる要素があるので、意図していないレイアウトになっていないかが一目で分かるのが良いです」だった。\r\n\r\n## 伝えたいこと\r\n記者、デザイナー、エンジニアと3つの職種が協力しながらコンテンツを作成している環境にいて得た知見は、「何に困っているのか、どうなったら便利なのかを聞いても、それぞれの職域の範囲内しか返答ができない場合がある」ことだ。\r\n誰かの課題を解決して、価値が生まれる。特にエンジニアは技術を使って困りごとを解決できる職種である。\r\nエンジニアが活躍できる改善の種は、身近にあるのではないだろうか?\r\nまずは隣の人の話を聞いてみたり話してみることろからスタートするとよいのではないだろうか。",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_5",
                    "ja-JP": "pyconjp_5"
                },
                "start": "2022-10-14T13:00:00+09:00",
                "end": "2022-10-14T13:30:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "PDTWEW",
            "speakers": [
                {
                    "code": "RZYTWR",
                    "name": "Joongi Kim",
                    "biography": "Joongi is the creator of Backend.AI and the CTO of Lablup, where he oversees the development of MLOps pipelines and GPU-accelerated AI services. He earned his Ph.D. in Computer Science from KAIST by creating a GPU-accelerated packet processing framework with world-leading speed of 80 Gbps. His major areas of interest include scalable and automated backend systems, as well as their analysis and design. He's also a big fan of open source, having contributed to projects like Python, iPuTTY, Textcube, aiodocker, aiohttp, pyzmq, DPDK, and others.",
                    "avatar": null
                }
            ],
            "title": "Modernizing development workflow for a 7-year old 74K LoC Python project using Pantsbuild",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Tips of development with Python",
                "ja-JP": "Tips of development with Python"
            },
            "state": "confirmed",
            "abstract": "Mono-repository or not? That is a boggling question for many medium-to-large-sized development teams. As a growing company, we had to onboard new hires quickly while coping with flooding customer requests and increasing codebase complexity. We have merged 7 repositories into a single one and migrated to the Pantsbuild system, a Python-friendly modern build system. Here is our story!",
            "description": "* Discussions about mono-repository vs. multi-repository\r\n    - Both has its own pros and cons. First let’s review existing discussions about the choices.\r\n    - How to define the criteria to merge a repository?\r\n* Problems with the prior art in my team\r\n    - Making a single release takes several hours.\r\n    - We had to create multiple PRs to different repositories for a single conceptual feature or bugfix. Both code authors and reviewers had difficulties on context switching.\r\n    - We had to establish custom practices like synchronizing branch names between different repositories for CI.\r\n    - Linking multiple PRs with a single issue on GitHub did not work as we expected.\r\n    - We often forgot to switch branches in multiple repository clones of related components while working on a single issue.\r\n    - The development-setup script became too complex.\r\n* A short intro about Pantsbuild\r\n    - [http://pantsbuild.org/](http://pantsbuild.org/)\r\n    - Why did we choose this? (compared to Bazel, etc.)\r\n    - Let’s share a first glance on basic usage\r\n* Migration process with Pantsbuild\r\n    - About the new mono-repo directory structure and importing per-package repository\r\n* Customization for our codebase\r\n    - I wrote a few custom Pants plugins for `setup.py` generation, towncrier tooling, and a dependency injector for platform-specific prebuilt binaries.\r\n    - I wrote a custom package entrypoint scanner as no package metadata is available in Pants-based execution environments.\r\n* Experience after migration\r\n    - Now making a release takes less than 10 minutes.\r\n    - The on-site engineering team has confidence with version compatibility of all components as they now share a single unified version number.\r\n    - A single issue now has a single unified PR, making GitHub Projects more useful.\r\n    - Writing and reviewing a PR across multiple components is now a breeze. We can see all relevant changes including documentation at a single place.\r\n* Recap\r\n    - It was a long and difficult journey, which took more than one month.\r\n    - But it was worth, and I hope that my experience and customization could help others going for the mono-repo migration with complex Python projects.\r\n    - Great community support was a tremendous help during the whole migration process.",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "en",
            "slot": {
                "room": {
                    "en": "pyconjp_2",
                    "ja-JP": "pyconjp_2"
                },
                "start": "2022-10-15T13:50:00+09:00",
                "end": "2022-10-15T14:20:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "JKLGKZ",
            "speakers": [
                {
                    "code": "H7GVN7",
                    "name": "Takayuki Kawazoe",
                    "biography": "- Pythonエンジニア",
                    "avatar": "https://pretalx.com/media/avatars/2021-07-profile_bFZOaMK.JPG"
                }
            ],
            "title": "Fast API と学ぶ WebRTC",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Tips of development with Python",
                "ja-JP": "Tips of development with Python"
            },
            "state": "confirmed",
            "abstract": "近年、様々な分野で使われるようになったWebRTCを使ってのクライアント・サーバ間のリアルタイム通信。\r\nこの技術はこれからのリアルタイム通信を利用したサービスに置いては必須の技術になりつつあります。\r\nこのトークでは、そんなWebRTCについて、FastAPIを利用してWebRTCサーバを簡易実装して、WebRTCの中身について実装とともに解説します。",
            "description": "近年、様々な分野で使われるようになったWebRTCを使ってのクライアント・サーバ間のリアルタイム通信。\r\nこの技術はこれからのリアルタイム通信を利用したサービスに置いては必須の技術になりつつあります。\r\nこのトークでは、そんなWebRTCについて、FastAPIを利用してWebRTCサーバを簡易実装して、WebRTCの中身について実装とともに解説します。\r\n\r\n構成・タイムライン\r\n\r\n- ~ 3min: 導入、自己紹介 (3min)\r\n- ~ 8min WebRTCの説明 (5min)\r\n    - WebRTCとは\r\n    - WebRTCの通信の流れ\r\n- ~ 23min: FastAPI上でのWebRTCサーバ実装の説明 (15min)\r\n    - 実装した内容の説明\r\n    - フロントからとの接続テスト\r\n    - パケットの流れとサーバ側でのログ\r\n- ~ 28min: Tips、注意点 (5min)\r\n- ~ 30min: まとめ (2min)",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-14T16:20:00+09:00",
                "end": "2022-10-14T16:50:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "J9XNYA",
            "speakers": [
                {
                    "code": "8BH3GJ",
                    "name": "阿部涼平",
                    "biography": "エンジニア2年目です。株式会社MIERUNEでバックエンドエンジニアをやっています。",
                    "avatar": null
                }
            ],
            "title": "GeoDjango ORMと地理空間データの世界",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Niche technique",
                "ja-JP": "Niche technique"
            },
            "state": "confirmed",
            "abstract": "Webフレームワークとして世界中で使われているDjangoですが、そのDjangoには標準でGeoDjangoというモジュールが含まれており、サーバーサイドで地理空間データを扱う際に広く利用されています([公式ドキュメント](https://docs.djangoproject.com/en/4.0/ref/contrib/gis/))。GeoDjangoには特有のORMが用意されており、実際にSQLを書くことなく地理空間データの処理(空間演算)を行うことができます。しかし、現在GeoDjangoのORMに関するまとまった情報は少なく、GeoDjangoを利用していてもそれらの機能を生かしきれてないパターンもあるかと思います。そこで本セッションでは、GeoDjangoが持つ便利なORMの紹介、および実装プロセスを簡易な地図アプリケーションでのデータ可視化を交えつつお伝えします。",
            "description": "GeoDjangoは、Djangoの地理空間用モジュールで、[Django公式ドキュメントのトップページ](https://docs.djangoproject.com/ja/4.0/#geographic-framework)には以下のように紹介されています。\r\n\r\n`GeoDjango は世界規模の地理情報 Web フレームワークを目指しています。 GeoDjango の目的は、地理情報システム (GIS) のWeb アプリケーションの開発をより簡単にし、空間データ (spatially enabled data) を活用することにあります。`\r\n\r\n\r\nこの一文が示すとおり、GIS的な処理をサーバーサイドで行う際、OSSの中では第一にGeoDjangoという選択肢が上がるといっても過言ではありません。また、[django-rest-framework-gis](https://github.com/openwisp/django-rest-framework-gis)というライブラリ(DjangoのREST API用ライブラリ[Django REST framework](https://www.django-rest-framework.org/)の拡張)を導入することで、簡単にAPIサーバーとして地理空間データの処理・配信を行うことが可能になります。GeoDjangoおよびこれらの拡張ライブラリは、GISの界隈で広く使われているスタックとなっています。\r\n\r\nそんなGeoDjangoですが、地理空間データを扱う上で便利な機能が多く実装されており、中でもデータ処理に関しては、GeoDjango特有のORMを利用することで、開発者はGeoDjangoを介して安全で手軽に空間演算を行うことができます。\r\n\r\n本セッションでは、GeoDjangoの持つORMに焦点を当てつつ、GeoDjangoの紹介からORMを用いたデータ処理、ならびにAPI配信についてをお話しします。Djangoは知っているけどGeoDjangoは触ったことのない方、触ったことはあるけれどGeoDjango ORMに馴染みのない方、単純にGISに興味のある方にとって、GeoDjangoおよびそれらの持つORMの素晴らしさをお伝えできるようなセッションにしたいと考えています。\r\n\r\n\r\n### 予定稿\r\n\r\n- 自己紹介 (1分)\r\n- 本セッションの概要説明 (1分)\r\n- GISについて(2分)\r\n    - 概要(1分)\r\n    - 身近で使われているGISの技術(1分)\r\n- Django / GeoDjangoの概要説明(2分)\r\n- Postgres / PostGISの概要説明(1分)\r\n- GeoDjangoのセットアップ(3分)\r\n    - 環境構築(1分)\r\n    - インストール(1分)\r\n    - セットアップ(1分)\r\n- データの説明(3分)\r\n    - ラスタデータ(1分)\r\n    - ベクタデータ(1分)\r\n    - 使用するデータの説明(1分)\r\n- 空間参照系の説明(1分)\r\n- データ取り込み(2分)\r\n- ORMの紹介、実行(6分)\r\n    - GeoDjangoの持つlookups(3分)\r\n    - データベース関数(3分)\r\n- REST APIの導入(3分)\r\n    - django-rest-framework-gisの説明(1分)\r\n    - セットアップ(1分)\r\n    - API操作(1分)\r\n- フロントエンドアプリケーション紹介(1分)\r\n- フロントエンドとのREST API通信デモ(2分)\r\n- まとめ(2分)\r\n\r\n### このトークで話さないこと\r\n\r\n- 一般的なDjangoおよびDjango REST frameworkの機能\r\n- GeoDjangoのデータ関連以外の機能詳細\r\n- django-rest-framework-gisの機能詳細\r\n- GISの歴史、詳細\r\n- フロントエンド実装",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-14T17:10:00+09:00",
                "end": "2022-10-14T17:40:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "HFEB37",
            "speakers": [],
            "title": "基調講演: 西内 啓氏",
            "submission_type": {
                "en": "Keynote",
                "ja-JP": "基調講演"
            },
            "track": {
                "en": "Others",
                "ja-JP": "Others"
            },
            "state": "confirmed",
            "abstract": "基調講演(全体配信)",
            "description": "## Profile\r\n\r\n東京大学大学院医学系研究科医療コミュニケーション学分野助教、大学病院医療情報ネットワーク研究センター副センター長、ダナファーバー/ハーバードがん研究センター客員研究員を経て、2014年11月より株式会社データビークルを創業。\r\n\r\n自身のノウハウを活かした拡張アナリティクスツール「dataDiver」などの開発・販売と、官民のデータ活用プロジェクト支援に従事。著書に累計50万部を突破した『統計学が最強の学問である』シリーズのほか、『統計学が日本を救う』(中央公論新社)など。\r\n\r\n2020年より内閣府EBPM(Evidence Based Plicy Making: 科学的根拠に基づく政策立案政策立案)アドバイザリーボードメンバーも務める。",
            "duration": 60,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": true,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_1",
                    "ja-JP": "pyconjp_1"
                },
                "start": "2022-10-15T10:30:00+09:00",
                "end": "2022-10-15T11:30:00+09:00"
            },
            "image": null,
            "resources": []
        },
        {
            "code": "QRYKXS",
            "speakers": [
                {
                    "code": "HXULET",
                    "name": "Toshifumi Tsutsumi",
                    "biography": "データエンジニア。SIer や製造業を経て、2020年にGMOペパボ株式会社へ入社。技術部 データ基盤チームに所属。\r\n\r\nTwitter: [tosh2230](https://twitter.com/tosh2230)  \r\nGitHub: [tosh2230](https://github.com/tosh2230)",
                    "avatar": null
                }
            ],
            "title": "SQL クエリ解析による E2E データリネージの実現",
            "submission_type": {
                "en": "Talk",
                "ja-JP": "Talk"
            },
            "track": {
                "en": "Visualization / Games / Music",
                "ja-JP": "Visualization / Games / Music"
            },
            "state": "confirmed",
            "abstract": "統計解析や機械学習によるデータ需要の高まりによって、データの加工・利用のプロセスは複雑化する傾向にあります。近年、そうした複雑さに対抗する手段として、データの生成や利用の流れを把握する「データリネージ (Data Lineage)」が注目されています。\r\n\r\nこのデータリネージを手軽にはじめられるように、Python 製 OSS [Stairlight](https://github.com/tosh2230/stairlight) を開発しました。SQL クエリ解析によって、データの生成から利用者によるデータ取得へ至る全体像を把握する “End-to-End(E2E) Data Lineage” の実現を目指しています。\r\n\r\nこのトークでは、データリネージの概要や問題意識を共有した後、Stairlight のアプローチと、導入によって期待される効果をご紹介します。",
            "description": "### プロポーザルの詳細\r\n\r\n最初に、テーマである「データリネージ」の一般的な定義や、背景にあるデータエンジニアリングで発生しうる問題を共有します。そのうえで、データリネージ手法の分類を試みます。\r\n\r\n一般に、データリネージの対象となるデータ群は複数の場所に別れて保存されており、それぞれの管理者やアクセスレベルは異なっています。そのため、データリネージのしくみを導入するにあたっては、ネットワークやセキュリティ、データガバナンスなどの調整が求められます。また、Web アプリケーションとして提供されることが多いため、サーバーの管理と運用も必要になります。\r\n\r\nこれらのハードルをなくし、データリネージをはじめやすくすることを目標に、Python 製の OSS である [Stairlight](https://github.com/tosh2230/stairlight) を開発しました。SQL の SELECT 文を解析し、グラフノードとエッジに分解することでその依存関係を明らかにします。そうしたコンセプトや機能、運用イメージをご紹介します。\r\n\r\nまた、その中で Stairlight をなぜ Python で実装したのか、各機能について Python を用いてどのように実装しているのかも合わせてお話しします。最後に、他のソフトウェアやサービスと組み合わせることで期待される効果について、ユースケースとともに解説します。\r\n\r\n### 想定するオーディエンス\r\n\r\n- データリネージという単語を初めて聞いた、という方\r\n- 長大な SELECT 文を読み込むのがつらくなってきた方\r\n- データリネージをやりたいが、大変そう… という方\r\n\r\n### ゴール\r\n\r\n- データリネージの概要や登場した背景を知ってもらう\r\n- データリネージを試してみようかな、と思ってもらう\r\n- グラフデータ構造を扱う Python 実装に興味をもってもらう\r\n\r\n### 構成とタイムライン (計 30 min)\r\n\r\n#### データリネージの概要 (7 min)\r\n\r\n- データリネージとは\r\n- データリネージが解決したい課題\r\n- データリネージ手法の分類\r\n\r\n#### 導入のハードルを下げるために (3 min)\r\n\r\n- プロトコルを SQL の SELECT 文に統一\r\n- 目的を「リネージ情報の抽出と統合」に絞る\r\n- 抽出工程をできるかぎり簡単にする\r\n\r\n#### Python 製 OSS: Stairlight (10 min)\r\n\r\n- コンセプト\r\n- なぜ Python を選んだのか?\r\n- データソース サポート対象\r\n- リネージ情報の構造\r\n- リネージ情報の抽出と統合\r\n- その他機能と Python 実装の紹介\r\n\r\n#### 他のソフトウェアと組み合わせる (7 min)\r\n\r\n- Git\r\n- Shell\r\n- CI サービス\r\n- Streamlit\r\n\r\n#### まとめ (3 min)",
            "duration": 30,
            "slot_count": 1,
            "do_not_record": false,
            "is_featured": false,
            "content_locale": "ja-JP",
            "slot": {
                "room": {
                    "en": "pyconjp_5",
                    "ja-JP": "pyconjp_5"
                },
                "start": "2022-10-15T15:10:00+09:00",
                "end": "2022-10-15T15:40:00+09:00"
            },
            "image": null,
            "resources": []
        }
    ]
}