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
RSSフィードをもっと便利に / Make RSS feeds more convenient...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ぷらす
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
510
趣味プロジェクトをリードする技術 / Technology to lead hobby projects
p1ass
21
9.2k
vercel/og-imageを使ったブログOGPの簡単自動生成 / Generate OGP easily using vercel og-image
p1ass
2
1.4k
Webアプリケーションにおける並行処理の難しさ / #Gocon_Sendai
p1ass
4
2.7k
うじまる君の生活習慣の乱れを可視化したい! / uzimaru birthday LT
p1ass
2
16k
複数サービスを運用しやすい理想のコンテナ環境をVPS上に構築する #camphor_day / Building ideal container environment on VPS
p1ass
1
9.3k
Kubernetesのイメージタグの更新を楽にするツールを作った / p1ass/mikku - make updating Kubernetes image tags easier
p1ass
1
120
ドメインロジックと 永続化処理を分離する設計改善 を行って得られた知見 / 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
200
Other Decks in Technology
See All in Technology
生成AIのテナント制御とシャドーMCP対策 | AIを"止めずに"、情報を守る
yukun
0
110
[RSJ26] NarrativeFlow: Flow-Based Vision-Language-Action Model Using Robot Velocity Fields
keio_smilab
PRO
0
150
Self Healing Rollouts: Automating Production Fixes with Agentic AI
kdubois
0
150
Sony-DroidKaigi2026
sony
1
310
bet_ai_day_2026_session02
agenticsec
1
980
Azure App Service / Container Apps の組み込み認証
kuniteru
0
190
「重なり」は迎える側がつくる ― 人もAIエージェントも歓迎するプロダクトエンジニアリング ―
go0517go
PRO
0
230
作り直せるコードは迅速に 作り直せないDBは慎重に - AI時代のプロダクトエンジニアが「判断の不可逆性」で開発速度を変える話
kinosuke01
0
230
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
0
240
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
140
AndroidでHDRメディアを「壊さずに」扱う
chigichan24
0
390
Kiro Crewしか勝たん!?
miu_crescent
PRO
0
180
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Into the Great Unknown - MozCon
thekraken
41
2.7k
First, design no harm
axbom
PRO
2
1.3k
Making Projects Easy
brettharned
120
6.7k
The agentic SEO stack - context over prompts
schlessera
0
890
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
340
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
GraphQLとの向き合い方2022年版
quramy
50
15k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
500
The SEO Collaboration Effect
kristinabergwall1
1
550
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⭐͍ͩ͘͞