Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
RSSフィードをもっと便利に / Make RSS feeds more convenient...
Search
ぷらす
August 08, 2020
Technology
16k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RSSフィードをもっと便利に / Make RSS feeds more convenient #camphor_lt
CAMPHOR- LT 2020 Summerの発表スライドです。
https://camphor.connpass.com/event/182978/
ぷらす
August 08, 2020
More Decks by ぷらす
See All by ぷらす
AWSの認定資格を受けた話
p1ass
1
520
趣味プロジェクトをリードする技術 / Technology to lead hobby projects
p1ass
21
9.2k
vercel/og-imageを使ったブログOGPの簡単自動生成 / Generate OGP easily using vercel og-image
p1ass
2
1.5k
Webアプリケーションにおける並行処理の難しさ / #Gocon_Sendai
p1ass
4
2.7k
うじまる君の生活習慣の乱れを可視化したい! / uzimaru birthday LT
p1ass
2
17k
複数サービスを運用しやすい理想のコンテナ環境をVPS上に構築する #camphor_day / Building ideal container environment on VPS
p1ass
1
9.4k
Kubernetesのイメージタグの更新を楽にするツールを作った / p1ass/mikku - make updating Kubernetes image tags easier
p1ass
1
130
ドメインロジックと 永続化処理を分離する設計改善 を行って得られた知見 / Design improvements that separate domain logic and persistence function
p1ass
1
2.3k
Micro Frontends × gRPC-Web の挑戦 / The challenge of micro frontends and gRPC-Web
p1ass
0
210
Other Decks in Technology
See All in Technology
PagerDuty Tech Hub-鳴らすけれど、人は動かない
ezaki
0
180
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
640
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
200
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
190
WasmをRustにする
sansantech
PRO
0
260
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
280
「Docker Desktop不要の時代」は 来たのか?
ueponx
0
790
Tofu-Controller lightning talk @ Containerday 2026
gionn
0
120
AI時代のPRレビューにどう向き合うか?
kairim0
1
240
PHPカンファレンス関西の招待状 / Invitation to PHP Conference Kansai
ykanoh
0
150
Conditional PED-ANOVA: Hyperparameter Importance in Hierarchical & Dynamic Search Spaces
pfn
PRO
0
140
コンテナ運用におけるネットワーク・コンテナコストの削減方法/How to Reduce Network and Container Costs in Container Operations
masakiokuda
1
250
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
570
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Test your architecture with Archunit
thirion
2
2.4k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Unsuck your backbone
ammeep
672
58k
Fireside Chat
paigeccino
43
4.1k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
520
Git: the NoSQL Database
bkeepers
PRO
433
67k
Are puppies a ranking factor?
jonoalderson
2
4.1k
HDC tutorial
michielstock
2
960
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Transcript
344ϑΟʔυΛͬͱศརʹ $".1)03 -54VNNFS /BPLJ,JTIJ !QBTT
؛ ً Β͢ 5XJUUFSQBTT (JU)VCQBTT ࣗݾհ l $".1)03 ද
l αʔόαΠυϝΠϯ l (P 5ZQF4DSJQU એ ࠷ۙ3FMBZN͍ͬͯ͏8FCαʔϏ ε࡞Γ·ͨ͠ IUUQTSFMBZNDBNQIOFU
344ͬͯΔਓʁ
344 3FBMMZ4JNQMF4ZOEJDBUJPO l χϡʔεϒϩάͳͲ֤छͷΣϒαΠτͷߋ৽ใΛ ৴͢ΔͨΊͷจॻϑΥʔϚοτͷ૯শ l YNMܗࣜͳͷͰϓϩάϥϜͰ؆୯ʹύʔεग़དྷΔ IUUQTKBXJLJQFEJBPSHXJLJ344
344ͷϢʔεέʔε l ༷ʑͳςοΫϒϩάͷهࣄΛ344Ϧʔμʔʹొͯ͠ಡΉ l ͯͳϒϩά2JJUBσϑΥϧτͰରԠͯ͠Δ l ($1ͷϦϦʔεϊʔτΛ4MBDLʹྲྀ͢ l :PV5VCFνϟϯωϧͷߋ৽Λ344ͰνΣοΫ͢Δ
l IUUQTXXXZPVUVCFDPNGFFETWJEFPTYNM DIBOOFM@JE6$UK+ H$I-RF571BEJE4X ใऩूʹ͍ͨن֨
344Ϧʔμʔ'FFEMZ
344ͷਏΈ l ྲྀΕͯ͘Δใ͕ଟ͗͢Δ l BTDJJKQͳͲͷχϡʔεαΠτΛߪಡ͢Δͱ͍ͬͺ͍ྲྀΕͯ͘Δ l ͦͦ344ʹରԠ͍ͯ͠ͳ͍αΠτ͕݁ߏ͋Δ l ΞʔςΟετͷ)1ͳͲ
344Λྑ͍ײ͡ʹѻ͏ϥΠϒϥϦΛ࡞͠·ͨ͠ QBTTGFFEFS 344 "UPN BOE+40/GFFEHFOFSBUPSGSPN NVMUJQMF344 "UPN BOEBOZFOUSJFTZPVXBOU
GFFEFSͰग़དྷΔ͜ͱ l 344ͷهࣄΛϑΟϧλͯ͠৽ͨͳ344Λ࡞ l ෳͷ344ΛϚʔδͯ̍ͭ͠ͷ344Λ࡞ l ग़ྗ344͚ͩͰͳ͘ɺ"UPN+40/ʹରԠ l ಠࣗʹJOUFSGBDFΛຬͨ͢ߏମΛ࡞Δ͜ͱͰɺ
ҙͷαΠτͷใ͔ΒϑΟʔυΛ࡞
GFFEFSͷجຊతͳ͍ํ import "github.com/p1ass/feeder" rss1 := feeder.NewRSSCrawler("https://example.com/rss1") // ここでRSSのURLを指定 rss2
:= feeder.NewRSSCrawler("https://example.com/rss2") items, _ := feeder.Crawl(rss1, rss2) // 複数のRSSから記事を取得 feed := &feeder.Feed{ // 新規のフィードを作成 Title: "My feeds", Created: time.Now(), Items: items, // 2つのRSSから取得した記事を新規で作成するフィードに追加 } json, _ := feed.ToJSON() // string rssReader, _:= feed.ToRSSReader() // io.Reader ޙ)551Ͱ৴͢Ε0,
GFFEFSͷجຊతͳ͍ํ import "github.com/p1ass/feeder" rss1 := feeder.NewRSSCrawler("https://example.com/rss1") // ここでRSSのURLを指定 rss2
:= feeder.NewRSSCrawler("https://example.com/rss2") items, _ := feeder.Crawl(rss1, rss2) // 複数のRSSから記事を取得 feed := &feeder.Feed{ // 新規のフィードを作成 Title: "My feeds", Created: time.Now(), Items: items, // 2つのRSSから取得した記事を新規で作成するフィードに追加 } json, _ := feed.ToJSON() // string rssReader, _:= feed.ToRSSReader() // io.Reader ޙੜͨ͠344ͳΓ+40/Λฦ͢)551αʔόΛ࡞͢Ε0, ϑΟϧλ͍ͨ͠ͳΒ TMJDF͔Βཉ͍͠Λ நग़͢ΔؔΛ ڬΊ0,
Ԡ༻ྫϙʔτϑΥϦΦʹ༷ʑͳഔମͷهࣄΛදࣔ GFFEFSͰࣗ࡞ϒϩάͱ2JJUBͷهࣄΛ$SBXMͯ͠+40/"1*ΛݐͯͯΔ
ٕज़తͳ l ݴޠ(P l ϥΠϒϥϦ࡞࣌ษڧͯ͠Δݴޠͩͬͨ l JP3FBEFSΠϯλʔϑΣʔεΛຬ͍ͨͯ͠Δ l (PͰ࠷ΘΕΔΠϯλʔϑΣʔεͷ̍ͭ l
͋ΒΏΔೖग़ྗΛநԽͯ͠ѻ͑Δ l JP8SJUFSΛຬͨ͢ϑΝΠϧ)551ͷϨεϙϯεͳͲʹ؆୯ʹίϐʔͰ ͖Δ type Reader interface { Read(p []byte) (n int, err error) } IUUQTHPMBOHPSHQLHJP3FBEFS
ҙͷαΠτͷใ͔ΒϑΟʔυΛ࡞ ΠϯλʔϑΣʔεΛຬͨ͢ߏମΛ࡞ͬͯGFFEFS$SBXMؔʹ͚ͩ͢ type Crawler interface { Crawl() ([]*Item, error) }
func (crawler *SamasoniCrawler) Crawl() (*feeder.Items, error) { query :=
url.Values{} query.Add("perform_id", "85895") query.Add("sort_key", "sale_start_at") query.Add("sort_order", "asc") res, err := http.Get(crawler.url + "?" + query.Encode()) if err != nil { return nil, errors.New("failed to get html document") } defer res.Body.Close() doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { return nil, errors.New("failed to read from response body") } sec := doc.Find("div#tickets").Find("div.list-ticket") items := &feeder.Items{} sec := doc.Find("div#tickets").Find("div.list-ticket") items := &feeder.Items{} sec.Each(func(index int, s *goquery.Selection) { if s.HasClass("list-ticket") { title := s.Find("h2").Find("a").Text() path, _ := s.Find("h2").Find("a").Attr("href") t := time.Now() item := &feeder.Item{ Title: title, Link: &feeder.Link{ Href: "https://tiketore.com" + path, Rel: "", Type: "", Length: "",}, Id: path, Created: &t, } items.Items = append(items.Items, item) } }) return items, nil } ྫνέοταΠτΛΫϩʔϧ
·ͱΊ l 344ΣϒαΠτͷߋ৽ใΛ৴͢ΔͨΊͷจॻϑΥʔϚοτͷ ૯শ l QBTTGFFEFSΛ͏͜ͱͰɺҙͷใ͔Β344+40/Λ࡞Ͱ ͖Δ l ৴͢ΔهࣄΛϓϩάϥϜͰࣗ༝ʹૢ࡞Ͱ͖Δ l
Ԡ༻ྫ͑Εͳ͍΄Ͳࢁʂ l 4POZ.VTJDͷ:PV5VCFνϟϯωϧ͔Βʮถݰࢣʯͷಈը͚ͩநग़ l ྑ͔ͬͨΒͬͯΈ͍ͯͩ͘͞ ͦͯ͠4UBS⭐͍ͩ͘͞