Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
業務改善の面白さ~毎日更新されるビジュアルコンテンツの差分を わかりやすくするためのプロトタイ...
Search
Marina Nakagawa
October 13, 2022
Technology
4
6.7k
業務改善の面白さ~毎日更新されるビジュアルコンテンツの差分を わかりやすくするためのプロトタイプを作るまで~
PyCon JP
2022 2022/10/14
業務改善の面白さ
毎日更新されるビジュアルコンテンツの差分を
わかりやすくするためのプロトタイプを作るまで
Marina Nakagawa
October 13, 2022
Tweet
Share
More Decks by Marina Nakagawa
See All by Marina Nakagawa
「リーダーは意思決定する人」って本当?~ 学びを現場で活かす、リーダー4ヶ月目の試行錯誤 ~
marina1017
0
250
通知にプレースホルダーを入れてみたら開封率がちょっと良くなった話
marina1017
1
1.9k
アプリ流入用広告のデータ分析基盤を整える ~FirebaseとiAd.frameworkの連携~
marina1017
2
3.6k
ABテストが上手く行かなかった話
marina1017
1
610
「開発初心者は何がわからないのか」 わからないを言語化するヒント
marina1017
2
960
Appleのアニメーションはなぜ美しいか考える
marina1017
1
2.2k
Appleのアニメーション.pdf
marina1017
0
54
gitの裏側をさぐる
marina1017
0
480
Lottieによるリッチアニメーション実装のためのAfterEffectsハマりどころ
marina1017
3
11k
Other Decks in Technology
See All in Technology
KotlinConf 2025_イベントレポート
sony
1
140
「全員プロダクトマネージャー」を実現する、Cursorによる仕様検討の自動運転
applism118
22
12k
Snowflake Intelligenceにはこうやって立ち向かう!クラシルが考えるAI Readyなデータ基盤と活用のためのDataOps
gappy50
0
280
株式会社ログラス - 会社説明資料【エンジニア】/ Loglass Engineer
loglass2019
4
65k
Wantedlyの開発組織における生成AIの浸透プロジェクトについて
kotominaga
2
100
DroidKaigi 2025 Androidエンジニアとしてのキャリア
mhidaka
2
390
エンジニアリングマネージャーの成長の道筋とキャリア / Developers Summit 2025 KANSAI
daiksy
3
1.2k
20250912_RPALT_データを集める→とっ散らかる問題_Obsidian紹介
ratsbane666
0
100
初めてAWSを使うときのセキュリティ覚書〜初心者支部編〜
cmusudakeisuke
1
280
Terraformで構築する セルフサービス型データプラットフォーム / terraform-self-service-data-platform
pei0804
1
200
AIがコード書きすぎ問題にはAIで立ち向かえ
jyoshise
1
460
Oracle Cloud Infrastructure IaaS 新機能アップデート 2025/06 - 2025/08
oracle4engineer
PRO
0
110
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
54
11k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Unsuck your backbone
ammeep
671
58k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
Practical Orchestrator
shlominoach
190
11k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
RailsConf 2023
tenderlove
30
1.2k
How to Ace a Technical Interview
jacobian
279
23k
Making Projects Easy
brettharned
117
6.4k
A Modern Web Designer's Workflow
chriscoyier
696
190k
Writing Fast Ruby
sferik
628
62k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Transcript
1 ۀվળͷ໘ന͞ ຖߋ৽͞ΕΔϏδϡΞϧίϯςϯπͷࠩΛ Θ͔Γ͘͢͢ΔͨΊͷϓϩτλΠϓΛ࡞Δ·Ͱ ຊܦࡁ৽ฉࣾɹத ສᣦಸ PyCon JP 2022 2022/10/14
2 Marina Nakagawa ຊܦࡁ৽ฉࣾͷΤϯδχΞ ܦϏδϡΞϧσʔλͷίϯςϯπ੍࡞ ΠϯϑϥपΓͷվળͳͲͳͲ ࣗಈԽ͕͖Ͱ͢ʂ
3 ຊ͢͜ͱ ఆظతʹߋ৽͞ΕΔίϯςϯπͷ՝ ܦϏδϡΞϧσʔλͱ 1 2 3 ࠩݕͷϓϩτλΠϓΛ࡞Δ ݁Ռͱ·ͱΊ 4
4 ܦϏδϡΞϧσʔλͱ 1
5
6 จষ ਤઆ σʔλ Πϥετ ࣸਅ ͋ΒΏΔදݱΛۦͯ͠ etc… χϡʔεΛΘ͔Γ͑͘͢Δ
7 https://vdata.nikkei.com/newsgraphics/sanin2022-analysis/
8 https://vdata.nikkei.com/newsgraphics/party-poll-votes-map/
9 https://vdata.nikkei.com/newsgraphics/coronavirus-world-map/
10 https://vdata.nikkei.com/newsgraphics/clear-accounting/clear-accounting/
11 https://vdata.nikkei.com/
12 ɾײతʹΘ͔Γ͘͢ɺ࣌ؒͰಡΊΔίϯςϯπ ɾैདྷͷใಓදݱΛਐԽͤ͞ΔࢼΈ ɾϢʔβʔʹͱཱͬͯͭίϯςϯπ ɾଉͷ͍ίϯςϯπ ɾطଘͷํ๏Ҏ֎ͷίϯςϯπͷྲྀ௨ํ๏ͱϊϋ ͦΕΒΛ࡞Δ͕ ܦϏδϡΞϧσʔλ
13 هऀ ͑Δ͖͜ͱ σβΠφʔ ͑ํ ΤϯδχΞ ͑ΔͨΊͷΈ
14 هऀ ͑Δ͖͜ͱ σβΠφʔ ͑ํ ΤϯδχΞ ͑ΔͨΊͷΈ
15 هऀ هࣄίϯςϯπͷ༰ɾσʔλ σβΠφʔ ίϯςϯπͷઃܭɾσβΠϯ ΤϯδχΞ ৴ͷΈ Ϣʔβʔ͔ΒͷΠϯλϥΫγϣϯΛؚΉ࡞Γ
16 هऀ σβΠφʔ ΤϯδχΞ
17 ఆظతʹߋ৽͞ΕΔίϯςϯπͷ՝ 2
18 ఆظతʹߋ৽͞ΕΔίϯςϯπͷ جຊతͳ੍࡞ͷྲྀΕ
None
هऀνʔϜ εϓϨουγʔτͰ ຖσʔλूܭˍνΣοΫ هऀνʔϜͷऀ͕ެ։Λஅ $*Λ༻͍ͨσϓϩΠϑϩʔͱ ҟͳΔϑϩʔͰຊ൪ʹө
هऀνʔϜ εϓϨουγʔτͰ ຖσʔλूܭˍνΣοΫ هऀνʔϜͷ ऀ͕ެ։Λஅ هऀ͕Λ࣋ͭσʔλ جຊతʹຖߋ৽͞ΕΔ
σβΠφʔɾΤϯδχΞνʔϜ վम͕͋Δ߹ (JU)VCͰϦιʔεཧ $*ͰϦϦʔε
σβΠφʔɾΤϯδχΞνʔϜ վम͕͋Δ߹ (JU)VCͰϦιʔεཧ $*ͰϦϦʔε ࣌ظʹΑͬͯݟͤΔσʔλ ݟͤํΛมߋ͢Δͱ͖ʹߋ৽
هऀνʔϜ σβΠφʔɾΤϯδχΞνʔϜ εϓϨουγʔτͰ ຖσʔλूܭˍνΣοΫ վम͕͋Δ߹ (JU)VCͰϦιʔεཧ $*ͰϦϦʔε هऀνʔϜͷσʔλͱ σβΠφʔɾΤϯδχΞνʔϜͷՌ͕ ߹Θ͞Δͷຊ൪ڥ
˞ͪΖΜ։ൃڥଘࡏ͢Δ
None
26
ࠓͷάϥϑ ߋ৽͞Ε͍ͯΔʁ هࣄίϯςϯπͷ ࣈਖ਼͘͠ දࣔ͞Ε͍ͯΔʁ άϧʔϓԽ͞Εͨ ԣάϥϑେৎʁ େ෯վमͨ͠ͱ͜Ζ ͖ͪΜͱදࣔ͞Ε͍ͯΔʁ
ߋ৽͞Ε͍ͯΔʁ
ࠓͷάϥϑ ߋ৽͞Ε͍ͯΔʁ هࣄίϯςϯπͷ ࣈਖ਼͘͠ දࣔ͞Ε͍ͯΔʁ άϧʔϓԽ͞Εͨ ԣάϥϑେৎʁ େ෯վमͨ͠ͱ͜Ζ ͖ͪΜͱදࣔ͞Ε͍ͯΔʁ ຖߋ৽͞ΕΔ
σʔλܥ ߋ৽͞Ε͍ͯΔʁ
ࠓͷάϥϑ ߋ৽͞Ε͍ͯΔʁ هࣄίϯςϯπͷ ࣈਖ਼͘͠ දࣔ͞Ε͍ͯΔʁ άϧʔϓԽ͞Εͨ ԣάϥϑେৎʁ େ෯վमͨ͠ͱ͜Ζ ͖ͪΜͱදࣔ͞Ε͍ͯΔʁ վम࣌ʹ
ߋ৽͞ΕΔܥ
ࠓͷάϥϑ ߋ৽͞Ε͍ͯΔʁ هࣄίϯςϯπͷ ࣈਖ਼͘͠ දࣔ͞Ε͍ͯΔʁ άϧʔϓԽ͞Εͨ ԣάϥϑେৎʁ େ෯վमͨ͠ͱ͜Ζ ͖ͪΜͱදࣔ͞Ε͍ͯΔʁ ֬ೝ͢ΔϙΠϯτ͕ଟ͍
& ݟΔϙΠϯτ͕ҟͳΔ ใಓػؔͱͯ͠σʔλͷνΣοΫݫ͘͢͠Δඞཁ͕͋Δ͕ɾɾɾ
31
32
33 diff!!!! (͜ΕσΟϨΫλʔ͕ਏ͍)
34 diffؒҧ͍୳͠
35 diffؒҧ͍୳͠
36 ࠷ऴతͳஅίϯϐϡʔλͰͳ͘ਓ͕ؒߦ͏͕ ͤΊͯ ֬ೝ͢ΔՕॴ͕໌֬ʹͳΕ͍͍ͷʹɾɾɾɾ
37 ͦ͏ͩʂ ϏδϡΞϧϦάϨογϣϯςετΛԠ༻ͯ͠ ͏·͍͜ͱΈԽͰ͖ͳ͍ͩΖ͏͔ʁʁʁ
38 ࠩݕͷϓϩτλΠϓΛ࡞Δ 3
39 Try1 ϏδϡΞϧϦάϨογϣϯςετπʔϧreg-suit ͰͬͯΈΑ͏
40 https://github.com/reg-viz/reg-suitΑΓҾ༻
NBTUFSϒϥϯν NBTUFS͔Β ͬͨ࣌ͷϖʔδ QVTIͯ͠ ߋ৽͞Εͨϖʔδ ൺֱͯࠩ͠Λग़͢
(JU)VCʹQVTI͢Δ $*্Ͱ ϖʔδͷεΫϦʔϯγϣοτΛ࡞ SFHTVJUͰ εΫϦʔϯγϣοτೖͬͨσΟϨΫτϦΛࢦఆ 4ʹੜͨ͠ϖʔδΛ্͛Δ (JU)VCͷίϝϯτʹ ௨͕ඈͿ
(JU)VCʹQVTI͢Δ $*্Ͱ ϖʔδͷεΫϦʔϯγϣοτΛ࡞ SFHTVJUͰ εΫϦʔϯγϣοτೖͬͨσΟϨΫτϦΛࢦఆ 4ʹੜͨ͠ϖʔδΛ্͛Δ (JU)VCͷίϝϯτʹ ௨͕ඈͿ ؤுͬͯίʔυΛॻ͘ͷ ͚ͩ͜͜ʂ
(JU)VCʹQVTI͢Δ $*্Ͱ ϖʔδͷεΫϦʔϯγϣοτΛ࡞ SFHTVJUͰ εΫϦʔϯγϣοτೖͬͨσΟϨΫτϦΛࢦఆ 4ʹੜͨ͠ϖʔδΛ্͛Δ (JU)VCͷίϝϯτʹ ௨͕ඈͿ ͜ΕҎ߱ SFHTVJU͕ࣗಈͰͬͯ͘Ε·͢
13্ʹϦάϨογϣϯςετͷ ݁ՌΛදࣔ͢Δػೳ EJ ff ͷϨϙʔτ ࣗಈੜͰ͖Δ
ઃఆͨ͠4ʹ Ϩϙʔτ͕ੜ͞ΕΔ ҰཡͱͳͬͯΘ͔Γ͍͢
ࠩͷݟͤํ ύλʔϯ༻ҙ͞Ε͍ͯΔ
48 ͏·͍͔͘ͳ͔ͬͨϙΠϯτ1 ͜ͷίϯςϯπͰreg-suitΛ͑ͳ͍ࣄ͕͋ͬͨ
(JU)VCͰཧ͍ͯ͠ͳ͍ͷ දࣔ͢Δσʔλࣗମ εϓϨουγʔτͰཧ (JU)VCͰཧ͍ͯ͠Δͷ )5.-$44ը૾ͳͲͷϦιʔε
هऀνʔϜ σβΠφʔɾΤϯδχΞνʔϜ εϓϨουγʔτͰ ຖσʔλूܭˍνΣοΫ վम͕͋Δ߹ (JU)VCͰϦιʔεཧ $JSDMF$*ͰϦϦʔε هऀνʔϜͷσʔλͱ σβΠφʔɾΤϯδχΞνʔϜͷՌ͕ ߹Θ͞Δͷຊ൪ڥ
˞ͪΖΜ։ൃڥଘࡏ͢Δ هऀνʔϜͷ ऀ͕ެ։Λஅ
هऀνʔϜ σβΠφʔɾΤϯδχΞνʔϜ εϓϨουγʔτͰ ຖσʔλूܭˍνΣοΫ վम͕͋Δ߹ (JU)VCͰϦιʔεཧ $JSDMF$*ͰϦϦʔε ຖͷσʔλूܭͨ݁͠Ռ͕ (JU)VCͰཧ͞Ε͍ͯͳ͍
هऀνʔϜ σβΠφʔɾΤϯδχΞνʔϜ εϓϨουγʔτͰ ຖσʔλूܭˍνΣοΫ վम͕͋Δ߹ (JU)VCͰϦιʔεཧ $JSDMF$*ͰϦϦʔε ຊ൪ڥͷϖʔδͰ ࠓݱࡏදࣔ͞Ε͍ͯΔͷͱ աڈදࣔ͞Ε͍ͯͨͷΛൺֱ͍ͨ͠
53 ͏·͍͔͘ͳ͔ͬͨϙΠϯτ2 ຊʹͬͯΒ͑Δ͔࣮༻ੑͷݒ೦ - GitHubʹ͔͠௨͕͜ͳ͍ɻ - هऀʹGitHubΞΧϯτ͕ඞཁ - ࠩΛݟΔ·Ͱͷ4ΫϦοΫͷนΛӽ͑Δ -
Slack νϟϯωϧ,GitHubͷPR,reg-suit,reg-suitͷத
54 ͏·͍͔͘ͳ͔ͬͨϙΠϯτ2 ຊʹͬͯΒ͑Δ͔࣮༻ੑͷݒ೦ - GitHubʹ͔͠௨͕͜ͳ͍ɻ - هऀʹGitHubΞΧϯτ͕ඞཁ - ࠩΛݟΔ·Ͱͷ4ΫϦοΫͷนΛӽ͑Δ -
Slack νϟϯωϧ,GitHubͷPR,reg-suit,reg-suitͷத ຊʹճΫϦοΫͯ͘͠ΕΔʁʁʁ Θ͟Θ͟ݟΔͷΊΜͲ͘͘͞ͳ͍ʁʁʁ
55 ͜͏ͳͬͨΒ͍͍ͳͱໝͯͨ͜͠ͱ Nikkei ———— ———— ———— ———— ௨νϟϯωϧ ௨bot 1Click
ͲΜͳ৬छͰ ͚ͩ͜͜ݟ͓͚͍͍ͯʂ ͱ͍͏ঢ়ଶΛ࡞Γ͍ͨ ———— ———— ————
56 ͜͏ͳͬͨΒ͍͍ͳͱໝͯͨ͜͠ͱ Nikkei ———— ———— ———— ———— ௨νϟϯωϧ ௨bot 1Click
ͲΜͳ৬छͰ ͚ͩ͜͜ݟ͓͚͍͍ͯʂ ঢ়ଶΛ࡞Γ͍ͨ ֬ೝ͢Δ͖Օॴ͕໌֬ʹʂ ࠷ऴతͳਓؒͷஅͷิॿʹͳΔʂ(ͣ)
57 ཁ݅Λߟ͑Δ ɾهऀνʔϜଆ͕σʔλΛߋ৽͢Δͱ͖ʹɺࣗಈͰલͷঢ়ଶͱࠓͷঢ়ଶͱͦͷ͕ࠩදࣔ͢Δ ɾ৬छΘͣɺ୭͕ͦͷࠩΛ֬ೝ͢Δ͜ͱ͕Ͱ͖Δঢ়ଶʹ͢Δ ɾ࿈བྷखஈʹSlackΛར༻͍ͯ͠ΔͷͰɺͦͷ݁Ռ͕Slackʹ·ͱΊΒΕΔͱΑ͍
58 αΫοͱϓϩτλΠϓΛ ࡞ͬͯΈΔ SFHTVJUͰֶΜͩ͜ͱΛ׆͔ͯ͠
59 ࠩΛݕग़ͯ͠ɺSlackʹԼ͢Δ͘͠ΈΛߟ͑ͨ 1.ར༻͢ΔπʔϧϥΠϒϥϦྨΛબఆ͢Δ 2.࣮ߦํ๏ΛܾΊΔ 3.ൺֱը૾Λ༻ҙ͢Δ 4.ը૾ͷߴ͞Λἧ͑ͯɺൺֱՃ͘͢͢͠Δ 5.ը૾ͷࠩΛݕग़͢ΔͨΊͷ४උΛ͢Δ 6.ը૾ͷࠩΛݕग़͢Δ 7.͕ࠩ͋Ε࡞ͨ͠εΫϦʔϯγϣοτΛS3ʹΞοϓϩʔυ͢Δ 8.Slackߘ༻ʹը૾Λ߹͢Δ
9.Slackʹߘ͢Δ
60 1.ར༻͢ΔπʔϧϥΠϒϥϦྨΛબఆ͢Δ ը૾ͰࠩΛݕग़͢ΔͳΒ →OpenCV͕͑ͯ Webը૾ΛεΫγϣ͢ΔͳΒˠWebࣗಈԽπʔϧͰεΫγϣΛͱΖ͏ աڈը૾Λอଘ͢ΔͳΒˠS3͕ྑͦ͞͏ ·͋ɺϓϩτλΠϓͩͬ͠͞ͱPythonͰࢼͦ͏ʂ Ұ୴Google ColaboratoryͰϛχϛχϓϩτλΠϓΛ࡞ͬͯΈΔ →ΠέΔʂΛ֬৴
61 2.࣮ߦํ๏ΛܾΊΔ Google Colaboratory Ͱܾ·ͬͨ࣌ؒʹىಈͰ͖ͨΒ͍͍ͷʹ ࠓͷܖͩͱͰ͖ͳ͔ͬͨͷͰ GitHubͱ࿈ܞ͍ͯ͠ΔCircleCIͰɺ σʔλܗͱө͕ऴΘΔޕޙ̑࣌ʹ࣮ߦ͢Δ͜ͱʹ ※Pro+ͩͱεέδϡʔϧػೳ͕͋Γ·͢ (https://github.com/googlecolab/colabtools/wiki/Scheduled-notebooks)
$JSDMF$*Ͱ ϖʔδͷεΫγϣΛੜ 4͔Βલճߋ৽࣌ʹࡱӨͨ͠ εΫγϣΛμϯϩʔυ 62 3.ൺֱը૾Λ༻ҙ͢Δ
$JSDMF$*Ͱ ϖʔδͷεΫγϣΛੜ 4͔Βલճߋ৽࣌ʹࡱӨͨ͠ εΫγϣΛμϯϩʔυ 63 3.ൺֱը૾Λ༻ҙ͢Δ
64 SCREENSHOT_WIDTH_SIZE = 800 SCREENSHOT_HIGHT_SIZE = 12000 TARGET_URL = "https://vdata.nikkei.com/newsgraphics/coronavirus-japan-vaccine-
status/" WAIT_TIME = 10 # ΣϒυϥΠόʔͱΦϓγϣϯͷઃఆ options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--incognito') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) driver.get(TARGET_URL) driver.set_window_size(SCREENSHOT_WIDTH_SIZE, SCREENSHOT_HIGHT_SIZE) time.sleep(WAIT_TIME) driver.save_screenshot("test-reports/current_page_screenshot.png") ※ίʔυҰ෦ൈਮ
$JSDMF$*Ͱ ϖʔδͷεΫγϣΛੜ 4͔Βલճߋ৽࣌ʹࡱӨͨ͠ εΫγϣΛμϯϩʔυ 65 3.ൺֱը૾Λ༻ҙ͢Δ
66 # S3ʹΞοϓϩʔυ import boto3 # S3ͷϑΝΠϧμϯϩʔυɺΞοϓϩʔυͷઃఆ client = boto3.client(
's3', aws_access_key_id= {AWS ΞΫηεΩʔID}, aws_secret_access_key= {AWS γʔΫϨοτΩʔ}, ) client.download_file( '{S3໊}', '{S3ͷύε໊}/screenshot.png', 'test-reports/past_page_screenshot.png' ) ※ίʔυҰ෦ൈਮ
Γͳ͍͞0QFO$7Ͱ ന৭෦ΛՃͯ͠ௐ 4.ը૾ͷߴ͞Λἧ͑ͯɺൺֱՃ͘͢͢͠Δ
68 #=============================================== #ɹಉ͡αΠζʹͳΔΑ͏ʹԼʹۭനΛೖΕͯϦαΠζ #=============================================== color = (255, 255, 255) if
img_current.shape[0] <= img_past.shape[0]: bottom = img_past.shape[0] - img_current.shape[0] img_current = cv2.copyMakeBorder(img_current, 0,bottom, 0, 0, cv2.BORDER_CONSTANT, value=color, ) else: bottom = img_current.shape[0] - img_past.shape[0] img_past = cv2.copyMakeBorder(img_past, 0, bottom, 0, 0, cv2.BORDER_CONSTANT, value=color, ) ※ίʔυҰ෦ൈਮ
มߋલͱมߋޙΛൺֱͯ͠ ࠩϚεΫΛ࡞͢Δ 5.ը૾ͷࠩΛݕग़͢ΔͨΊͷ४උΛ͢Δ
70 #=============================================== # ը૾ͷࠩΛ࡞Δ #=============================================== fgbg = cv2.bgsegm.createBackgroundSubtractorMOG(history=2) #ϚεΫͷܭࢉ fgmask
= fgbg.apply(img_current) fgmask = fgbg.apply(img_past) cv2.imwrite('test-reports/mask.png', fgmask) ※ίʔυҰ෦ൈਮ
6.ը૾ͷࠩΛΘ͔Γ͘͢͢Δ ϚεΫ͚ͩͩͱ͕ࠩΘ͔Βͳ͍ͷͰ ը૾Λ҉ͯ͘͠ॏͶΔ
72 #=============================================== # ը૾Λ҉ͯࠩ͘͠ϚεΫΛॏͶɺ # ࠩͷݕग़ͷ݁Ռ͕͔ΔΑ͏ʹग़ྗ͢Δ #=============================================== # ݱࡏͷεΫγϣΛগ͠҉͘͢Δ img_result
= img_current // 4 # ϚεΫͰࠩͷ͋Δͱ͜Ζ͚ͩΛࡌͤΔ img_result[fgmask==255] = (0, 255, 0) cv2.imwrite('test-reports/result.png', img_result) ※ίʔυҰ෦ൈਮ
8.Slackߘ༻ʹը૾Λ߹͢Δ 4MBDLͰ௨ͨ͠ͱ͖ʹΘ͔Γ͍͢Α͏ʹ มߋલɺมߋޙɺࠩͷ̏ͭΛ͠߹Θͤ Ұͭͷը૾ʹ͢Δ
8.Slackߘ༻ʹը૾Λ߹͢Δ ͜͏ͳΔͱɺ Կ͕Ͳ͏มΘ͍ͬͯΔͷ͔Θ͔Βͳ͍
75 #============================= # ը૾ͷ߹(Slackߘ༻) #============================= percentage_to_resize = 0.5 img_summary =
cv2.hconcat([img_current, img_past, img_result]) img_summary = cv2.resize( img_summary , (int(img_summary.shape[1] * percentage_to_resize), int(img_summary.shape[0] * percentage_to_resize)) ) cv2.imwrite('test-reports/summary.png', img_summary) ※ίʔυҰ෦ൈਮ
7.͕ࠩ͋Ε࣍ճͷൺֱ༻ʹ࡞ͨ͠εΫϦʔϯ γϣοτΛS3ʹΞοϓϩʔυ͢Δ Կ͠ͳ͍ ࠩ͋Γʂ 4 ࠩͳ͠ʂ
77 #======================================================= # S3ʹը૾ΛΞοϓϩʔυ͢Δ #======================================================= client.upload_file( 'test-reports/current_page_screenshot.png', '{S3໊}', ‘{S3ͷύε໊}/screenshot.png' )
※ίʔυҰ෦ൈਮ
9.Slackʹߘ͢Δ Ұຕʹ·ͱΊͨํ͕ݟ͍͢ʂ
มߋޙ มߋલ ࠩ
80 diffؒҧ͍୳͠(αϙʔτ͖)
81 #====================================================== # ͕ࠩ͋Εfiles uploadAPIͰSlackʹ௨ #====================================================== def postMessageWithFiles(message, fileList, channel):
slack_client = slack_sdk.WebClient(token=SLACK_TOKEN) for file in fileList: upload = slack_client.files_upload(file=file, filename=file) message = message + ”<“ + upload['file']['permalink'] + "| >" outPut = slack_client.chat_postMessage( channel = channel, text = message ) #======================================================= # มߋΛݕͨ࣌͠ #======================================================= if np.array_equal(img_current, img_past): postMessageWithFiles( message = " `ίϩφຊϫΫνϯίϯςϯπͷࠩΛݕ͠·ͨ͠ʂ”, fileList = ['test-reports/summary.png'], channel = "{௨͍ͨ͠νϟϯωϧ໊}", ) ※ίʔυҰ෦ൈਮ
82 ※ίʔυҰ෦ൈਮ ͠ະདྷͰɺ ࠩΛݟ͍ͨϖʔδ͕ෳʹ૿͑ͨ࣌
83 ݁Ռͱ·ͱΊ 3
84 هऀ σβΠφʔ ΤϯδχΞ ศརͳΈΛ ͋Γ͕ͱ͏͍͟͝·͢ ໌Β͔ʹ͓͔͍͠Օॴ͕ͳ͍͔ ؆୯ʹผͰ͖Δͷ͋Γ͕͍ͨ σʔλͷܻʹΑͬͯϨΠΞτ͕ มΘΔཁૉ͕͋Δɻ
ҙਤ͍ͯ͠ͳ͍ϨΠΞτʹ ͳ͍ͬͯͳ͍͔͕ҰͰ͔Δͷ͕ ྑ͍ ಋೖޙͷ
85 هऀ σβΠφʔ ΤϯδχΞ ศརͳΈΛ ͋Γ͕ͱ͏͍͟͝·͢ ໌Β͔ʹ͓͔͍͠Օॴ͕ͳ͍͔ ؆୯ʹผͰ͖Δͷ͋Γ͕͍ͨ σʔλͷܻʹΑͬͯϨΠΞτ͕ มΘΔཁૉ͕͋Δɻ
ҙਤ͍ͯ͠ͳ͍ϨΠΞτʹ ͳ͍ͬͯͳ͍͔͕ҰͰ͔Δͷ͕ྑ͍ ಋೖޙͷ Ͱɾɾɾɾ ͩΜͩΜݟΒΕͳ͘ͳͬͯ͠·͏
86 هऀ σβΠφʔ ΤϯδχΞ ޕޙ̑࣌ఆظ࣮ߦ͡Όͳͯ͘ ग़͢લʹνΣοΫͰ͖ΔΑ͏ͳػߏ ͕Α͔ͬͨ վળϙΠϯτ
هऀνʔϜ σβΠφʔɾΤϯδχΞνʔϜ εϓϨουγʔτͰ ຖσʔλूܭˍνΣοΫ վम͕͋Δ߹ (JU)VCͰϦιʔεཧ $*ͰϦϦʔε ͜ͷ࣌Ͱެ։ͱಉ࣌ʹ -BNCEBΛىಈ ͞Βʹվળ͢ΔͳΒ
88 هऀ σβΠφʔ ΤϯδχΞ ผͷϒϥβϞόΠϧαΠζͳͲ ͍Ζ͍Ζͳը໘ύλʔϯͰ ݕূͰ͖ͨ΄͏͕҆৺ײ͕ߴ·Δɻ վળϙΠϯτ ίϯςϯπͷ্෦ͷจষ͕ มߋ͞Εͯɺߦ͕มΘͬͯ͠
·͏ͱϨΠΞτ͕ͯ͢Լʹ ͣΕͨͱݕग़͞ΕΔͱ͍͏߹ ͕͋Δɻ
هऀνʔϜ σβΠφʔɾΤϯδχΞνʔϜ εϓϨουγʔτͰ ຖσʔλूܭˍνΣοΫ վम͕͋Δ߹ (JU)VCͰϦιʔεཧ $*ͰϦϦʔε άϥϑͷը૾ͷݕग़͚ͩʹಛԽ ͞Βʹվળ͢ΔͳΒ
90 Pythonͷศར͞ Γ͍ͨ͜ͱʹରͯ͠ɺπʔϧ͕ἧ͍ͬͯͯ ेߦͰ͙͢ʹࢼ͢͜ͱ͕Ͱ͖Δշద͕͞࠷ߴ
91 هऀ σβΠφʔ ΤϯδχΞ ۀվળͷ໘ന͍ϙΠϯτ ͍͍ͭͬͯΔ ಉ͡ܗࣜ֬ೝ࡞ۀ ͍ͭͬͯΔ͚Ͳ ຊ൪Ͱຖ ֬ೝ͢Δ͔͠ͳ͍ͷ͔ͳʙ
92 هऀ σβΠφʔ ΤϯδχΞ ۀվળͷ໘ന͍ϙΠϯτ ͍͍ͭͬͯΔ ಉ͡ܗࣜ֬ೝ࡞ۀ ͍ͭͬͯΔ͚Ͳ ຊ൪Ͱຖ ֬ೝ͢Δ͔͠ͳ͍ͷ͔ͳʙ
ʮ͜͏ͳͬͨΒ͍͍ͷʹͳʙʯɺࠔ͍ͬͯΔຊਓ͔Β ϐϯϙΠϯτͰདྷͳ͍
93 هऀ σβΠφʔ ΤϯδχΞ ۀվળͷ໘ന͍ϙΠϯτ ͲΜͳײ͡Ͱ ࡞ۀ͍ͯ͠ΔΜͰ͔͢ʁʁ
94 هऀ σβΠφʔ ΤϯδχΞ ۀվળͷ໘ന͍ϙΠϯτ ͜Μͳखஈ͋Γ·͢Αʁ ͜͏ͨ͠Β͍͍͔ʁ ͦΜͳ͜ͱͰ͖Δͷʁʁʂʂ ศརʂͦΕ΄͍͠ʂ
95 ·ͱΊ νʔϜͷಇ͖ํΛ͞Βʹշదʹ͢ΔͨΊͷछ͕ ʑͷίϛϡχέʔγϣϯͷதʹ͋Δ͔ʁʂ
96 https://hack.nikkei.com/
97 ͋Γ͕ͱ͏͍͟͝·ͨ͠