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
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
430
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
1k
初海外で注意すべきこと12選!!!安全快適なre:invent生活にするために
yuuuuuuu168
1
120
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
1
540
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
1
1.8k
夫婦で子育てするための育児標準化
codmoninc
PRO
0
210
実践! SRE × AI - ABEMA における AIOps -
tetsuya28
8
3.1k
hackers_champloo_2026_tidb
makocchi
0
160
味覇で作るパスタが美味い - 20261001_yabaubuki.dev
livesense
PRO
0
130
無理せず続ける、子育てエンジニアの学び
codmoninc
PRO
0
750
パッチ更新でterraform initが落ちた日
grimoh
1
140
AIは「聞けば答える」から「任せると自分で進める」へ - JACTIMペナン地域部会・ペナン三水会講演
knishioka
0
110
Featured
See All Featured
Navigating Weather and Climate Data
rabernat
0
550
How to build a perfect <img>
jonoalderson
1
6.1k
We Have a Design System, Now What?
morganepeng
55
8.4k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
740
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
From π to Pie charts
rasagy
1
400
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⭐͍ͩ͘͞