ใช้คำสั่ง 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 ที่ต้องการได้ ไม่เลวเลยใช่ไหมครับ
การทำ 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});
สรุปเนื้อหางาน Bug Day Bangkok 2013 by heha
Mar0
Openning Session
- ฟังทีมงาน CP โม้ว่ากำลังวิจัยหุ่นยนต์ จะเอาไปใช้งานใน 7-Eleven 7000 สาขา
- ชอบมาก Case Study จากอเมริกาที่ว่า “วางขวดเบียร์ข้างๆ ผ้าอ้อมแล้วยอดขายเพิ่มขึ้น 50%” เหตุเพราะผัวโดนเมียใช้ให้ไปซื้อผ้าอ้อม แต่ผู้ชายไม่มีเซ้นเรื่องซื้อของ เห็นอะไรใกล้มือกูหยิบแล้วรีบจากไปทันที(ผ้าอ้อมแบบแพงสุดเลยนะเออ) เพราะกูจะรีบไปกินเบียร์!!!
Fix UX Bug - Rawitat Pulam (Silapakorn University)
- มี OS บางตัวที่เราต้องกด Start เพื่อสั่ง Shutdown (คุ้นๆ ไหม?)
- การจะสร้างอะไรขึ้นมาซักอย่าง ต้องทำตามฐานความต้องการ user ไม่ใช่ความต้องการผู้สร้าง
- จะสร้างอะไรซักอย่าง ได้ถามเค้ารึยังว่าเค้าทำไปให้ใครใช้?
- หากมีความจำเป็นต้องเปลี่ยน UI จริงๆ เราควรจะคงความเคยชินของผู้ใช้ไว้บ้าง เช่น คงรูปๆ เดิม คงตำแหน่งๆ เดิม คงคำพูดแบบเดิม เพื่อให้ user ที่เคยชินแบบเก่ามีเวลาปรับตัวเข้ากับ UI ใหม่ได้ทัน ไม่ใช่หักดิบ ไม่เหมือนเดิมเลยแม้แต่น้อย
- ถ้าต้องเลือกระหว่างแก้ UI ที่ชวนเข้าใจผิด (เช่นกด start เพื่อสั่ง shutdown) ให้เป็นแบบใหม่ กับการสละเอาความเคยชินผู้ใช้เดิมจนชินแล้ว สุดท้ายต้องถามก่อนว่าฐานลูกค้าส่วนไหนสำคัญกว่ากัน
- UX ที่ดีต้องเกิดจากการใช้งานจริงของผู้ใช้ เป็นที่มาว่าทำไมเราต้องทำ TDD
Using TDD to understand legacy code - Dr.Suradet Jitprapaikulsarn (Naresuan University)
- เป็นปรมาจารย์ด้าน TDD คนแรกๆ ของประเทศไทย ที่สอน TDD ให้กับนักศึกษาตั้งแต่ปีหนึ่ง!!
- หัวใจสำคัญข้อแรกของการทำคือ “เขียนโค้ดใหม่เมื่อ test fail เท่านั้น” (Write new code only if a test has failed) - Kent Beck
- ข้อสอง “จัดการโค้ดส่วนที่ซ้ำซ้อนให้หมดไปซะ” (Get rid of duplication) - Kent Beck
- หนังสือที่น่าสนใจ:
- K.Beck, Test-Driven Development by Example, Addison-Wesley, 2003
- M. Features, Working Effectively with Legacy Code, Prentice Hall, 2004 (เป็นภาษา Python และมี legacy code ที่ bug เกิดจาก syntax ผิดด้วย - -”)
- ใครว่า test ui ไม่ได้ test ได้แค่มันยากกกก เช่น บริษัทแห่งหนึ่งทำเว็บให้บริษัทขายยา 2 แห่งที่เป็นคู่แข่งกัน core code เหมือนกัน เปลี่ยนแค่ template แต่เสือกสลับ template ผิด ทำให้บริษัทขายยาเข้าใจว่าบริษัทขายยาคู่แข่งไปขโมยข้อมูลของตนมา เรื่องราวโดนฟ้องร้องใหญ่โต
Test Driven Development 3.0 - Twin Panichsombat (Siam Chamnankit)
- BDD คือการมองจากภาพใหญ่ไล่เข้าไปยังจุดเล็กสุด (unit) ตรงข้ามกับ TDD ที่เริ่มจากจุดเล็กสุด (unit-test) ไล่ออกมาข้างนอก
- BDD คือ superset ของ TDD มันคือการทำให้เขียน TDD เป็นเรื่องสนุก
- BDD ยังช่วยให้ Business Analytic อ่าน spec ได้เข้าใจเป็นภาษาคนอีกด้วย ให้ BA มาช่วยเขียน spec ง่ายขึ้นมาก
- การใช้งาน BDD จำเป็นต้องมี tools ที่ design มาเพื่อการนี้โดยเฉพาะ ใช้ tools เดิมแบบตอนเขียน TDD ไม่ได้
- Behal เป็น framework สำหรับใช้งาน BDD ในภาษา PHP
- Rspec สำหรับ Ruby on Rails
Big Data and How to test it - Somkiat Puisungnoen (Siam Chamnankit)
- Big Data ก็คือการทำงานกับข้อมูลเยอะๆ นั่นแหละ มีขนาดตั้งแต่หลาย GB ขึ้นไป ใช้ mySQL query แล้วมันช้า ต้องรอเป็นวัน
- ตัวอย่างการใช้งาน Big Data เช่น Modern Information Infrastructure, Semantic Technology, The Logical Data Warehouse, NoSQL DBMS, In-Memory Computing
- การจัดการกับ Big Data คือการเลือก tools ที่ทำงานเฉพาะทางเข้ามาทำงานแทนแค่บางส่วน ไม่ได้มาแทนที่ mySQL สุดท้ายเราจะยังคงต้องใช้ mySQL อยู่ต่อไป
- ถ้าปริมาณข้อมูลที่ใช้งานปัจจุบัน คุณสามารถใช้งานได้อย่างปกติสุข รวดเร็ว พอใจอยู่แล้ว คุณก็ไม่จำเป็นต้องกระเสือกกระสนที่จะพยายามใช้ tools สำหรับ Big Data ต่างๆ เพ
- กฎที่น่าสนใจของ Big Data คือเราควรต้องดูแลข้อมูลเพียงชุดเดียว เพื่อความง่ายในการจัดการ
- ข้อมูลจะมีค่าเมื่อเวลาผ่านไป ห้ามลบทิ้งถ้าเป็นไปได้
- ซอฟต์แวร์ที่น่าสนใจสำหรับการประมวลผลข้อมูลแบบ Real time: Storm
จบละครับ
MongoDB Cheat list และขั้นตอนการทำ Replication by heha
Feb0
สรุปคำสั่ง mongoDB ที่ใช้บ่อยๆ
- use db1 - ใช้งาน database db1 หรือสร้าง database ใหม่
- show dbs - แสดงรายชื่อ database ทั้งหมด
- db.getCollectionNames() - แสดง collection (ตาราง) ทั้งหมด
- db.createCollection(”users”) - สร้าง collection ชื่อ users
- db.users.drop() - ลบ collection users
- db.createCollection(”new”, {capped:true, size:1073741824}); - สร้าง capped collection ขนาด 1073741824 bytes
- db.logMoney.find({time:{$gte: new Date(2013,2,5)}}); - query date มากกว่าเท่ากับวันที่ๆ กำหนด
- db.logMoney.ensureIndex({’time’:1},{background:true}) - new index field time โดย background ไว้สั่งให้ทำโดยไม่ lock collection
- db.logMoney.find({time:{$gt:new Date(<timestamp in millisecond>)}}) - query ระบุเวลา สามารถใช้ร่วมกับ mongodump ได้
- db.logMoney.aggregate({$match:{time:{$gt:new Date(2013,1,1)},chng:{$lt:0}}},{$group:{_id:{usrId:1, }, count:{$sum:1}, sumAll:{$sum:”$chng”}}}) - ตัวอย่างการใช้งาน query ลักษณะเดียวกับ GROUP BY ใน MySQL
(SELECT *, COUNT(*) as count, SUM(chng) as sumAll FROM logMoney WHERE time > “2013-01-01″ AND chng < 0 GROUP BY usrId)
วิธีทำ Replication
ก่อนอื่น MongoDB แนะนำว่าควรมีเครื่องในวงอย่างน้อย 3 เครื่องครับ (แต่เราอาจจะใช้ 2 เครื่อง แล้วใช้อีกเครื่องเป็น Arbiter หรือตัวหลอกแทนได้) ขั้นตอนมีดังนี้
- Edit /etc/mongodb.conf ด้วยโปรแกรมที่ถนัด
- กำหนด replSet = <ชื่อกลุ่มที่ต้องการ> ในที่นี้ผมตั้งว่า rs0
- restart mongodb
- ทำข้อ 1-3 ใหม่กับเครื่องที่จะเป็น Slave ทุกเครื่อง
- เข้าเครื่องที่จะให้เป็น Master (สมมติว่า ip ภายในของเครื่อง master คือ 10.0.0.1) แล้วพิมพ์ mongo 10.0.0.1 (สำคัญมาก ห้ามลืมพิมพ์ ip หรือพิมพ์ผิดเด็ดขาด ไม่อย่างนั้นจะใช้ไม่ได้)
- ถ้าหน้าจอปรากฏดังนี้แสดงว่าทำได้ถูกต้อง
mongo 10.0.0.1 MongoDB shell version: 2.2.2 connecting to: 10.0.0.1/test rs0:PRIMARY> - สั่ง rs.initiate()
- สั่ง rs.add(”10.0.0.2“) (สมมติเครื่อง slave ip 10.0.0.2) และเครื่อง slave เครื่องอื่นๆ
- เสร็จ!
สรุปคำสั่ง replication ที่ใช้บ่อย
- rs.initiate() - เริ่ม replica set
- rs.status() - status replica set
- rs.add(”ip”) - เพิ่ม secondary node
- rs.addArb(”ip”) - เพิ่ม secondary node แบบตัวหลอกเพื่อโหวตตอน fail-over เท่านั้น ไม่มีข้อมูลจริง
- rs.stepDown() - ถอนตัวจากการเป็น master
- db.printReplicationInfo() - เช็คว่า oplog มีอายุกี่วัน
วิธี Backup MongoDB
เทียบเท่า mysqldump นั่นเอง ตัวอย่างนั้นใช้ dump เฉพาะตารางที่กำหนด และ query ในช่วงเวลาที่กำหนด ดังนี้
mongodump –host <host> –port <port> –db <ชื่อ database> –collection <ชื่อ collection> -q ‘{”time”:{”$gte”:{”$date”:1360627200000}}}’
ขอให้สนุกกับ MongoDB


