8 คะแนน โดย GN⁺ 2024-11-29 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ระบบห้องสมุดแบบกระจายศูนย์เชิงสถิติโดยสมบูรณ์ที่สร้างบน IPFS, SQLite และ GitHub
  • สามารถโฮสต์อินสแตนซ์ที่อัปเดตอัตโนมัติบน Netlify และ GitHub Pages ได้

ห้องสมุดแบบกระจายศูนย์

  • เว็บแอปพลิเคชัน TeaTime แยกออกจากฐานข้อมูลและไฟล์ที่ดึงมาใช้อย่างสมบูรณ์
  • ฐานข้อมูลที่ใช้คือ GitHub repository ที่ติดแท็กหัวข้อ teatime-database และเผยแพร่บน GitHub Pages
  • แต่ละ repository มีไฟล์ config.json ที่ชี้ไปยังฐานข้อมูล SQLite
  • ก่อนที่ผู้ใช้จะค้นหา จะต้องเลือกฐานข้อมูลที่จะใช้ และ TeaTime จะ query ฐานข้อมูล SQLite ด้วย sql.js-httpvfs
  • แต่ละแถวในฐานข้อมูล SQLite คือรายการหนึ่งในห้องสมุด และคอลัมน์ file hash จะถูกใช้เพื่อดึงรายการจาก IPFS
  • เนื่องจากเว็บแอปเป็น static site และฐานข้อมูลประกอบด้วยไฟล์แบบสถิติจึงสามารถ fork, clone และ deploy ได้ง่าย
  • อินสแตนซ์ฝั่งฟรอนต์เอนด์คือ GitHub repository ที่ติดแท็กหัวข้อ teatime-instance
  • เนื่องจากไฟล์ถูกให้บริการผ่าน IPFS สถาปัตยกรรมแบบกระจายนี้จึงช่วยเพิ่มความทนทานของ TeaTime

ฟีเจอร์

  • ค้นหาได้ตามชื่อเรื่อง ผู้แต่ง ปี หรือรูปแบบ
  • เก็บประวัติการอ่านและกลับไปยังหน้าที่ค้างไว้เมื่อเปิดไฟล์อีกครั้ง
  • ดาวน์โหลดไฟล์ลงเครื่อง
  • แคชไฟล์ใน IndexedDB เพื่อการโหลดที่รวดเร็ว
  • ลากไฟล์มาวางใน TeaTime เพื่อเรนเดอร์
  • โหมดมืดและโหมดเต็มหน้าจอ
  • ไม่มีคุกกี้ ไม่มีการล็อกอิน
  • กระจายศูนย์อย่างสมบูรณ์

การพัฒนาฟรอนต์เอนด์

  • TeaTime เป็นแอปพลิเคชัน Nuxt.js
  • รันบนเครื่องโลคัลได้ง่าย: clone repository แล้วทำตามขั้นตอนต่อไปนี้
    1. ติดตั้ง dependency: npm install
    2. รันเซิร์ฟเวอร์: npm run dev
    3. ไปที่ http://localhost:3000
  • ดูข้อมูลเพิ่มเติมได้ในเอกสารของ Nuxt

การสร้างฐานข้อมูล

  • สามารถสร้างฐานข้อมูลได้โดย fork repository ฐานข้อมูลแบบ JSON และปรับไฟล์ JSON ให้ตรงกับความต้องการ
  • GitHub Actions จะสร้างไฟล์ SQLite และอัปโหลดไปยัง GitHub Pages
  • หากต้องการสร้างฐานข้อมูล SQLite ที่ทำงานร่วมกับ TeaTime ได้ด้วยตนเอง ให้ทำตามตัวอย่างใน repository ฐานข้อมูล
  • แต่ละฐานข้อมูล SQLite จะมีตารางตาม schema ด้านล่าง และสามารถปรับชื่อคอลัมน์ได้ในไฟล์ config.json
    CREATE TABLE "books" (  
      "id" INTEGER,  
      "title" TEXT,  
      "author" TEXT,  
      "year" INTEGER,  
      "lang" TEXT,  
      "size" INTEGER,  
      "ext" TEXT,  
      "ipfs_cid" TEXT,  
      PRIMARY KEY("id" AUTOINCREMENT)  
    );  
    
  • หากไฟล์ SQLite มีขนาดใหญ่เกินไปก็สามารถแบ่งย่อยได้ ควรดูข้อมูลเกี่ยวกับการปรับแต่งประสิทธิภาพฐานข้อมูล และแนะนำให้ใช้ FTS
  • เผยแพร่ repository บน GitHub Pages และกำหนดหัวข้อ teatime-database ให้กับ repository

การมีส่วนร่วม

  • แม้จะเขียนโค้ดไม่ได้ก็ยังมีส่วนร่วมได้ด้วยการ fork repository นี้และ repository ฐานข้อมูลที่คุณชื่นชอบ
  • เมื่อต้อง fork repository แนะนำให้ fork แบบ manual เพื่อไม่ให้เชื่อมโยงกันโดยตรง (git clone && git remote add your-origin ... && git push your-origin main)
  • การกดดาวให้ repository ฐานข้อมูลที่มีประโยชน์ก็เป็นอีกวิธีที่ดี เพราะสิ่งนี้ใช้กำหนดลำดับของฐานข้อมูลในอินเทอร์เฟซผู้ใช้ของ TeaTime เพื่อให้ผู้ใช้อื่นค้นหาฐานข้อมูลที่ดีที่สุดได้ง่ายขึ้น

1 ความคิดเห็น

 
GN⁺ 2024-11-29
ความคิดเห็นบน Hacker News
  • ผู้มีส่วนร่วมกับ IPFS เสนอแนวทางที่อาจปรับปรุงวิธีจัดการการดาวน์โหลดจากหลายเกตเวย์บน IPFS ได้

    • การใช้ @helia/verified-fetch สามารถรับ CID ผ่าน API ที่คล้ายกับ Fetch และจัดการ content routing กับการค้นหาแบบ P2P ได้
    • หากเชื่อมต่อกับเกตเวย์โดยตรงได้ ก็สามารถส่งเกตเวย์นั้นต่อเข้าไปได้เช่นกัน
  • เฟรมเวิร์ก Pear P2P อาจช่วยให้ย้ายออกจาก GitHub ไปสู่ระบบกระจายศูนย์อย่างแท้จริงได้

    • มีการตั้งคำถามว่าถ้าอินเด็กซ์ยังต้องอยู่บน GitHub แล้ว การเก็บไฟล์ไว้ใน IPFS จะมีความหมายอะไร
  • กำลังพิจารณาใช้ Helia เพื่อให้ผู้ใช้สามารถมีส่วนร่วมเป็นโหนดของเครือข่ายได้

    • ระหว่างค้นหาข้อมูลเกี่ยวกับ Helia ก็ทำให้นึกถึง OrbitDB
  • มีปัญหาถูกบล็อกเมื่อเข้าถึงทรัพยากรบางอย่างเนื่องจากนโยบาย CORS

    • สามารถดึงทรัพยากรมาได้โดยตั้งค่าโหมดของคำขอเป็น no-cors เพื่อปิดการทำงานของ CORS
  • ทุกอย่างทำงานอยู่ในเบราว์เซอร์ทั้งหมด และไม่มีผู้ใช้ คุกกี้ หรือการติดตาม

    • ใช้ LocalStorage และ IndexedDB เพื่อเก็บตำแหน่งที่อ่านล่าสุดและตำแหน่งภายในไฟล์
    • ชอบฟีเจอร์นี้มากและขอแสดงความขอบคุณ
  • ฐานข้อมูลที่ใช้ใน TeaTime คือที่เก็บ GitHub ซึ่งเผยแพร่บน GitHub Pages

    • ดูเหมือนว่าผู้ใช้ที่ประสงค์ร้ายอาจใช้แท็กนี้ได้ จึงอาจเป็นปัญหาด้านความปลอดภัย
  • เพราะไม่รู้ว่ามีอะไรอยู่ในฐานข้อมูล จึงไม่รู้ว่าควรค้นหาอะไร

    • มีการเสนอฟังก์ชันสำหรับการสำรวจดู
  • มีคำถามว่าสามารถใช้อินสแตนซ์ตัวอย่างได้หรือไม่

  • สงสัยว่าสามารถรวมบุ๊กมาร์กของ Pocket ได้หรือไม่

    • หวังว่าจะสามารถแคชทุกอย่างที่อยากอ่านไว้แบบออฟไลน์ ป้องกันลิงก์เสียในอนาคต และทำการค้นค้นได้