Skip to content

Instantly share code, notes, and snippets.

@sheepla
Last active March 24, 2025 12:12
Show Gist options
  • Save sheepla/7fdf89b0811372531723e6c698ac2f70 to your computer and use it in GitHub Desktop.
Save sheepla/7fdf89b0811372531723e6c698ac2f70 to your computer and use it in GitHub Desktop.
Fetch and parse RSS/Atom feed in Rust
[package]
name = "rustyfeed"
version = "0.1.0"
edition = "2024"
[dependencies]
clap = { version = "4.5.32", features = ["derive"] }
reqwest = "0.12.15"
serde = { version = "1.0.219", features = ["derive"] }
syndication = "0.5.0"
thiserror = "2.0.12"
tokio = { version = "1.44.1", features = ["full"] }
use syndication::Feed;
#[derive(Debug, thiserror::Error)]
pub enum ClientError {
#[error("HTTP Error: {0}")]
Http(reqwest::Error),
#[error("HTTP Status Error: {0}")]
HttpStatus(reqwest::Error),
#[error("Failed to read the content: {0}")]
ReadText(reqwest::Error),
#[error("Parse Error: {0}")]
Parse(String),
}
pub struct Client(reqwest::Client);
impl Client {
pub fn new(client: reqwest::Client) -> Self {
Self(client)
}
pub async fn fetch_feed<U: reqwest::IntoUrl>(
&self,
url: U,
) -> Result<syndication::Feed, ClientError> {
let req = self.0.get(url);
let resp = req
.send()
.await
.map_err(ClientError::Http)?
.error_for_status()
.map_err(ClientError::HttpStatus)?;
let content = resp.text().await.map_err(ClientError::ReadText)?;
let feed = content
.parse::<syndication::Feed>()
.map_err(|err| ClientError::Parse(err.to_owned()))?;
Ok(feed)
}
}
mod feed;
use syndication::Feed::{Atom, RSS};
#[derive(Debug, thiserror::Error)]
enum AppError {
#[error("Client Error: {0}")]
Client(#[from] feed::ClientError),
}
#[tokio::main]
async fn main() -> Result<(), AppError> {
let feed = feed::Client::new(reqwest::Client::new())
.fetch_feed("https://zenn.dev/topics/typescript/feed")
.await?;
match feed {
RSS(rss) => {
dbg!(rss);
}
Atom(atom) => {
dbg!(atom);
}
}
Ok(())
}
@sheepla
Copy link
Author

sheepla commented Mar 24, 2025

Output

Output
warning: unused import: `syndication::Feed`
 --> src/feed.rs:1:5
  |
1 | use syndication::Feed;
  |     ^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: `rustyfeed` (bin "rustyfeed") generated 1 warning (run `cargo fix --bin "rustyfeed"` to apply 1 suggestion)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.11s
warning: the following packages contain code that will be rejected by a future version of Rust: quick-xml v0.12.4, quick-xml v0.20.0
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1`
     Running `target/debug/rustyfeed`
[src/main.rs:19:13] &rss = Channel {
    title: "Zennの「TypeScript」のフィード",
    link: "https://zenn.dev/topics/typescript",
    description: "Zennのトピック「TypeScript」のRSSフィードです",
    language: Some(
        "ja",
    ),
    copyright: None,
    managing_editor: None,
    webmaster: None,
    pub_date: None,
    last_build_date: Some(
        "Mon, 24 Mar 2025 03:43:03 GMT",
    ),
    categories: [],
    generator: Some(
        "zenn.dev",
    ),
    docs: None,
    cloud: None,
    rating: None,
    ttl: None,
    image: Some(
        Image {
            url: "https://storage.googleapis.com/zenn-user-upload/topics/f13e758fdb.png",
            title: "Zennの「TypeScript」のフィード",
            link: "https://zenn.dev/topics/typescript",
            width: None,
            height: None,
            description: None,
        },
    ),
    text_input: None,
    skip_hours: [],
    skip_days: [],
    items: [
        Item {
            title: Some(
                "Prismaでfull-typedのページネーション関数をつくる",
            ),
            link: Some(
                "https://zenn.dev/mitsuki_kanzaki/articles/3a2d39e8a22052",
            ),
            description: Some(
                "\n 書こうとしたきっかけ\npaginationのresponseを以下のように統一したく、\ntype PaginationResponse&lt;T&gt; = {\n    items: T[],\n    total: number,\n    cursor: number,\n    limit: number,\n}\nかつ毎回直でprisma.user.findMany()を使ってからresponseを作りたくないため、関数で以上の作業をまとめようとするのが普通だと思いますが、適当に関数を書いてしまうとprismaの強大なtype-systemが利用できなくなるのがすごく嫌。\nなのでネット...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--YNljzqJc--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Prisma%25E3%2581%25A7full-typed%25E3%2581%25AE%25E3%2583%259A%25E3%2583%25BC%25E3%2582%25B8%25E3%2583%258D%25E3%2583%25BC%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%25B3%25E9%2596%25A2%25E6%2595%25B0%25E3%2582%2592%25E3%2581%25A4%25E3%2581%258F%25E3%2582%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2581%25BF%25E3%2581%25A4%25E3%2581%258D%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUxtNXd1MUpLTDgxM3JHYkZGSmdNQXh0c3FDVWV2Z3BBTmtSVnBKX0VacGo9czk2LWM=%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/mitsuki_kanzaki/articles/3a2d39e8a22052",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 23:58:37 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "みつき",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "TypeScriptを使って学ぶSOLID原則5 依存性逆転の原則(Dependency Inversion Principle)",
            ),
            link: Some(
                "https://zenn.dev/ayut0/articles/c9b8410f6ede21",
            ),
            description: Some(
                "\n モチベーション\nソフトウェアを設計する際に重要な5つのガイドラインであるSOLID原則について学んでいます。\n前回はインターフェイス分離の原則(Interface Sefregation Principle)についてアウトプットを行いました。\nhttps://zenn.dev/ayut0/articles/4ba394269fe9b9\n今回は依存性逆転の原則(Dependency Inversion Principle) について学んだので、アウトプットの一環で記事を執筆しました。\n\n 依存性逆転の原則(Dependency Inversion Segregation Princip...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--QhiDZlST--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:TypeScript%25E3%2582%2592%25E4%25BD%25BF%25E3%2581%25A3%25E3%2581%25A6%25E5%25AD%25A6%25E3%2581%25B6SOLID%25E5%258E%259F%25E5%2589%25875%2520%25E4%25BE%259D%25E5%25AD%2598%25E6%2580%25A7%25E9%2580%2586%25E8%25BB%25A2%25E3%2581%25AE%25E5%258E%259F%25E5%2589%2587%25EF%25BC%2588Dependency%2520Inversion%2520Pr...%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:A3yut0%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FPaDE0R2h3d1FoeGFydTFVMjN1MFJ0MnBmUVBjWUZ2dkNTa0RBYmlxWEo4U1NBPXM5Ni1j%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/ayut0/articles/c9b8410f6ede21",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 22:45:01 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "A3yut0",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "VSCodeでタブを切り替えてもカーソル位置をキープ!Cursorghostを作った話",
            ),
            link: Some(
                "https://zenn.dev/kupuma_ru21/articles/vscode-cursorghost-extension",
            ),
            description: Some(
                "VSCodeで複数ファイルを同時に開きタブを切り替えた際に「さっきのカーソル位置どこだっけ…?」ってなること、ありませんか?\n私はこの問題に悩まされていたので、Vscodeのextensionを作成し解決しました。\n\n 🧠 作った拡張機能:Cursorghost\n🔗 Cursorghost - Visual Studio Marketplace\nこの拡張機能は、ファイルタブを切り替えたときにカーソル位置をファイルタブ間で自動で同期するというextensionです。\n\n\n 🎯 解決したかった課題\nVSCodeで複数タブを行き来しながら編集していると、どこを編集していたのか見失うことが多々あ...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s---wOyR1e7--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:VSCode%25E3%2581%25A7%25E3%2582%25BF%25E3%2583%2596%25E3%2582%2592%25E5%2588%2587%25E3%2582%258A%25E6%259B%25BF%25E3%2581%2588%25E3%2581%25A6%25E3%2582%2582%25E3%2582%25AB%25E3%2583%25BC%25E3%2582%25BD%25E3%2583%25AB%25E4%25BD%258D%25E7%25BD%25AE%25E3%2582%2592%25E3%2582%25AD%25E3%2583%25BC%25E3%2583%2597%25EF%25BC%2581Cursorghost%25E3%2582%2592%25E4%25BD%259C%25E3%2581%25A3%25E3%2581%259F%25E8%25A9%25B1%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2581%258F%25E3%2581%25B7%25E3%2581%25BE%25E3%2583%25BC%25E3%2582%258B%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2YxZGRmMTIzNTMuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/kupuma_ru21/articles/vscode-cursorghost-extension",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 22:32:06 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "くぷまーる",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "Vue で createApp() を活用してモーダルを動的に管理する方法",
            ),
            link: Some(
                "https://zenn.dev/kenji_wilkins/articles/46e4538305bd24",
            ),
            description: Some(
                "\n TL;DR\nVue 3 の createApp() を使って 独立した Vue インスタンスごとにモーダルを動的に管理 する方法を紹介。\nPinia を活用してモーダルをスタック構造で管理し、複数のモーダルを順番に開閉できる仕組み を実装。\nパフォーマンス面での注意点もあるが、複数のモーダルを同時に扱うシナリオには有効なアプローチ。\nこんなかんじに動作します\nhttps://vue-playground-flame.vercel.app/\n\n はじめに\nVue でモーダルを実装する際、通常は v-if や v-show を使って表示・非表示を切り替えるのが一般的かと思われます。あるい...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--wbKnVm3T--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Vue%2520%25E3%2581%25A7%2520createApp%2528%2529%2520%25E3%2582%2592%25E6%25B4%25BB%25E7%2594%25A8%25E3%2581%2597%25E3%2581%25A6%25E3%2583%25A2%25E3%2583%25BC%25E3%2583%2580%25E3%2583%25AB%25E3%2582%2592%25E5%258B%2595%25E7%259A%2584%25E3%2581%25AB%25E7%25AE%25A1%25E7%2590%2586%25E3%2581%2599%25E3%2582%258B%25E6%2596%25B9%25E6%25B3%2595%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:Kenji%2520Wilkins%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FPaDE0R2l1WEZYTHBBT2pSdHNBbEFmNDQyNFU5RnJnMDNUeDJJTV9MbkFBWXc9czk2LWM=%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/kenji_wilkins/articles/46e4538305bd24",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 13:17:12 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "Kenji Wilkins",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "readonly,  union, Pick, Extract, Awaitedなどの型定義を紹介",
            ),
            link: Some(
                "https://zenn.dev/643866/articles/d8eb8e0e0d0fd3",
            ),
            description: Some(
                "最近学んだ型定義をいくつか紹介します。\n\n 1. readonly\nreadonlyは、オブジェクト型のプロパティを読み取り専用にすることができます。\ntype TestItem = {\n\treadonly label: string\n\treadonly content: string\n}\nexport const ProfileInfo = ({ label, content }: TestItem) =&gt; {\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;p&gt;{label}&lt;/p&gt;\n\t\t\t&lt;p&gt;{content}&lt;/p&gt;\n\t\t...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--aC48TGXE--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:readonly%252C%2520%2520union%252C%2520Pick%252C%2520Extract%252C%2520Awaited%25E3%2581%25AA%25E3%2581%25A9%25E3%2581%25AE%25E5%259E%258B%25E5%25AE%259A%25E7%25BE%25A9%25E3%2582%2592%25E7%25B4%25B9%25E4%25BB%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2581%259F%25E3%2581%2593%25E7%2584%25BC%25E3%2581%258D%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2UxZWY2MWJmNmIuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/643866/articles/d8eb8e0e0d0fd3",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 11:55:01 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "たこ焼き",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "Next.jsでパスキー入門",
            ),
            link: Some(
                "https://zenn.dev/r1013t/books/283aa80ccd143d",
            ),
            description: Some(
                "Next.jsプロジェクトにパスキーを導入する例をご紹介します。",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--3wVSNFw---/g_center%2Ch_280%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYm9va19jb3Zlci82NmY5NGM3OWVjLmpwZWc=%2Cw_200/v1627283836/default/og-base-book_yz4z02.jpg",
                    length: "0",
                    mime_type: "image/jpeg",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/r1013t/books/283aa80ccd143d",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 05:20:21 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "ryu",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "ベータリリースされたOxlintを使ってみる",
            ),
            link: Some(
                "https://zenn.dev/h_yokoyama/articles/beta-oxlint-try",
            ),
            description: Some(
                "\n はじめに\nJavaScript プロジェクトのリンターはデファクトスタンダードとして ESLint が使われてきました。しかし最近では実行速度の遅さや、Flat Config への移行コストなどが課題として挙げられるようになり ESLint に代わる次世代のリンターに注目が集まりつつあります。\nそんな中、先日 Oxc から 「Oxlint」というリンターがベータリリースされました。Oxlint は、「ESLint より 50〜100 倍高速」と掲げており一度使ってみたいと思ったので、実際に手元で試してみることにしました。\nこの記事では、Oxlint の全体像と実際に使ってみた感想をま...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--QKcdXbkk--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2583%2599%25E3%2583%25BC%25E3%2582%25BF%25E3%2583%25AA%25E3%2583%25AA%25E3%2583%25BC%25E3%2582%25B9%25E3%2581%2595%25E3%2582%258C%25E3%2581%259FOxlint%25E3%2582%2592%25E4%25BD%25BF%25E3%2581%25A3%25E3%2581%25A6%25E3%2581%25BF%25E3%2582%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:Hayato%2520Yokoyama%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzgzYzMwMWVlMjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/h_yokoyama/articles/beta-oxlint-try",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 03:58:06 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "Hayato Yokoyama",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "Reactユーザー向けLit入門",
            ),
            link: Some(
                "https://zenn.dev/ncdc/articles/af1a87979b21ac",
            ),
            description: Some(
                "React に慣れている開発者が、初めてLitに触れるときのための入門記事です。この記事では、React との違いを意識しながら、Lit の基本的な使い方を解説します。\nhttps://lit.dev/docs/\n\n Litとは\nLitは Google が開発している軽量なライブラリで、Web Components を効率的に構築するためのライブラリです。Reactのようなライブラリではなく、純粋な Web 標準の上に構築された、軽くて高速な UI ライブラリです。\n\n Web Componentsとは\nWeb Components は、ブラウザが標準でサポートしているコンポーネント技術...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--9_QKxOrd--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:React%25E3%2583%25A6%25E3%2583%25BC%25E3%2582%25B6%25E3%2583%25BC%25E5%2590%2591%25E3%2581%2591Lit%25E5%2585%25A5%25E9%2596%2580%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_34:tatsssssssssuya%2Cx_220%2Cy_108/bo_3px_solid_rgb:d6e3ed%2Cg_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzNhODZhNDA5ZDMuanBlZw==%2Cr_20%2Cw_90%2Cx_92%2Cy_102/g_south_west%2Ch_34%2Cl_default:og-publication-pro-mark-xcosax%2Cw_34%2Cx_217%2Cy_158/co_rgb:6e7b85%2Cg_south_west%2Cl_text:notosansjp-medium.otf_30:NCDC%25E3%2582%25A8%25E3%2583%25B3%25E3%2582%25B8%25E3%2583%258B%25E3%2582%25A2%25E3%2583%2596%25E3%2583%25AD%25E3%2582%25B0%2Cx_255%2Cy_160/bo_4px_solid_white%2Cg_south_west%2Ch_50%2Cl_fetch:aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FGZFp1Y3JJaGphRjZPUEF6V3JKQkxWN2xwWFlyMlZ3Qi1kTUczaUhaM0VZPXM5Ni1j%2Cr_max%2Cw_50%2Cx_139%2Cy_84/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/ncdc/articles/af1a87979b21ac",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 03:04:02 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "tatsssssssssuya",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "新卒時代から開発し続けてる自作 Markdown パーサーを大幅ブラッシュアップした話",
            ),
            link: Some(
                "https://zenn.dev/nappa/articles/a80a05f642ed1f",
            ),
            description: Some(
                "\n はじめに\n今日は新卒時代から育ててる自作 Markdown パーサー Richmd について、色々共有しようと思います。\n↓「そもそも、Richmd ってなんだよ!」って思った人は、まずは、こちらを読んでいただけると幸いです 🙏\nhttps://zenn.dev/nappa/articles/eb732f6e235ed1\n\n 今までの Richmd について\nhttps://github.com/richmd/richmd\nRichmd は、自作の Markdown パーサーでオリジナルの書式も持っていましたが、実際使ってみると様々な問題点を抱えてる状態でした。\n\n 問題: CSS ...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--99Jm88Ge--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E6%2596%25B0%25E5%258D%2592%25E6%2599%2582%25E4%25BB%25A3%25E3%2581%258B%25E3%2582%2589%25E9%2596%258B%25E7%2599%25BA%25E3%2581%2597%25E7%25B6%259A%25E3%2581%2591%25E3%2581%25A6%25E3%2582%258B%25E8%2587%25AA%25E4%25BD%259C%2520Markdown%2520%25E3%2583%2591%25E3%2583%25BC%25E3%2582%25B5%25E3%2583%25BC%25E3%2582%2592%25E5%25A4%25A7%25E5%25B9%2585%25E3%2583%2596%25E3%2583%25A9%25E3%2583%2583%25E3%2582%25B7%25E3%2583%25A5%25E3%2582%25A2%25E3%2583%2583%25E3%2583%2597%25E3%2581%2597%25E3%2581%259F%25E8%25A9%25B1%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:nappa%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzBiZTZlMDkwMDAuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/nappa/articles/a80a05f642ed1f",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 02:33:49 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "nappa",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "Google Apps Scriptとスプレッドシートで非同期処理(Queue)",
            ),
            link: Some(
                "https://zenn.dev/sonicmoov/articles/c2ac2bdceedcbc",
            ),
            description: Some(
                "\n はじめに\n今回、とある社内のフローを効率化するため、Slackとスプレッドシートを連携するツールをGAS(Google Apps Script)で開発することになりました。\nしかし、開発を進める中で、いくつかの大きな壁にぶつかりました。\n\n 直面した問題\n\n 1. スプレッドシートのアクセス権限\n社内情報ということもあり、スプレッドシートのアクセス権限は「組織内のみ」に制限されていました。\nGASで作成するAPIも同様に制限され、外部からのSlack Webhookリクエストを直接処理できませんでした。\n\n 2. Slack APIのレスポンスは3秒以内\nSlack APIでは、3秒...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--X_wpg-Su--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Google%2520Apps%2520Script%25E3%2581%25A8%25E3%2582%25B9%25E3%2583%2597%25E3%2583%25AC%25E3%2583%2583%25E3%2583%2589%25E3%2582%25B7%25E3%2583%25BC%25E3%2583%2588%25E3%2581%25A7%25E9%259D%259E%25E5%2590%258C%25E6%259C%259F%25E5%2587%25A6%25E7%2590%2586%25EF%25BC%2588Queue%25EF%25BC%2589%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_34:takemo101%2Cx_220%2Cy_108/bo_3px_solid_rgb:d6e3ed%2Cg_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzY0YjYwNGE3MzguanBlZw==%2Cr_20%2Cw_90%2Cx_92%2Cy_102/co_rgb:6e7b85%2Cg_south_west%2Cl_text:notosansjp-medium.otf_30:%25E6%25A0%25AA%25E5%25BC%258F%25E4%25BC%259A%25E7%25A4%25BE%25E3%2582%25BD%25E3%2583%258B%25E3%2583%2583%25E3%2582%25AF%25E3%2583%25A0%25E3%2583%25BC%25E3%2583%2596%2Cx_220%2Cy_160/bo_4px_solid_white%2Cg_south_west%2Ch_50%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2Q3NDBmZGFmNmIuanBlZw==%2Cr_max%2Cw_50%2Cx_139%2Cy_84/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/sonicmoov/articles/c2ac2bdceedcbc",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sun, 23 Mar 2025 01:47:43 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "takemo101",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "83. Remove Duplicates from Sorted List",
            ),
            link: Some(
                "https://zenn.dev/idapan/articles/3cfdc1b711097c",
            ),
            description: Some(
                "ソートされた連結リストの先頭ノード(head)が与えられたとき、重複する要素をすべて削除し、各要素が一度だけ現れるようにしてください。その後も連結リストは昇順でソートされたままである必要があります。\n例 1:\n入力: head = [1,1,2]\n出力: [1,2]\n例 2:\n入力: head = [1,1,2,3,3]\n出力: [1,2,3]\n制約:\n\nリスト内のノードの数は [0, 300] の範囲内です。\n各ノードの値 Node.val は -100 以上 100 以下です。\nリストは昇順にソートされていることが保証されています。\n\n\n\n",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--D4Tn7Y1b--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_66:83.%2520Remove%2520Duplicates%2520from%2520Sorted%2520List%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:Keijiro%2520Ida%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2EwYTNmOGUyMGYuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/idapan/articles/3cfdc1b711097c",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sat, 22 Mar 2025 21:20:17 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "Keijiro Ida",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "【Firestore】NoSQLでもJOINしたい(シングルトン設計)",
            ),
            link: Some(
                "https://zenn.dev/ri_new_e/articles/5300632d578516",
            ),
            description: Some(
                "FirestoreというNoSQLライクなDBを使っているのですが、NoSQLの正解は「非正規化」であり、JOINが使えません。\n将来的にSQLに移行したいと思ったら、Firestore独自の参照フィールドを使ったり、非正規化したりといった、「正解」を避けたいですよね。これはNoSQLの設計原則から外れているためアンチパターンとされることもありますが、プロトタイピングやSQL移行を見越した場合には、思い切りSQL脳で設計して、フロントでJOIN的なことしても、マスターデータ的なものくらいなら、設計次第で大丈夫でしょ!と思ったので、パフォーマンス的に良い設計を考えて、備忘録として書き殴って...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--H9u1fqMC--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%2590Firestore%25E3%2580%2591NoSQL%25E3%2581%25A7%25E3%2582%2582JOIN%25E3%2581%2597%25E3%2581%259F%25E3%2581%2584%25EF%25BC%2588%25E3%2582%25B7%25E3%2583%25B3%25E3%2582%25B0%25E3%2583%25AB%25E3%2583%2588%25E3%2583%25B3%25E8%25A8%25AD%25E8%25A8%2588%25EF%25BC%2589%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:%25E3%2583%259E%25E3%2583%259E%25E3%2581%25BF%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2U2ZmJmZjIwMDQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/ri_new_e/articles/5300632d578516",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sat, 22 Mar 2025 17:44:13 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "ママみ",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "MastraをPokeAPIを使って試してみた",
            ),
            link: Some(
                "https://zenn.dev/rsk31/articles/1881fafd7fedf7",
            ),
            description: Some(
                "\n 概要\n最近、TypeScriptエージェントフレームワークの「Mastra」を目にすることが増えてきたため、少しだけ試してみました。\n\n 1. Mastraとは?\nMastraはAIアプリケーションや機能を構築するためのフレームワークで、エージェント開発、メモリ管理、関数呼び出し、RAG(Retrieval-Augmented Generation)、ワークフロー管理など多くの機能を提供しています。また、Vercel AI SDKを利用してOpenAIやAnthropic、Google GeminiなどのさまざまなLLMプロバイダーと連携できます。\nhttps://mastra.ai...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--BU9seRh5--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Mastra%25E3%2582%2592PokeAPI%25E3%2582%2592%25E4%25BD%25BF%25E3%2581%25A3%25E3%2581%25A6%25E8%25A9%25A6%25E3%2581%2597%25E3%2581%25A6%25E3%2581%25BF%25E3%2581%259F%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:rsk31%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzc0YWY4ZWQzYTcuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/rsk31/articles/1881fafd7fedf7",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sat, 22 Mar 2025 12:15:29 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "rsk31",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "Shopifyのアプリ開発:WSLでトンネルを作りメール送信まで",
            ),
            link: Some(
                "https://zenn.dev/masaru21/articles/50c84e08c72632",
            ),
            description: Some(
                "Shopifyのテーマのカスタマイズは以前行っていたのですが、パソコンをクリーンインストールしてShopifyの開発環境が着ているため、今回WSL2でShopifyのアプリ開発環境を作ることにしました。\nネットで見つけた記事を基に進めましたが、コマンドでエラーが出たので、備忘録を兼ねて書きます。\nこちらの記事を参考にしました。\nhttps://zenn.dev/shige/articles/a521d9b241ead694a0bc\nhttps://qiita.com/whike_chan/items/fbda06e389f3a7ccde2a\nこちらのコマンドでエラーになりました。\nsho...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--vJH_3Fiq--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Shopify%25E3%2581%25AE%25E3%2582%25A2%25E3%2583%2597%25E3%2583%25AA%25E9%2596%258B%25E7%2599%25BA%25EF%25BC%259AWSL%25E3%2581%25A7%25E3%2583%2588%25E3%2583%25B3%25E3%2583%258D%25E3%2583%25AB%25E3%2582%2592%25E4%25BD%259C%25E3%2582%258A%25E3%2583%25A1%25E3%2583%25BC%25E3%2583%25AB%25E9%2580%2581%25E4%25BF%25A1%25E3%2581%25BE%25E3%2581%25A7%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:lonely_creator_m%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FPaDE0R2hzOWNVVzBjY3NDOXZPcXFwd0QtZktPblJpbmM4YnFYWG9LVDhVQmxvPXM5Ni1j%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/masaru21/articles/50c84e08c72632",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sat, 22 Mar 2025 11:37:09 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "lonely_creator_m",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "「Module not found」でハマったあなたへ。Next.jsでエイリアスが効かない原因と解決法",
            ),
            link: Some(
                "https://zenn.dev/koenigwolf/articles/4dc751d786229f",
            ),
            description: Some(
                "\n 🚨 突然の「Module not found」…それ、ちゃんと設定できてますか?\nNext.jsで開発中、ファイルをインポートしようとしたら突如現れるこのエラー。\nModule not found: Can't resolve '@/lib/profile'\nエンジニアなら一度は見たことがあるこのエラーメッセージ。\n「なんでだよ!ファイルはあるじゃん!」と、心の中で叫んだ経験がある方も多いはず。\nこの記事では、このエラーの本当の原因と、初心者でも5分でできる解決方法を丁寧に解説します。\n\n📌 対象読者:\n\nNext.jsやReactを学習中の方\nエイリアスの設定に慣れていない方\n「な...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--7qrZ5UMp--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%258CModule%2520not%2520found%25E3%2580%258D%25E3%2581%25A7%25E3%2583%258F%25E3%2583%259E%25E3%2581%25A3%25E3%2581%259F%25E3%2581%2582%25E3%2581%25AA%25E3%2581%259F%25E3%2581%25B8%25E3%2580%2582Next.js%25E3%2581%25A7%25E3%2582%25A8%25E3%2582%25A4%25E3%2583%25AA%25E3%2582%25A2%25E3%2582%25B9%25E3%2581%258C%25E5%258A%25B9%25E3%2581%258B%25E3%2581%25AA%25E3%2581%2584%25E5%258E%259F%25E5%259B%25A0%25E3%2581%25A8%25E8%25A7%25A3%25E6%25B1%25BA%25E6%25B3%2595%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:KoenigWolf%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2M2OTFkNzUxNDYuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/koenigwolf/articles/4dc751d786229f",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sat, 22 Mar 2025 08:53:36 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "KoenigWolf",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "Cursor × Next.js 開発を加速する【.cursorrules】公開🚀",
            ),
            link: Some(
                "https://zenn.dev/koenigwolf/articles/e5819e56f0e23d",
            ),
            description: Some(
                "こんにちは、KoenigWolf です。\n今回は、僕がCursor + Next.js + shadcn/uiでプロジェクトを爆速構築する際に使っている .cursorrules(コーディングルール) をまるっと公開します!\n\n✅ 実装が速くなる\n✅ チームでも読みやすい\n✅ パフォーマンスとUXも落ちない\n\nそんなルールを1つずつ丁寧に解説していきます。\nNext.js App Router × Tailwind × shadcn/ui + TypeScriptの構成を使っている方は、ぜひ参考にしてください!\n\n\n ✅ 技術スタック(Stack)\nまずはベースとなる技術構成です。\n\n\n...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--cblRCF2D--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:Cursor%2520%25C3%2597%2520Next.js%2520%25E9%2596%258B%25E7%2599%25BA%25E3%2582%2592%25E5%258A%25A0%25E9%2580%259F%25E3%2581%2599%25E3%2582%258B%25E3%2580%2590.cursorrules%25E3%2580%2591%25E5%2585%25AC%25E9%2596%258B%2520%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:KoenigWolf%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2M2OTFkNzUxNDYuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/koenigwolf/articles/e5819e56f0e23d",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sat, 22 Mar 2025 07:45:41 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "KoenigWolf",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "【React/CRA/TypeScript】create‑tsrouter‑app で実現する次世代React SPA",
            ),
            link: Some(
                "https://zenn.dev/yusukekikuta/articles/044afea8dc5907",
            ),
            description: Some(
                "\n 登壇をしてきたよ\n皆さん、こんにちは。今回は、従来のCreate React App(CRA)が抱えていた課題を背景に、「create‑tsrouter‑app」という次世代のReact SPA生成ツールについて、先日のReactTokyo MeetUP#3にて登壇してきました。そこで紹介したCRAの問題点と、それを解決するためにViteとTanStack Routerをどのように組み合わせたか、その内部構造や実装、CLIオプションについて記事にて描かせていただきます。\n当日の様子\nhttps://speakerdeck.com/yusukekikuta0509/21-lt\n登壇資料...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--afW6qtPr--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%2590React%252FCRA%252FTypeScript%25E3%2580%2591create%25E2%2580%2591tsrouter%25E2%2580%2591app%2520%25E3%2581%25A7%25E5%25AE%259F%25E7%258F%25BE%25E3%2581%2599%25E3%2582%258B%25E6%25AC%25A1%25E4%25B8%2596%25E4%25BB%25A3React%2520SPA%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:Yusuke%2520Kikuta%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzAxNzNiNGMzZDEuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/yusukekikuta/articles/044afea8dc5907",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Sat, 22 Mar 2025 04:10:42 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "Yusuke Kikuta",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "70. Climbing Stairs",
            ),
            link: Some(
                "https://zenn.dev/idapan/articles/1d9c0762fbbd71",
            ),
            description: Some(
                "あなたは階段を上っています。頂上にたどり着くには n 段のステップが必要です。\n一度に 1 段または 2 段のステップを登ることができます。\n頂上まで登るには何通りの異なる方法がありますか?\n\n例 1:\n入力: n = 2\n出力: 2\n説明: 頂上まで登る方法は 2 通りあります。\n\n1 段 + 1 段\n2 段\n\n\n例 2:\n入力: n = 3\n出力: 3\n説明: 頂上まで登る方法は 3 通りあります。\n\n1 段 + 1 段 + 1 段\n1 段 + 2 段\n2 段 + 1 段\n\n\n\n\n\n\nn = 1 または n = 2 の場合、n をそのまま返す\n→ それぞれ方法は 1通り、2通りしかな...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--xSwHVFuB--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_76:70.%2520Climbing%2520Stairs%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:Keijiro%2520Ida%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2EwYTNmOGUyMGYuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/idapan/articles/1d9c0762fbbd71",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Fri, 21 Mar 2025 21:26:31 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "Keijiro Ida",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "React Flow の紹介と導入【React】",
            ),
            link: Some(
                "https://zenn.dev/b13o/articles/tutorial-react-flow",
            ),
            description: Some(
                "\n はじめに\n先日、React の勉強会で、React Flow の実装について取り上げました 🫐\nフローチャート、マインドマップ、ネットワーク図など、\n視覚的にわかりやすい UI/UX は、モダンな Web アプリケーションにおいて重要な要素です。\n今回は、ReactFlow について調査したので、基礎的な内容をまとめました!\n時間の節約になれば、嬉しいです 🙌\n\n React Flow とは?\nhttps://reactflow.dev/\nReact で、インタラクティブなダイアグラムを、簡単に実装できるのが、React Flow です。\nfigma や miro のような、ドラッグ...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--l-MyKKtY--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:React%2520Flow%2520%25E3%2581%25AE%25E7%25B4%25B9%25E4%25BB%258B%25E3%2581%25A8%25E5%25B0%258E%25E5%2585%25A5%25E3%2580%2590React%25E3%2580%2591%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_34:kazzyfrog%2Cx_220%2Cy_108/bo_3px_solid_rgb:d6e3ed%2Cg_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzdkYWE3NjM3NGMuanBlZw==%2Cr_20%2Cw_90%2Cx_92%2Cy_102/co_rgb:6e7b85%2Cg_south_west%2Cl_text:notosansjp-medium.otf_30:b13o%2520Tech%2520Blog%2Cx_220%2Cy_160/bo_4px_solid_white%2Cg_south_west%2Ch_50%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzgwMzRmZDk1NTIuanBlZw==%2Cr_max%2Cw_50%2Cx_139%2Cy_84/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/b13o/articles/tutorial-react-flow",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Fri, 21 Mar 2025 21:05:42 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "kazzyfrog",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
        Item {
            title: Some(
                "フロントでのStrategyパターンの使い方",
            ),
            link: Some(
                "https://zenn.dev/billysama/articles/29e8e3366d4160",
            ),
            description: Some(
                "最近Reactアプリケーションでユーザーの支払い手段(例:credit、paypay、bankなど)によって処理を変える機能を作る時 if 文を多用してるのを見た。\nこれだとコードがどんどん煩雑になるので、Strategy(ストラテジー)パターンを使って、支払いごとの処理を整理する方法をメモする。\n\n\n ❌ よくある悪い例:条件分岐だらけの関数\nまずは、よくある if 文だらけの例。\nfunction pay(method, amount) {\n  if (method === 'credit') {\n    return fetch('/api/pay/credit', {\n     ...",
            ),
            author: None,
            categories: [],
            comments: None,
            enclosure: Some(
                Enclosure {
                    url: "https://res.cloudinary.com/zenn/image/upload/s--NJIr4T8v--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2583%2595%25E3%2583%25AD%25E3%2583%25B3%25E3%2583%2588%25E3%2581%25A7%25E3%2581%25AEStrategy%25E3%2583%2591%25E3%2582%25BF%25E3%2583%25BC%25E3%2583%25B3%25E3%2581%25AE%25E4%25BD%25BF%25E3%2581%2584%25E6%2596%25B9%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:Billysama%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUVkRlRwNlRkcFIydF9QeEREa0ZFR2E1OTZxbG9BbzVrcnpuUHFPRVU4Uy1MQT1zOTYtYw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png",
                    length: "0",
                    mime_type: "image/png",
                },
            ),
            guid: Some(
                Guid {
                    value: "https://zenn.dev/billysama/articles/29e8e3366d4160",
                    permalink: true,
                },
            ),
            pub_date: Some(
                "Fri, 21 Mar 2025 19:50:51 GMT",
            ),
            source: None,
            content: None,
            extensions: {},
            itunes_ext: None,
            dublin_core_ext: Some(
                DublinCoreExtension {
                    contributors: [],
                    coverages: [],
                    creators: [
                        "Billysama",
                    ],
                    dates: [],
                    descriptions: [],
                    formats: [],
                    identifiers: [],
                    languages: [],
                    publishers: [],
                    relations: [],
                    rights: [],
                    sources: [],
                    subjects: [],
                    titles: [],
                    types: [],
                },
            ),
        },
    ],
    extensions: {
        "atom": {
            "link": [
                Extension {
                    name: "atom:link",
                    value: None,
                    attrs: {
                        "href": "https://zenn.dev/topics/typescript/feed",
                        "type": "application/rss+xml",
                        "rel": "self",
                    },
                    children: {},
                },
            ],
        },
    },
    itunes_ext: None,
    dublin_core_ext: None,
    syndication_ext: None,
    namespaces: {
        "content": "http://purl.org/rss/1.0/modules/content/",
        "dc": "http://purl.org/dc/elements/1.1/",
        "atom": "http://www.w3.org/2005/Atom",
    },
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment