JavaScript Web Workers

วันนี้ได้ mail จากลูกค้าเจ้านึง เขียนประมาณว่า “กูอยากใช้ Shared Web Workers (SWW) มึงช่วยทำไงก็ได้ให้ JavaScript API มึง support SWW ที หรือไม่งั้นมึงบอก design, protocol มา เดี๋ยวกูเขียน API ใหม่เอง (แต่มึงต้อง test, fix bug แล้ว support code ที่กูเขียนนะ – สัด)” ผมก็เลยต้องมานั่งหาว่าไอ้ Web Workers หรือ Shared Web Worker มันคือะไร เพราะไม่เคยได้ยินมาก่อน entry นี้จะเขียนถึง Web Workers ก่อนละกัน

Web Workers (Web Workers @Wikipedia) เป็น feature ของ HTML 5 ที่ทำให้สามารถรัน JavaScript แบบ multithread ได้ครับ

คือปกติ JavaScript มันเป็น single thread มันจะรันคำสั่งตาม queue ของมันเสมอ ไม่ว่าจะเป็นการ display, validate, ต่อ ajax, websocket หรือทำ function ต่างๆ ที่เราเขียน ทุกอย่างอยู่บน thread เดียวกันหมด ดังนั้นเวลามี function อะไรใน queue รันหนักๆ มันจะกระทบให้ทั้ง page ช้าไปหมดจนบางที browser จะขึ้น pop up มาถามว่า page กำลัง script อะไรบางอย่างทำให้มันช้าจน freeze นะ จะ kill page นี้ทิ้งไหม

เขาก็เลยคิด Web Workers ขึ้นมาเพื่อแตกงานอะไรที่หนักๆ ไปอีก thread นึงเลย จากที่ค้นๆ มาเขาจะยกตัวอย่างเป็นคำนวนค่า Pi ที่ต้องวน loop หนักๆ หรืออะไรที่ต้องคุยกับ server เยอะๆ แยกเป็น thread worker ไปแล้วให้ thread หลักรับผลการทำงานจาก thread ลูก (Worker) แบบ asynchronous ไปซะ

Concept หลักๆ ของการเขียน Web Workers คือ

ตัวแม่ (ชื่อ main.html ละกัน)

//new Worker object
var wk=new Worker("worker.js");
//ใช้ addEventListener เพื่อรับ message จาก Woker --> self.postMessage('worker got : '+data);
wk.addEventListener("message",function(oEvent){
	document.getElementById('display').textContent = oEvent.data;
	//จะ print 'worker got : Hello'
},false);

//start Worker และส่ง message ให้ Worker ด้วย postMessage
wk.postMessage('Hello'); 

worker.js

//ใช้ addEventListener เพื่อรับ message จาก Main --> wk.postMessage('Hello'); 
self.addEventListener('message',function(e){
	var data=e.data;
	//ใช้ postMessage เพื่อส่งกลับให้ Main
	self.postMessage('worker got : '+data);
},false); 

Continue reading “JavaScript Web Workers”

เพราะ Windows 8 มันห่วย

วันนี้ตอนเย็นเปิดคอมมาพบว่าอยู่ๆ ก็ต่อเนตไม่ได้ทั้งสายแลนทั้ง wifi T^T
ผมลอง restart router ดูก็ไม่หาย ลองเอามือถือต่อ wifi เดียวกันก็ต่อได้ สุดท้ายลอง restart เครื่องแล้วลองต่อใหม่ก็ต่อไม่ได้ คราวนี้ icon ตรง charm bar มันขึ้นว่า connection limited -*- พอลองใช้ tool troubleshoot ของ windows 8 ดูมันก็ขึ้น Diagnostics policy service wont start -*- (ไอ้สัด)

ผม google หาวิธีแก้อยู่ 1 ชม ลองแม่มทุกวิธีก็ยังไม่ได้จนสุดท้ายได้วิธีจาก link นี้ จากความเห็นของ jenae ครับ

net localgroup Administrators /add networkservice
press enter then type:
net localgroup Administrators /add localservice
press enter then type:
exit
press enter and restart your computer

และปิด “Allow the computer to turn off this device to save power” จากอันนี้

หลังจากนั้นมันจะขึ้น limited มาอยู่แป๊บนึงแล้วก็ต่อได้ล่ะ ^^

ปัญหามันยังไม่จบแค่นั้นเพราะอยู่ๆ Windows Firewall ก็ start ไม่ขึ้น -*- ก็ลองไปดูพบว่าหนึ่งใน dependency service อย่าง Base Filtering Engine มัน start ไม่ขึ้น

ก็ลอง google ดูอีกเกือบๆ 2 ชมๆ ก็หาวิธีได้ใน link นี้ วิธีแก้ก็คือยัด User “Everyone” เข้าไปให้มี permission ใน BFE Service ด้วยการแก้ registry

ตอนนี้ BFE start ขึ้นแล้ว แต่ Firewall ยัง start ไม่ขึ้นด้วย message ง่ายๆ ว่า “Windows could not start firewall on Local computer”, “Access Denied”, “Error Code 5” อะไรพวกนี้สลับๆ กันไป -*-

ผมลองแก้ทุกอย่างที่ทำได้แล้ว รัน programe ที่เขาว่า fix ได้, ลองแก้ Registry ของ \SharedAccess, เพิ่ม user ทั้ง Everyone และ Mpssvc และ BFE ลงไปก็ไม่หาย เท่าที่ google ดู 80% ถึงกับ repair หรือ re-install windows กันใหม่เลยทีเดียว มีแค่ส่วนน้อยที่แก้ปัญหาได้ (ลองดู link 1, link 2 และ link 3)

ผมลองแก้ทุกอย่างตั้งแต่ 1 ทุ่มถึงห้าทุ่มก็ยังแก้ปัญหาไม่หมด สุดท้ายผมเหนื่อยเกินกว่าจะแก้ เกินกว่าจะมานั่ง repair windows ล่ะ ….

ลง comodo firewall แม่มเลยแสรดดดดดดดดดดดดด ไม่ง้อ windows firewall ก็ได้

เพราะ Windows 8 มันห่วยสินะ …

วิธีเปิด file .tar.gz

สิบกว่าปีในชีวิตการทำงานของผม ผมเปิด file .tar.gz ด้วยวิธีนี้เสมอ

$> gunzip file.tar.gz
$> tar -xvf file.tar

ผมใช้วิธีนี้มาตลอดโดยสงสัยว่าทำไมมัน pipe คำสั่งกันไม่ได้วะ แต่ก็ยัง gunzip มันอยู่จนกระทั่ง @rtsp, @sikachu และ @somkiat บอกผมว่า “ทำไมไม่ใช้ tar -zxvf?”

$> tar -zxvf file.tar.gz

โอ มันง่ายกว่าจริงๆ ;__;

ขอขอบคุณ @rtsp, @sikachu และ @somkiat มานะทีนี้