ใช้คำสั่ง screen ใน linux อย่างไร? by heha

30
Apr
0

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

30
Apr
0

ในการใช้งานของ 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

31
Mar
0

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

จบละครับ :)

วิธีการสกรอล์(หมุนลูกกลิ้ง)เมาส์แล้วทำให้ข้อมูลใน Flash เลื่อนโดยที่ไม่เลื่อนหน้าจอ Web by Ziah

28
Feb
0

วันนี้จะมาสอนวิธีการสกรอล์(หมุนลูกกลิ้ง)เมาส์แล้วทำให้ข้อมูลใน Flash เลื่อนโดยที่ไม่เลื่อนหน้าจอ Web ไปด้วยครับ แบ่งเป็นสองส่วนหลักๆละกัน เริ่มที่ส่วนแรกก่อนการสกรอล์เมาส์แล้วทำให้ข้อมูลของเราเลื่อน

scroll1

Scroll ตัวอย่าง

โค้ดส่วนที่เป็น mxml หรือแท็กของ Flex //ส่วนของขอบเขตการแสดงผลของ List ของเรา เราทำการใส่ MouseEvent mouseWheel เข้าไปเพื่อรับ Event การกลิ้งเมาส์ ซึ่งจะเรียกใช้ฟังก์ชั่นในย่อหน้าถัดไป //List ที่อยู่ด้านใน

ต่อไปเป็นโค้ดในส่วนของ as3 ที่จะถูกเรียกฟังก์ชั่น wheelRoomprivate function wheelRoom(event:MouseEvent):void{ scrollerRoom.value -= (event.delta>0 ? 20 : -20); //จากด้านบนค่า event.delta จะมีค่าตามขนาดที่เรากลิ้งเมาส์ กลิ้งลงเป็น ค่า+ กลิ้งขึ้นเป็นค่า- เราจึงนำค่าดังกล่าวมากลับบวกลบแล้วไปตั้งค่า value ของ ScrollBar ของเราซึ่งจะมีผลให้ข้อมูลของเราเลื่อนตามไปด้วย ซึ่งเรากำหนดให้เลื่อนได้ใกล้ไกลตามใจชอบจากตัวอย่างจะใช้ 20 และ -20 }

เท่านี้ถ้าเราสกรอล์ที่ข้อมูลของเรา ข้อมูลก็จะเลื่อนตามแล้วล่ะครับ

โดนเลื่อนลงมาด้วย

โดนเลื่อนลงมาด้วย

ทีนี้ปัญหาถัดมาคือเวลาเราสกรอล์หน้า Web จะถูกเลื่อนขึ้นลงตามด้วยเพราะ Html มีการรับค่า Scroll อยู่แล้วเราจึงต้องทำการดักไว้ ซึ่งผมได้ใช้ class ที่มีชึ่อว่า MouseWheelTrap สามารถดาวน์โหลดได้จากที่นี่ครับ http://www.spikything.com/blog/index.php/2009/11/27/stop-simultaneous-flash-browser-scrolling/ ให้เราทำการ import ให้เรียบร้อยในหน้า Main ของเราจากนั้นก็ทำการตั้งค่าเล็กน้อยดังนี้ครับ

ในแท็ก ใส่ eventดังนี้ addedToStage=”stretchHandler()”>
แล้วเราก็นำฟังก์ชั่นด้านล่างไปใส่ในแท็ก Script ของ Main ของเราเท่านี้ก็ใช้ได้แล้วครับ private function stretchHandler():void{ stage.scaleMode = StageScaleMode.SHOW_ALL; stage.align = StageAlign.TOP; this.width = stage.stageWidth; this.height = stage.stageHeight; }

MongoDB Cheat list และขั้นตอนการทำ Replication by heha

28
Feb
0

สรุปคำสั่ง 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 หรือตัวหลอกแทนได้) ขั้นตอนมีดังนี้

  1. Edit /etc/mongodb.conf ด้วยโปรแกรมที่ถนัด
  2. กำหนด replSet = <ชื่อกลุ่มที่ต้องการ> ในที่นี้ผมตั้งว่า rs0
  3. restart mongodb
  4. ทำข้อ 1-3 ใหม่กับเครื่องที่จะเป็น Slave ทุกเครื่อง
  5. เข้าเครื่องที่จะให้เป็น Master (สมมติว่า ip ภายในของเครื่อง master คือ 10.0.0.1) แล้วพิมพ์ mongo 10.0.0.1 (สำคัญมาก ห้ามลืมพิมพ์ ip หรือพิมพ์ผิดเด็ดขาด ไม่อย่างนั้นจะใช้ไม่ได้)
  6. ถ้าหน้าจอปรากฏดังนี้แสดงว่าทำได้ถูกต้อง mongo 10.0.0.1 MongoDB shell version: 2.2.2 connecting to: 10.0.0.1/test rs0:PRIMARY>
  7. สั่ง rs.initiate()
  8. สั่ง rs.add(”10.0.0.2“) (สมมติเครื่อง slave ip 10.0.0.2) และเครื่อง slave เครื่องอื่นๆ
  9. เสร็จ!

สรุปคำสั่ง 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 :D