Upgrade to Pro — share decks privately, control downloads, hide ads and more …

データサイエンスやデータエンジニアリングの求人サイトの個人開発

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 データサイエンスやデータエンジニアリングの求人サイトの個人開発

Avatar for billyio

billyio

June 25, 2024
Tweet

Other Decks in Programming

Transcript

  1. 2024年 Rust Webアプリ開発の現在 billyio 2024年 6月 25日 2024年 Rust Webアプリ開発の現在

    データサイエンスやデータエンジニアリングの 求人サイトの個人開発 by billyio 1/20
  2. 1. 自己紹介 2. 求人サイトの紹介 3. Rust開発 3.1 求人情報のスクレイピング 3.2 web開発

    3.3 ブログ 2024年 Rust Webアプリ開発の現在 目次 by billyio 2/20
  3. 経歴: 2019年 3月 学士(商学) → IT派遣会社(現職) 2019年 11月 ~2022年 7月

    画像処理、 CFDシミュレーション 2022年 8月 ~2024年 4月 データエンジニア 普段やっていること: ボルダリング , 育児 , 猫の世話 EURO2024 求人サイトの個人開発 atcoder鉄則 2024年 Rust Webアプリ開発の現在 自己紹介 ① by billyio 3/20
  4. 技術熟練度 Rustを使い始めて 100~150時間くらい web開発の業務経験なし 社内外のイベント登壇や LT経験なし Rust本や学習サイトはまだ(やりたい) 先月 atcoderを Rustで始めた。茶色レベル

    web開発 , Rust, プレゼン , 資料のご意見やアドバイスあれば嬉しいです 2024年 Rust Webアプリ開発の現在 自己紹介 ② by billyio 4/20
  5. データサイエンス、データエンジニアリ ングに関する求人情報を掲載。 https://data-career-blueprint.com/ 職種 : ML Engineer LLM Engineer Data

    Scientist Data Analyst Data Engineer etc 2024年 Rust Webアプリ開発の現在 求人サイトの紹介 by billyio 5/20
  6. .github/workflows/ publish.yml datacollector/ <--- 求人サイトのスクレイピングやデータ処理 src/main.rs Cargo.toml db/ <-- (開発中)

    docs/ <-- ドキュメント群 handbook/ presentation/ biz/ images/ webapp/ <-- Webサービス開発 dist/ src/ pages/ main.rs Cargo.toml index.html styles.css 2024年 Rust Webアプリ開発の現在 デェレクトリ構成 by billyio 8/20
  7. 処理一覧 1. Notionの APIを使って 募集職種一覧 URL を取得 2. 各 URLを使って求人情報を取得

    3. jsonで保存 2024年 Rust Webアプリ開発の現在 Rustを使ったスクレイピング by billyio 9/20
  8. 使用ライブラリ : scraper, serde, serde_json, reqwest use scraper::{Html, Selector}; let

    html = r#" <ul> <li>Foo</li> <li>Bar</li> </ul> "#; let fragment = Html::parse_fragment(html); let selector = Selector::parse("li").unwrap(); for element in fragment.select(&selector) { assert_eq!("li", element.value().name()); } 2024年 Rust Webアプリ開発の現在 Rustを使ったスクレイピング by billyio 10/20
  9. 会社情報のデータベースを Notionで管理 主な項目: 法人番号 (13桁の数字 ) 主キー 商号又は名称 資金調達フェーズ (シリーズ

    A~E,上場区分 ,子会社 /関連会社 ) 業種 募集職種一覧 URL 2024年 Rust Webアプリ開発の現在 Rustを使ったスクレイピング by billyio 11/20
  10. Notion APIの制限 1クエリあたり最大 100件まで取得可 現状会社データベース 230件なので 10回のループで API制限回避可能 fn get_corp_db_from_notion()

    -> Result<(), reqwest::Error> { // let mut headers = 省略 let client = reqwest::blocking::Client::builder().default_headers(headers).build()?; let url = "https://api.notion.com/v1/databases/XXXXX/query"; let mut combined_res_json: Vec<Value> = Vec::new(); for i in 1..=9 { <--- クエリ件数上限を回避 let body = json!({ "filter": { "property": "法人番号", "rich_text": { "starts_with": i.to_string() } } }); // 省略 } 2024年 Rust Webアプリ開発の現在 Rustを使ったスクレイピング by billyio 12/20
  11. 求人情報の職種名から規定のキーワードを含めばタグを追加。 let mut job_category = Vec::new(); let ml_engineer_keywords = ["機械学習エンジニア",

    "MLエンジニア", "ML エンジニア", "AIエンジニア", "AI エンジニア", "Machine Learning Engineer"]; if ml_engineer_keywords.iter().any(|&keyword| job_title.contains(keyword)) { job_category.push("ml_engineer".to_string()); } 例えば、 「 AIエンジニア(自然言語処理) 」だと ["ml_engineer", "nlp_engineer"] 2024年 Rust Webアプリ開発の現在 Rustを使ったスクレイピング by billyio 13/20
  12. 3. jsonで保存 struct Record { corp_id: String, corp_name: String, corp_funding_stage:

    String, corp_industry: Vec<String>, job_id: String, job_name: String, job_category: Vec<String>, job_url: String, content: String, } 2024年 Rust Webアプリ開発の現在 Rustを使ったスクレイピング by billyio 14/20
  13. 技術スタック Frontend: yew Backend: None Database/Data Source: json, (Cloudflare D1)

    Hosting: Cloudflare Pages CI/CD: GitHub Actions 2024年 Rust Webアプリ開発の現在 Rustを使った webサイト by billyio 15/20
  14. 現状、フロントエンドで JSONデータ (1.2MB)を保持 let data: &str = include_str!("./data/file.json"); let all_jobs:

    Vec<Record> = serde_json::from_str(data).unwrap(); 2024年 Rust Webアプリ開発の現在 Rustを使った webサイト by billyio 16/20
  15. use pulldown_cmark::{Parser, Options, html::push_html}; use web_sys::HtmlElement; #[function_component(Blog)] pub fn blog()

    -> Html { let markdown_input = include_str!("../../../docs/handbook/main.md"); let mut options = Options::empty(); options.insert(Options::ENABLE_TABLES); let parser = Parser::new_ext(markdown_input, options); let mut html_output = String::new(); push_html(&mut html_output, parser); html! { <div> <HtmlContent html_content={html_output.clone()} /> </div> } } 2024年 Rust Webアプリ開発の現在 Rustを使ったブログ開発 by billyio 18/20
  16. そもそもブログの数が少ない (ない )のでハードコーディング let markdown_input = include_str!("../../../docs/handbook/main.md"); include_str! は、 Rustの

    macroで、指定したファイルの内容をコンパイル時に文字列リテラル let file_path = "path/to/your/file.txt"; let file_content = include_str!(file_path); // コンパイルエラーになる 2024年 Rust Webアプリ開発の現在 Rustを使ったブログ開発 by billyio 19/20