วันพฤหัสบดีที่ 16 เมษายน พ.ศ. 2552

Windows 7: Tips เคล็ดลับ เพิ่ม Globalization Theme ที่ซ่อนอยู่

เราสามารถนำ Theme ที่ถูกกำหนดซ่อนอยู่ในโฟลเดอร์ C:\Windows\Globalization\MCT ซึ่งแยกโฟลเดอร์อยู่ 5 ประเทศ AU, CA, GB, US และ ZA

มีขั้นตอนดังนี้
1. เปิด Explorer ขึ้น
2. เลือก Organize | Folder and search options เพื่อเปิด Folder Options
3. คลิกเลือก Show hidden files, folders and drives
4. คลิกเอาเครื่องหมายถูกออกจากบ็อกซ์ Hide protected operating system files
(Recommended)
5. คลิก OK ปิดไดอะล็อก Folder Options ลง
6. ใน Explorer ไปที่ C:\Windows\Globalization\MCT
7. ในช่อง Search ที่มุมบนขวาของ Explorer พิมพ์ theme จะให้ผลแสดงไฟล์ theme ขึ้นมา
8. เลือกเฉพาะไฟล์ theme ทั้ง 5 ไฟล์ ไม่ต้องเลือกโฟลเดอร์ และกดคีย์ Ctrl+C
9. ไปที่โฟลเดอร์ C:\Windows\Resources\Themes และกดคีย์ Ctrl+V
เพื่อคัดลอกไฟล์ theme ทั้ง 5 ไฟล์นั้นเข้ามา
10. เลือก Organize | Folder and search options เพื่อเปิด Folder Options
คลิกเลือก Don't show hidden files, folders and drives
และคลิกเลือกกาถูกบ็อกซ์ Hide protected operating system files(Recommended) เพื่อให้ซ่อนไฟล์ดังกล่าวอีกครั้ง

ด้วย 10 ขั้นตอนนี้ ไฟล์ Theme ใหม่ทั้ง 5 ไฟล์นี้ได้ถูกติดตั้งเข้ามาให้พร้อมใช้งานได้แล้ว สามารถทดสอบได้โดยคลิกขวาบน Desktop และเลือก Personalized สังเกตในหมวด Installed Themes จะปรากฎ Themes ใหม่เหล่านี้พร้อมให้เลือกใช้งานได้แล้ว

วันศุกร์ที่ 10 เมษายน พ.ศ. 2552

Windows 7: ข่าวคราวที่สรุปจากเว็บต่างประเทศ เกี่ยวกับ Build 7077

รู้จัก Windows 7 7077 ?
++++++++++++++++++++++++++++++++++++++++++

ก่อนอื่นต้องแจ้งให้ทราบก่อนว่า
ข้อมูลส่วนนี้อาจจะไม่ถูกต้อง 100% เพราะเป็นเพียงบทสรุป
ที่ได้มาจากการรวบรวมข้อมูลจากเว็บต่างประเทศต่างๆ เท่านั้น
ซึ่งไม่ได้รับการยืนยันข้อเท็จจริงนี้จาก Microsoft แต่อย่างใด

Q: 7077 คือ RC (Release Candidate) จริงหรือไม่?
A: เป็น RC Escrow ส่วน RC ที่จะออกสู่สาธารณะอย่างเป็นทางการจะเป็นในราว พค. 2552

Q: แล้ว RC Escrow คืออะไร?
A: RC Escrow เป็น RC ภายใน ไม่ได้เผยแพร่สู่สาธารณะอย่างเป็นทางการ
โดยพื้นฐานแล้ว Escrow จะใช้ทดสอบว่าได้แก้ bugs ที่พบก่อนหน้าหมดแล้วจริงหรือไม่
หากไม่พบ bugs อีกเลย ก็จะประกาศออกเป็น Final RC ในเวลาต่อมา

Q: มีข่าวลือว่า ใน 4/4/2552 นี้ มีออกมาถึง 2 Build ด้วยกันคือ 7077 กับ 7105 ทำไมจึงเป็นเช่นนี้?
A: Microsoft แก้ไขหมายเลขตัวที่สองในเลข Build เป็นการบ่งถึงว่าเริ่ม Milestone (หลัก) ใหม่ของสายการพัฒนา
ซึ่ง Build 7105 และถัดไปจากนี้ มุ่งสู่ RTM ขณะที่ 7077 และถัดมาในสายของมันจะมุ่งสู่ RC และกล่าวกันว่า RC ที่ออกสู่สาธารณะจะถูกเปลี่ยนชื่อ Build เป็น 7100

+++++++++++++
มีข้อสังเกตเกี่ยวเลข Build ที่แสดงเป็นลายน้ำ (Watermark)
ที่มุมล่างขวาของเดสก์ทอป

- For testing purposes only. Build 7000
- Evaluation copy. Build 7068.winmain.090321-1322
- Evaluation copy. Build 7077

ทำให้เกิดข่าวลือว่า 7077 คือ RC Escrow ที่จะกลายเป็น RC Final
ที่อาจถูกเปลี่ยนเลข Build เป็น 7100
เพราะมันไม่มีเลขเวลากำหนดกำกับต่อท้ายไว้อีกแล้ว

++++++++++++++
บทเสริม: แปลบทความจาก SuperSite for Windows ของ Paul Thurrott

ในสายการพัฒนา Windows Server 2008 ได้รับแจ้งจากผู้จัดการโครงการ Alex Hinrichs ว่า Microsoft ได้เปลี่ยนวิธีการที่ใช้ในการพัฒนา Windows ใหม่โดยสิ้นเชิง ต้องขอบคุณต่อการแยกหน่วยหรือ componentization ใน OS ที่ไม่จำเป็นต้อง fork ต่อ Windows อีกต่อไปแล้ว ทำให้แต่ละทีมพัฒนาสามารถแยกทำงานของตนได้อย่างอิสระ แยกทำในแต่ละส่วนของทีมได้โดยใช้ประโยชน์จาก "virtual build labs" ในการตรวจสอบโค้ดที่พัฒนา เพื่อให้แน่ใจว่าพร้อมสำหรับการบรรจุลงใน main build หรือ winmain ที่เป็นตัวหลักได้จริง

การทำงานแบบ Fork ไม่ใช่วิธีการที่ดีเลย เพราะว่าการเปลี่ยนแปลงจะถูกกระทำต่อทุกสายแยก (Branches) และรวมกลับเข้าใน "Trunk" หลักพร้อมไปด้วยกัน ทำให้เสียเวลาและเกิดข้อผิดพลาดได้มาก ทีมพัฒนา Windows Client ยกเลิกใช้วิธีการเช่นนี้ไปแล้ว แม้ว่าบุคคลภายนอกจะไม่มีใครบอกได้ว่าทำไมเขาจึงเลือกวิธีทำเช่นนี้ แต่ใครๆ ก็จะต้องคาดเดาได้ว่าเป็นเรื่องของเวลาแน่นอน Microsoft ตั้งเป้าจะต้องคลอด OS ใหม่อย่าง Windows 7 ให้ได้ใน 2009 นี้ จึงจำเป็นต้องส่งให้ได้ทันกำหนดการ จึงเกิดการแยกสาย RC และ RTM โดยสาย RC จะเป็นชุดเลข 70xx ขณะที่ RTM จะกระโดดข้ามไปที่ 71xx และจะคืบหน้าไปคู่กัน เช่น RC build 7076 ก็จะเคียงคู่ไปด้วย RTM build 7106

ยังมีข่าวลือในเรื่องของ UI ใหม่ที่จะเกิดขึ้นอีกด้วย คงไม่ใช่เรื่องแปลกที่ Microsoft จะต้องเก็บสิ่งนี้เอาไว้สร้างความประหลาดใจสำหรับแฟนๆ ซึ่งจะเห็นได้ว่าใน 7106 ที่เป็น Build ระดับ RTM ตัวแรกสุดนั้นไม่ได้มีอะไรที่เป็นสีสันเลย (ใน 7107 build ใหม่ที่จะหลุดออกมาในเร็ววันนี้นั้น เราสามารถคาดหวังถึงสิ่งที่จะเพิ่มเข้ามาใหม่เหล่านี้)

วันจันทร์ที่ 6 เมษายน พ.ศ. 2552

Visual LISP: Tips คัดลอกแนวแถวในทิศใดๆ

ในคำสั่ง Array เองใน AutoCAD เราสามารถกำหนดให้ทำการคัดลอกรูปซ้ำในแนวแถวหนึ่งๆ ในทิศใดๆ ก็ได้ เช่น ทำซ้ำรูปขั้นบันได รูปฟันเลื่อย ฯลฯ

เพื่อให้งานเช่นนี้ทำได้สะดวกยิ่งขึ้น ลดจำนวนขั้นตอนการกำหนดค่าให้กับตัวเลือกต่างๆ ใน Array จึงได้พัฒนาคำสั่ง CopyN ขึ้นมาทำงานเพื่อการนี้ โดยมีพรอมต์เป็น

Command: copyn
Select objects: {เลือกวัตถุที่ต้องการ}
Select objects: {เลือกครบแล้วกด Enter หรือ Spacebar}
Base point: {คลิกเลือกจุดอ้างอิงแรก เช่น จุดเริ่มต้นของขั้นบันไดแรก ฯลฯ}
Next base point: {คลิกเลือกจุดอ้างอิงที่สอง เช่น จุดปลายของขั้นบันไดตัวแรก ฯลฯ}
Number of new copies: {ใส่จำนวนที่จะให้ทำซ้ำเพิ่มใหม่ แล้วกด Enter หรือ Spacebar}

ทิศทางของแถวในการซ้ำรูปขึ้น จะมาจากแนวเส้นระหว่างจุด Base point และ Next base point

ระยะห่างจากรูปแรกไปยังรูปทำซ้ำ จะเท่ากับระยะทางจากจุด Base point และ Next base point และจะคงค่าในรูปใหม่ที่ทำซ้ำขึ้นทั้งหมด


;;; Copy N objects , Analogous to One row Array in any direction.
;;; Developed by S.Chatchawal, schatchawal@gmail.com

(defun c:copyn (/ *error* oldcmd oldosmode s p q disp j n)
(setq oldcmd (getvar "cmdecho")
oldosmode (getvar "osmode")
)
(defun *error* (msg)
(if (not
(member msg (list "Function cancelled" "quit / exit abort"))
)
(princ (strcat "COPYN Error: " msg))
)
(command "_.undo" "_end")
(setvar "cmdecho" oldcmd)
(setvar "osmode" oldosmode)
(princ)
)
(setvar "cmdecho" 0)
(command "_.undo" "_begin")
(if (setq s (ssget))
(progn
(initget 1)
(setq p (getpoint "\nBase point: "))
(initget 33)
(setq q (getpoint p "\nNext base point: "))
(initget 1)
(setq n (getint "\nNumber of new copies: "))
(setq disp (mapcar '- q p)
j 0
)
(setvar "osmode" 0)
(repeat n
(setq j (1+ j))
(command "_.copy" s "" (mapcar '* disp (list j j j)) "")
)
(command "_.undo" "_end")
)
(princ "\nNo object found!!!")
)
(setvar "cmdecho" oldcmd)
(setvar "osmode" oldosmode)
(princ)
)

วันพุธที่ 1 เมษายน พ.ศ. 2552

Visual LISP: Tips ตอนตัดเส้น Line | LWPolyline เปิดช่องว่างที่มีข้อความแทรกอยู่

นอกจากการสร้าง Linetype ที่แทรกตัวอักษรไว้ทุกระยะหนึ่งๆ แล้ว ในบางกรณี อาจจำเป็นต้องใช้วิธีเขียนข้อความกำกับไว้บนแนวเส้นหนึ่งๆ แต่ไม่ได้เป็นข้อความเดิมซ้ำทุกระยะหนึ่งๆ

ซึ่งขั้นตอนของงาน ก็จะเพิ่มขึ้นมาหลังจากเขียนข้อความในแนวเส้นนั้นเสร็จแล้ว ต้องมาใช้คำสั่ง Break เพื่อตัดเส้นเปิดช่องว่างระหว่างข้อความอีกที

เพื่อลดขั้นตอนการทำงานเช่นนี้ จึงได้พัฒนา LISP routine ที่มีพรอมต์เป็น

Command: BT
Percentage of BT factor: <10.0> ใส่ค่าเปอร์เซนต์ของช่องว่างที่จะให้เว้นเพิ่มเติม
Select objects:

เลือกข้อความที่ต้องการ (รับพรอมต์ All ด้วย โดยคำสั่งจะกรองเอาแต่ Text เอง) และเมื่อเลือกครบแล้วให้กด Enter

เพียงเท่านี้คำสั่งนี้ก็จะทำหน้าที่ตัดเส้นเปิดเป็นช่องว่างระหว่างข้อความให้แล้ว

;;; Break Line with Text.
;;; Developed by S.Chatchawal, schatchawal@gmail.com
(vl-load-com)
(defun c:bt (/ s j k e obj p q r
sL eL oldosmode *error* tmp msg L
pr rp 1pr 1rp d
)
(setq oldosmode (getvar "osmode"))
(if (not #bt-factor)
(setq #bt-factor 10.0)
)
(defun *error* (msg)
(if (not
(member msg (list "Function cancelled" "quit / exit abort"))
)
(princ (strcat "BT Error: " msg))
)
(command "_.undo" "_end")
(setvar "cmdecho" 1)
(setvar "osmode" oldosmode)
(princ)
)
(foreach msg (list "\nPercentage of BT factor: <" #bt-factor "> ")
(princ msg)
)
(if (setq tmp (getdist))
(setq #bt-factor tmp)
)
(if (setq s (ssget (list (cons 0 "TEXT"))))
(progn
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(command "_.undo" "_begin")
(setq j -1)
(repeat (sslength s)
(setq e (ssname s (setq j (1+ j)))
obj (vlax-ename->vla-object e)
)
(command "_.justifytext" e "" "mc")
(setq q
(vlax-safearray->list
(vlax-variant-value (vla-get-TextAlignMentPoint obj))
)
p (vlax-safearray->list
(vlax-variant-value (vla-get-InsertionPoint obj))
)
r (mapcar '+ q (mapcar '- q p))
p (trans p 0 1)
r (trans r 0 1)
L (* (/ #bt-factor 200.0) (distance p r))
pr (mapcar '- r p)
rp (mapcar '- p r)
d (sqrt (apply '+ (mapcar '* pr pr)))
1pr (mapcar '/ pr (list d d d))
1rp (mapcar '/ rp (list d d d))
p (mapcar '+ p (mapcar '* 1rp (list L L L)))
r (mapcar '+ r (mapcar '* 1pr (list L L L)))
)
(if (setq sL (ssget "c"
p
r
(list (cons 0 "LINE,LWPOLYLINE"))
)
)
(progn
(setq k -1)
(repeat (sslength sL)
(setq eL (ssname sL (setq k (1+ k)))
)
(command "_.break" eL p r)
)
)
)
)
)
(princ "\nNo object found!!!")
)
(command "_.undo" "_end")
(setvar "osmode" oldosmode)
(setvar "cmdecho" 1)
(princ)
)