ใช้คำสั่ง screen ใน linux อย่างไร? by heha
Apr0
screen คือคำสั่งในการรัน command linux ต่างๆ แบบเปิดทิ้งไว้ แม้เน็ตจะหลุด คอมจะพัง เราก็ยังสามารถ remote มาเปิด session เดิมได้โดยที่มันไม่หายไปดื้อๆ เหมาะอย่างยิ่งสำหรับคนเน็ตไม่เสถียร มีวิธีใช้งานดังนี้ เช่น
screen mysqldump -uroot -pxxx > backup.sql
วิธีการใช้การก็เพียงแค่พิมพ์คำว่า screen นำหน้าคำสั่งที่เราต้องการ เช่น mysqldump เรารู้ว่ามันนานมาก เลยสั่ง screen ไว้ หากกด CTRL+A คำสั่งเริ่มต้นก่อนจะป้อนคำสั่งอื่นๆ ของ screen ไม่อย่างนั้นจะยังเป็นการสั่งไปยัง process ที่ทำงานภายใน screen ไม่ใช่ตัว screen เช่นเดิม แล้วจะมีคำสั่งต่อดังนี้
- d - ออกจากคำสั่ง screen โดยจะเข้าไปดูต่อวันหลังได้
- [ - เข้าสู่ copy mode ตรงนี้เมื่อเข้าแล้วจะมีคำสั่งดังต่อไปนี้ (ส่วนใหญ่แทบจะลอกจาก vi มาทั้งดุ้น)
- u - ออกจาก copy mode
- h - ขยับ cursor ไปทางซ้าย
- j - ขยับ cursor ลงข้างล่าง
- k - ขยับ cursor ขึ้น
- l - ขยับ cursor ลง
- G - ขยับ cursor ไปที่ line ที่กำหนด
- CTRL+u - เลื่อนขึ้นครึ่งหน้า
- CTRL+d - เลื่อนลงครึ่งหน้า
- CTRL+b - เลื่อนขึ้นหนึ่งหน้า
- CTRL+f - เลื่อนลงหนึ่งหน้า
- / - search จาก cursor ลงไปข้างล่าง (กด n เพื่อ search next)
- ? - search จาก cursor ขึ้นข้างบน (กด n เพื่อ search next)
และหากกด d เพื่อออกจากคำสั่ง screen ไปแล้ว หรือเน็ตหลุดระหว่าง run screen เราสามารถพิมพ์ "screen -r" เพื่อกลับไปยัง session เดิมที่รันไว้ หรือหากมีหลาย session จะมีข้อความแสดงเช่นดังนี้
There are several suitable screens on:
24146.pts-5.node1 (04/30/13 23:48:40) (Detached)
23909.pts-5.node1 (04/30/13 23:33:22) (Detached)
23817.pts-5.node1 (04/30/13 23:27:58) (Detached)
23647.pts-0.node1 (04/30/13 23:21:36) (Attached)
Type “screen [-d] -r [pid.]tty.host” to resume one of them.
เราอยากเข้าอันไหนก็พิมพ์ตามที่เค้าบอก เช่น “screen -r 23817.pts-5.node1″ ก็จะกลับ session ที่ต้องการได้ ไม่เลวเลยใช่ไหมครับ
การออกแบบตัวละคร: วิธีการลบ by akara
Apr0
จากที่เคยเขียนถึงวิธีการออกแบบตัวละครที่ได้อ่านจากหนังสือเริ่มนี้เมื่อเดือนม.ค.
การออกแบบตัวละคร: วิธีบวก

คราวนี้จะมาพูดต่อถึงวิธีถัดไปครับ คือ วิธีการลบ
วิธีนี้จะว่าง่ายก็ง่าย จะว่ายากก็ยากครับ คือ คอนเซปต์ง่าย แต่ทำจริงต้องอาศัยประสบการณ์กับเซนส์เอาหน่อย
จากวิธีการบวกที่เคยพูดถึงไปแล้ว ปัญหาที่มักจะเกิดคือ ใส่จนรกเกินไป และหาจุดเด่นของตัวละครนั้นๆไม่ได้ อย่างแย่เลยคือมองไม่ออกว่าไอ้นี่มันตัวอะไรกันแน่วะ
ดังนั้นวิธีการลบก็คือ เอาของที่ไม่จำเป็นออกไปซะ คงไว้แ่ค่จุดเด่นๆของตัวละครแค่นั้นพอ
ตัวอย่างจากในหนังสือ
Catgirl with Glasses
China Girl
Angel-winged Girl
การทำ callback หลังจบลูป by voratep
Apr0
ในการใช้งานของ node.js นั้น จะมีพื้นฐานการทำงานแบบ Asynchronous ทำให้บางครั้ง
การที่เราต้องการค่าตัวสุดท้ายที่ออกมาจากลูป นั้นทำได้ยากมาก
ตัวอย่างเช่น
เรามี array อยู่ 1 ชุดจากนั้นเราต้องการ เอาค่าต่างๆใน array ชุดนั้นมาเข้าฟังก์ชั่นที่ต้องรอ callback อีกทีหนึ่ง
แล้วเราก็ต้อง callback ค่าที่ได้นั้นๆออกมาเป็น array อีกที เราจะมีวิธีเขียนเพื่อทำงานในลักษณะนี้ยังไง
วิธีแก้ไขปัญหานี้ เราจะใช้ parallel ของ async lib เข้ามาช่วยโดยโครงสร้างของมันมีดังนี้
parallel(tasks, [callback])
async.parallel([
function(callback){
setTimeout(function(){
callback(null, ‘one’);
}, 200);
},
function(callback){
setTimeout(function(){
callback(null, ‘two’);
}, 100);
}
],
// optional callback
function(err, results){
// results จะมีค่าเป็น array [one,two]
});
จากตัวอย่างการเขียนเราสามารถเขียน เป็น Array ของ function ให้เสร็จก่อนแล้วค่อยเรียกใช้งาน parallel ได้ แต่สิ่งที่เราต้องการนั้น
เราต้องเอาค่าใน array ไปเรียกใช้ function ก่อนด้วย จะมีลักษณะ การใช้ดังนี้
var aData = [1,2,3];
var aFunc = [];
for (var i in a)
{
//สั่งให้ มันรันคำสั่งนี้ทันที
(function(){
var temp = a[i];
var func = function(callback){
// เรียกฟังก์ชัน อืนเพื่อประมวนผลก่อน
funcA (temp, function(result){
callback(null,result);
}
};
aFunc.push(func);//เก็บ function ลง array
})();
}
async.parallel(aFunc,function(err,results){
//จะได้เป็น array ของข้อมูลที่ออกมาจากฟังก์ชั้น funcA});
ทำเส้นรัศมีฮัดช่าห์ [Ai] by TAMA
Apr0
วาดรูปสามเหลี่ยมยาวๆยืดๆขึ้นมาหนึ่งรูปก่อนนะคะ

ใช้ Rotate Tool จิ้มตรงจุดที่จะเป็น center ตามตัวอย่าง จึ้ก!

กด Alt พร้อมลาก แบบนี้

เสร็จแล้วกด Ctrl+C, Ctrl+D ไปเรื่อยๆจนครบรอบเป็นวงกลม

ใส่ bg สีลงไป เอาสามเหลี่ยมที่ทำมาวาง จะดูออกเป็นเส้นรัศมีแล้ว!

มีพลังงงง
ใช้ Node.js วนลูป Callback แบบเรียงลำดับด้วย “async” Library by kunuch
Apr0
ในบทความนี้จะพูดถึงการใช้งาน Node.js ในการวนลูป Callback ของการทำงานกับ Array ตามลำดับแบบ Synchronous ซี่งต่อจากนี้ไปจะขออธิบายปัญหาต่างๆ เป็นสถานการณ์ตัวอย่างครับ
สมมุติมี Array ชื่อ activities เก็บข้อมูล Object ดังนี้
var activities = [
{ title: “Raising my hand”, time: 1000 },
{ title: “Crying in the rain”, time: 5000 },
{ title: “Spinning my head”, time: 2000 },
];
สิ่งที่จะทำคือต้องการให้ทำกิจกรรมต่างๆ ตาม [title] ในช่วงเวลา [time] milliseconds ให้ครบทั้ง Array ซึ่งคุณสามารถเขียน Loop เพื่อวนทำกิจกรรมง่ายๆ ได้ดังนี้
for(var i = 0; i < activities.length; i++) {
(function(){
var title = activities[i].title;
var time = activities[i].time;
console.log(”+ ” + title + ” for ” + time/1000 + ” second(s)”);
setTimeout(function(){
console.log(”- ” + title + ” completed!”);
}, time);
})();
}
จากโค้ดก็ไม่มีอะไรมาก เป็นเพียงการวนลูป setTimeOut ทำกิจกรรมตามเวลาของแต่ละกิจกรรม
ซึ่งเมื่อรันโค้ดดังกล่าว ผลลัพธ์ที่ได้คือ
+ Raising hand for 1 second(s)
+ Crying in the rain for 5 second(s)
+ Spinning head for 2 second(s)
- Raising my hand completed!
- Spinning my head completed!
- Crying in the rain completed!
สังเกตว่า การทำ Raising hand, Crying in the rain, Spinning head นั้นจะเริ่มทำพร้อมกันไปเลย เมื่อตัวไหนทำเสร็จก่อนก็จะเข้าสู่ Callback Function และรายงานผลว่าเสร็จแล้ว ซึ่งการทำแบบนี้เป็นวิธีการแบบ Asynchronous ตามแบบฉบับของ Node.js ที่ใช้ Javascript เป็นฐานอยู่แล้ว
แต่ในบางครั้ง เราต้องการผลลัพธ์ที่มีการกระทำตามลำดับทีละรายการ เช่น จากตัวอย่างด้านบนเราต้องการ Raising hand 1 วินาทีให้จบก่อน จากนั้นค่อย Crying in the rain 5 วินาที หลังจากนั้นค่อย Spinning Head อีก 2 วินาทีตามลำดับ จึงต้องมีการจัดลำดับ ให้ทำงานเป็น Synchronous ให้ได้ (ร้องไห้ไป หมุนหัวไป ยกมือไปพร้อมกันคงพิลึก)
ซึ่งถ้าเขียนตามปกติก็จะต้องเขียนโค้ดให้มีหลักการคร่าวๆ ประมาณดังนี้
console.log("+ Raising my hand for 1 second(s)");
setTimeout(function(){
console.log(”- Raising my hand completed!”);
console.log(”+ Crying in the rain for 5 second(s)”);
setTimeout(function(){
console.log(”- Crying in the rain completed!”);
console.log(”+ Spinning my head for 2 second(s)”);
setTimeout(function(){
console.log(”- Spinning my head completed!”);
}, 2000);
}, 5000);
}, 1000);
ผลลัพธ์ที่ได้
+ Raising my hand for 1 second(s)
- Raising my hand completed!
+ Crying in the rain for 5 second(s)
- Crying in the rain completed!
+ Spinning my head for 2 second(s)
- Spinning my head completed!
จะเห็นว่าผลลัพธ์ถูกต้องทุกประการ ทำตามลำดับอย่างดี แต่น่าเสียดายที่ตัวอย่างข้างต้นเป็นเพียงหลักการที่มีจำนวนชั้นของ Callback คงที่ ไม่สามารถนำไปใช้จริงกับ Array “ativities” ในตัวอย่างได้ เพราะเป็นไปไม่ได้เลยที่เราจะวนลูปเรียก Callback ในแต่ละสมาชิกของ Array ไปเรื่อยๆ จนกว่าจะครบทุกสมาชิกใน Array
วิธีการแก้ปัญหาอาจมีอยู่มากมาย แต่ในบทความนี้ขอนำเสนอคำสั่ง async.eachSeries() ซึ่งเป็นคำสั่งหนึ่งที่อยู่ใน Library ยอดนิยม “async” และมีรูปแบบการใช้งานที่ไม่ยุ่งยากมากนัก วิธีการใช้งาน ในขั้นตอนแรกจำเป็นต้องมี Library “async” เสียก่อน สามารถติดตั้งได้โดยพิมพ์คำสั่งด้านล่างใน Directory ที่ต้องการบนหน้าจอ Terminal หรือ Command Line
npm install async
และมีการใช้งานดังนี้
async.eachSeries(arr, iterator, callback);
โดย
- array: Array ที่ต้องการท่องเข้าไป
- iterator: ฟังก์ชันการทำงานที่ต้องการ
- callback: สิ่งที่จะทำหลังจากการท่องไปยัง Array เสร็จสิ้นแล้ว
จากปัญหาที่กล่าวมา สามารถเขียนโค้ดได้ดังนี้
async.eachSeries(activities, function(activity, next)
{
var title = activity.title;
var time = activity.time;
console.log(”+ ” + title + ” for ” + time/1000 + ” second(s)!”);
setTimeout(function(){
console.log(”- ” + title + ” completed!”);
next();
}, time);
}, function(){
console.log(”= All completed!”);
});
จากตัวอย่างจะมีโค้ดที่คล้ายคลึงกับตัวอย่างแรกสุด แต่สิ่งที่ต้องมีในของ iterator มีดังนี้
- พารามิเตอร์แรก (activity) เป็นพารามิเตอร์ที่เป็นตัวแทนของสมาชิกแต่ละตัวของ Array (ในที่นี้หมายถึงสมาชิกแต่ละตัวของ Array activitities)
- พารามิเตอร์ที่สอง (next) เป็นพารามิเตอร์ที่เป็นฟังก์ชัน เพื่อนำไปเรียกใช้อ้างอิง Callback ของสมาชิกใน Array ตัวถัดไป
- การเรียกใช้พารามิเตอร์ที่สอง (การใช้ next()) เป็นการบ่งบอกว่าจะไปเรียก Callback ของสมาชิกใน Array ตัวถัดไปแล้ว
เมื่อลองรันดู ผลลัพธ์ที่ได้คือ
+ Raising my hand for 1 second(s)!
- Raising my hand completed!
+ Crying in the rain for 5 second(s)!
- Crying in the rain completed!
+ Spinning my head for 2 second(s)!
- Spinning my head completed!
= All completed!
ซึ่งผลลัพธ์สามารถใช้งานร่วมกับ Array และตอบปัญหาของบทความนี้ได้แล้ว นั่นคือ Raising hand 1 วินาทีให้จบก่อน จากนั้นค่อย Crying in the rain 5 วินาที หลังจากนั้นค่อย Spinning Head อีก 2 วินาทีตามลำดับ
สามารถเข้าไปดูรายละเอียดการใช้งานและลูกเล่นอื่นๆ เพิ่มเติมได้ที่ https://github.com/caolan/async
