การย้ายจาก lsp-mode ไปใช้ Eglot ใน GNU Emacs
(utcc.utoronto.ca)- บางส่วนของ Wandering Thoughts และ CSpace จะแสดงหน้าบล็อกเมื่อ User-Agent ของเบราว์เซอร์ที่เก่าเกินไป ไปตรงกับกฎป้องกันครอว์เลอร์
- ตั้งแต่ต้นปี 2025 มีครอว์เลอร์จำนวนมากเพิ่มขึ้น และบางส่วนดูเหมือนมีเป้าหมายเพื่อ เก็บข้อมูลสำหรับฝึก LLM โดยใช้ User-Agent ของ Chrome รุ่นเก่า
- กำลังทดลองบล็อก User-Agent ของเบราว์เซอร์รุ่นเก่าเพื่อลดภาระของเว็บไซต์ และอาจมีกรณี ตรวจผิดพลาดกับผู้ใช้จริง ได้
- หากถูกบล็อกแม้ใช้เบราว์เซอร์รุ่นใหม่ สามารถติดต่อผ่านหน้าเว็บส่วนตัวของมหาวิทยาลัยโตรอนโตได้ และควรส่งทั้งชื่อเบราว์เซอร์กับ สตริง User-Agent ที่ถูกต้องไปด้วย
- สำหรับตระกูล archive.* นั้น แยกแยะได้ยากเพราะใช้ User-Agent ของ Chrome รุ่นเก่าและ IP แบบกระจาย จึงแนะนำให้ใช้ archive.org สำหรับเก็บถาวร Wandering Thoughts
เหตุผลที่หน้าบล็อกถูกแสดง
- เมื่อเข้าถึงบางส่วนของ Wandering Thoughts หรือ CSpace หากเวอร์ชันของเบราว์เซอร์ถูกจัดว่าเป็นสิ่งน่าสงสัยตามกฎป้องกันครอว์เลอร์ของเว็บไซต์ ก็จะมีการแสดงหน้าบล็อก
- ณ ต้นปี 2025 มีครอว์เลอร์จำนวนมากเพิ่มขึ้น และบางส่วนดูเหมือนมีจุดประสงค์เพื่อเก็บข้อมูลสำหรับฝึก LLM โดยใช้ Chrome User-Agent รุ่นเก่ารวมถึง User-Agent ของเบราว์เซอร์เก่าอื่น ๆ
- กำลังมีการทดลองบล็อก User-Agent ของเบราว์เซอร์รุ่นเก่าเพื่อลดภาระเว็บไซต์ และผู้ใช้ปกติก็อาจติดกฎนี้ได้เช่นกัน
- หากใช้เบราว์เซอร์รุ่นใหม่แต่ยังถูกบล็อก สามารถติดต่อผ่านหน้าเว็บส่วนตัวของมหาวิทยาลัยโตรอนโต และถ้าเป็นไปได้ควรส่งทั้งเบราว์เซอร์ที่ใช้อยู่และ สตริง User-Agent ที่ถูกต้องไปพร้อมกัน
หมายเหตุแยกตามผู้ใช้
-
ผู้ใช้ Inoreader
- ตัวดึงฟีดของ Inoreader เองไม่ได้เป็นเป้าการบล็อก และในความเป็นจริงยังดึงฟีดตามรอบอยู่เป็นประจำ
- Inoreader อาจดึงฟีดหรือหน้าด้วย HTTP User-Agent ของเบราว์เซอร์รุ่นเก่าหรือด้วยเบราว์เซอร์เก่าจริง ๆ แล้วนำหน้าบล็อกที่ได้รับมาแสดงให้ผู้ใช้เห็น
- ผลลัพธ์ของคำขอ HTTP ล่าสุดอาจแตกต่างกันไปตาม HTTP User-Agent ที่ใช้ และมีข้อมูลที่เกี่ยวข้องอยู่ใน HTTPResultsAndUserAgents
-
ผู้ใช้ Vivaldi
- เนื่องจากการโจมตีที่กำลังเกิดขึ้น แม้แต่ Vivaldi รุ่นใหม่ก็อาจถูกบล็อกได้หากถูกระบุว่าเป็น Google Chrome
- อาจต้องเปลี่ยนการตั้งค่า "User Agent Brand Masking" เพื่อให้ Vivaldi ถูกระบุว่าเป็น Vivaldi ไม่ใช่ Google Chrome
-
ผู้ใช้ archive.*
- คุณอาจเห็นหน้าบล็อกนี้ผ่าน archive.today, archive.ph, archive.is เป็นต้น
- archive.* ใช้ Chrome User-Agent รุ่นเก่า คลานเว็บจากบล็อก IP ที่กระจายกว้าง และบาง IP ยังมีรายการ reverse DNS ปลอมที่อ้างว่าเป็น googlebot IP ทำให้แยกออกจากผู้ไม่หวังดีได้ยาก
- หากต้องการเก็บถาวร Wandering Thoughts แนะนำให้ใช้ archive.org ซึ่งเป็นครอว์เลอร์สำหรับเก็บถาวรที่ทำงานได้ดีกว่า
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
สำหรับบางภาษา การแนะนำให้ Eglot เริ่มทำงานอัตโนมัติอาจเป็น ความคิดที่แย่มากถึงขั้นอันตราย ได้ เซิร์ฟเวอร์ LSP ของหลายภาษานั้นไม่ปลอดภัยพอสำหรับใช้กับโค้ดที่ไม่น่าเชื่อถือ และแค่เปิดไฟล์ในโปรเจ็กต์ Rust หรือ Elixir ที่ผู้โจมตีควบคุม ก็อาจทำให้เครื่องถูกเจาะได้
ถ้าไม่ใช่ภาษาที่มี LSP server ซึ่งเป็นที่รู้กันว่าปลอดภัย ก็ควรหลีกเลี่ยง การเปิดใช้ LSP อัตโนมัติ หลักฐาน: https://rust-analyzer.github.io/book/security.html
git statusก็อาจเป็นพื้นผิวการโจมตีได้: https://github.com/justinsteven/advisories/…ความต่างคือกรณีข้างต้นต้องมี exploit อยู่ในตัวรีโพเอง แต่ฝั่ง LSP ปัญหาอาจมาจาก dependency ได้ด้วย ถึงอย่างนั้น ถ้าชินกับการเปิด LSP ติดเป็นนิสัยแล้ว ก็ดูยากที่จะไม่ค่อย ๆ ด้านชาต่อคำเตือน
rust-analyzerกินแรม 4GB วิ่งอยู่นานหลายนาที และสร้างไดเรกทอรีtarget/debug/ขนาดเกิน 1GB ได้cargo buildไปแล้ว ก็แทบถือว่าจบเหมือนกัน แน่นอนว่า การโหลด LSP อัตโนมัติ กับคำสั่งที่ผู้ใช้รันเองโดยชัดเจนนั้นต่างกันมาก แต่ในการใช้งานจริง ความต่างอาจเล็กกว่าที่คิดlsp-modeแล้วค่อยเพิ่มโปรเจ็กต์เข้า allowlist ถ้ามี hook ที่ “รันอัตโนมัติ” อยู่แล้ว ก็เขียนให้read-from-minibufferถามก่อนว่า “คุณเชื่อถือโฟลเดอร์นี้ไหม?” ได้ในราว 10 บรรทัด และถ้าใช้projectileหรืออะไรคล้ายกันช่วยกำหนดไดเรกทอรีฐาน ก็จะได้ประโยชน์ด้านความปลอดภัยเกือบทั้งหมดการตั้งค่าของฉันใช้ allowlist ของ
lsp-modeแต่ลบทิ้งทุก session เพื่อให้ต้องยืนยันใหม่เป็นรายโปรเจ็กต์ทุกครั้งที่เปิด Emacs ขึ้นมาใหม่ เดิมทีน่าจะทำแบบนี้เพราะเรื่องประสิทธิภาพ และlsp-modeเคยมีจังหวะที่สปินหลายโปรเซสขึ้นมาก่อนจะเปิดบางโปรเจ็กต์เสียอีก ความเสี่ยงด้านความปลอดภัยมีอยู่จริง แต่การทำเวิร์กโฟลว์ที่ใช้งานได้ดีก็ไม่ได้ยากมากนักสิ่งที่น่ารำคาญที่สุดใน Eglot คือมันไม่ค่อยเปิดคำสั่งส่วนใหญ่เป็นฟังก์ชัน แต่ไปนิยามไว้บน อินเทอร์เฟซของ Emacs อย่าง
xrefแทน พอมีทั้งแบ็กเอนด์xrefของCIDERและclojure-lspแบบใน Clojure ก็เลยมักอยากเลือกฝั่งCIDERที่รู้สถานะรันไทม์จริงของโค้ดที่โหลดอยู่มากกว่าการวิเคราะห์แบบสแตติกของ
clojure-lspโดยเฉพาะในเวิร์กโฟลว์ REPL ระยะไกล อาจซิงก์คลาดกันได้ ในlsp-modeคุณยังเรียกฟีเจอร์อย่างกระโดดไปยัง definition เป็นคำสั่งโดยตรง พร้อมกับใช้xrefต่อไปได้ แต่ใน Eglot การตัดแบ็กเอนด์xrefบางตัวออกโดยเฉพาะนั้นค่อนข้างยุ่งยาก คำสั่งอื่น ๆ ที่มีในlsp-modeก็หายไปจาก Eglot ด้วย ทั้งที่จริงแล้วเป็นฟีเจอร์ที่น่าจะให้ผ่านจุดเชื่อมต่อการทำงานกับ Emacs คล้ายxrefได้เคยลองใช้
lsp-modeครั้งหนึ่ง แต่มีป๊อปอัปและการแจ้งเตือนที่ชวนสับสนเยอะเกินไป เลยลบทิ้งทันที Eglot ให้ประสบการณ์ LSP ที่ เงียบกว่าเยอะเปิดทิ้งไว้ แล้วค่อยใช้ฟีเจอร์เมื่อพร้อมก็พอ น่าสนใจดีที่ ~cks ใช้วิธีเข้าหาจากอีกทิศหนึ่งพร้อมพูดถึงทิปและทางเลือกหลายแบบ
lsp-modeเลยใช้งานด้วยอินเทอร์เฟซที่ค่อนข้างเงียบได้ เคยคิดจะย้ายไป Eglot แต่ตอนนั้นดูเหมือนไม่มีการผสานการทำงานที่อยากได้ เลยไม่ได้ลองต่อสิ่งที่อยากได้จริง ๆ คือ LSP server ที่รับมือกับ รีโพขนาดใหญ่มาก ได้ นี่เป็นข้อจำกัดที่เจอบ่อย จนเริ่มคิดว่าควรทำอะไรสักอย่างที่สร้างดัชนีซอร์สโค้ดครั้งเดียวแล้วเอาไปใช้ซ้ำกับงานสไตล์ LSP หลายอย่างได้หรือเปล่า แต่ก็กลัวว่าจะกลายเป็นการพยายามต้มมหาสมุทรอีก
Eglot กับ
lsp-modeเป็น LSP client สำหรับ Emacs ที่ดังที่สุดก็จริง แต่ก็ยังมีทางเลือกอย่าง lspce และ lsp-bridgeฉันใช้ Eglot มาหลายปีอย่างพอใจ แต่ก็มี ข้อจำกัดด้านการออกแบบ ที่อาจกลายเป็นปัญหามากขึ้นในอนาคต มันตั้งสมมติฐานว่า 1 บัฟเฟอร์ต่อ 1 ไคลเอนต์ ซึ่งตอนที่ Eglot ถูกสร้างขึ้นมาถือว่าสมเหตุสมผล แต่ตอนนี้กรณีที่อยากรัน LSP server หลายตัวในบัฟเฟอร์เดียวเริ่มพบได้บ่อยขึ้น คำแนะนำปัจจุบันคือใช้โปรแกรมแยกต่างหากเป็นตัว multiplex LSP
เมื่อ 4 วันก่อนฉันย้ายจาก
lsp-modeไป Eglot สำหรับ Python และพอใจมากตอนนี้เผยแพร่เวอร์ชันขั้นต่ำของการตั้งค่าปัจจุบันไว้ที่นี่: https://discuss.afpy.org/t/configuration-emacs-minimale-en-2026/3001
แต่อย่างไรก็ยังมีจุดน่าหงุดหงิดเรื่องการเติมโค้ดอยู่บ้าง เช่น ถ้ากด
foo<tab><tab>บางครั้งbasedpyrightจะ auto-import ของแปลก ๆ ทั้งที่มีสัญลักษณ์ที่ตรงกับสโคปปัจจุบันอยู่แล้ว และฉันก็ยังหาวิธีให้มันเติมแค่สตริงร่วมที่ยาวที่สุดไม่ได้ นอกนั้นถือว่าค่อนข้างดีอิจฉาคนที่ทำให้ Emacs ใช้งานเหมือน IDE สมัยใหม่ได้ ฉันใช้คีย์ไบน์ดิงของ Emacs อยู่ แต่ต่อให้ลงเวลาไป 6–8 ชั่วโมงก็ยังทำให้ Emacs ทำงานเหมือน IDE ไม่ได้
เมื่อก่อนเคยพยายามปรับให้เข้ากับ FB Flow ซึ่งใช้แทน TypeScript ในสภาพแวดล้อมพัฒนา Linux และ FreeBSD แล้วก็ยอมแพ้ และเมื่อสุดสัปดาห์ที่แล้วก็ลองทำสภาพแวดล้อม Python แบบครบฟีเจอร์บน Windows พร้อม tree-sitter ก่อนจะยอมแพ้อีกครั้ง มีอะไรให้ตั้งค่าเยอะเกินไป แถมยังต้องไปโหลด DLL อย่างตัวแยกวิเคราะห์ tree-sitter อีกหลายตัวแยกต่างหาก สิ่งที่ต้องมีเพื่อให้มันกลายเป็น IDE ที่ดีนั้นเยอะเกิน ตอนนี้เลยไม่อยากทุ่มเวลาแล้ว แต่ก็ยังชอบตรงที่บางครั้งพิมพ์
emacs -nwในเทอร์มินัลไหนก็ได้ แล้วได้สภาพแวดล้อมแก้ไขที่คุ้นเคยขึ้นมาทันทีfido-vertical-mode,which-key-mode,global-completion-preview-mode,yasnippet,eglot-ensure,basedpyrightก็น่าจะเริ่มต้นได้สบายแล้วถ้า
basedpyrightอยู่ใน path ก็จะได้ทั้งการเติมโค้ดและ syntax highlighting ที่ใช้งานได้ดีแม้ไม่มีไวยากรณ์ tree-sitter นี่เป็นเวอร์ชันที่ตัดทอนให้เหลือขั้นต่ำจากการตั้งค่าทั้งหมด และการตั้งค่าเต็มอยู่ที่ my full configdoom emacsก็น่าสนใจ ตั้งค่าง่ายมากและส่วนใหญ่ใช้งานได้ดีตั้งแต่ค่าเริ่มต้น ถ้าไม่ชอบevil-modeก็เปลี่ยนกลับไปใช้ คีย์ไบน์ดิงของ Emacs ได้