วิธี remote debugging node.js ด้วย node-inspector by heha

31
May
0

เคยใช้พวก Watch, Breakpoint, Step into, Step Over, Step Out ช่วยในการ debug javascript ใน Chrome ไหมครับ รู้หรือไม่ว่าเราสามารถ remote debug code node.js ไปยังเครื่อง server ที่อยู่คนละที่ได้เลย :) วิธีการมีดังนี้ครับ

  1. npm install -g node-inspector
  2. เพิ่ม debugger; ในบรรทัดที่ต้องการ set breakpoint ภายในโปรแกรม node.js ของเรา
  3. node-inspector –web-port=1338 & (เปลี่ยน 1338 เป็นเลข port ที่คุณต้องการเปิดให้ debug เข้ามาได้ หรือถ้าไม่ใส่จะ default ที่ 8080)
  4. หากโปรแกรมคุณชื่อ server.js สั่งรันดังนี้คือ node –debug node server.js (ห้ามเอา –debug ไปต่อท้าย ต้องอยู่หลัง node เท่านั้น)
  5. เข้าเว็บ http://localhost:1338/debug?port=5858 (แก้ localhost เป็นชื่อเว็บที่คุณใช้งานได้เลย)
  6. จะปรากฎดังรูป พร้อมให้คุณใช้งาน debug!
    node-inspector-google-chrome_2013-05-31_21-19-32
  7. ส่วนที่วงสีแดงไว้ในข้อ 6 คือเราสามารถเปิด browse file ใน project ของเราเพื่อมา set breakpoint เพิ่มสดๆ ด้วยการคลิกที่เลขบรรทัดทางซ้ายได้เลยทันที สะดวกต่อการใส่ breakpoint เฉพาะเวลาที่ต้องการเท่านั้น
  8. สามารถเอาเม้าส์ชี้เพื่อดูค่าตัวแปร, add to watch, step into, step over, step out ได้ครบถ้วน Yay!

ขอให้โชคดีกับ Node.js ทุกๆ ท่าน :D

ใช้คำสั่ง 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 ที่ต้องการได้ ไม่เลวเลยใช่ไหมครับ :)

สรุปเนื้อหางาน 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

จบละครับ :)

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

Submit app Blackberry 10 เข้าไปใน app world ยังไง? by heha

31
Jan
0

เนื่องจากผมได้ไปร่วมงาน Blackberry งานนึงเพื่อน port เกมลง BB10 เมื่อเดือนธันวาคม เลยขอ blog เรื่องนี้ซะหน่อย ซึ่งการจะสร้าง app ใน BB10 นั้นมีอยู่หลายวิธี เช่น

  1. HTML5 - ตัวนี้ใช้ Phonegap หรือเปล่าไม่แน่ใจ
  2. Adobe AIR - เช่นเดียวกับ Mobile OS ตัวอื่นๆ แต่ว่าใครใช้ Stage3D จะแปลงไมได้นะ
  3. Native - เป็น C++ ซึ่งจะสามารถเข้าถึง API แบบ low level ได้ รวมไปถึงการทำ In-app purchase ก็จำเป็นต้องใช้ Native เพราะเค้ายังไม่ทำออกมาให้ support ใน HTML5 และ Adobe AIR ครับ

ส่วนผมใช้ AIR ครับ มาดูกันดีกว่าว่าขั้นตอนการ submit มีอะไรบ้าง

  1. สร้าง vendor account สำหรับเป็นตัวแทนนิติบุคคลในการส่ง app ที่ https://appworld.blackberry.com/isvportal/ ก็กรอกข้อมูลให้ครบถ้วน (ถ้าใครเคยส่ง app BB เวอร์ชั่นอื่นมาก่อนก็ข้ามไปได้เลยครับ) จะมีถามว่าต้องการขาย app (เก็บเงิน) ด้วยไหม ถ้าใช่ก็ต้องกรอกรายละเอียด Paypal account ด้วย
  2. สร้างแล้วต้องรอ verify ครับถึงจะเริ่มใช้งานได้ ผมไม่แน่ใจเรื่องเวลาเพราะตอนนั้นเค้า verify ให้เดี๋ยวนั้นเลย
  3. Login เข้า URL เดิมหลังจากทางนั้นส่ง email มา confirm เรียบร้อย
  4. เลือก Manage Product
  5. Add Product
  6. Step 1 จะเป็นรายละเอียดทั่วๆ ไปได้แก่ชื่อ, SKU (codename ของ app ตั้งอะไรก็ได้เลย ผู้ใช้ไม่เห็น), Category, Rating, License ซึ่งส่วนของ License ถ้าจะทำ Free แต่มี In-app purchase ก็ต้องเลือกเป็น Free ครับ แต่ถ้าจะเปลี่ยนจาก Free เป็น Paid จะเปลี่ยนทีหลังไม่ได้ ต้องระวังด้วย
  7. Step 2
    • Short Description (ห้ามเกิน 50 ตัวอักษร) จะโชว์เมื่อ app เราอยู่ในส่วนแนะนำ
    • Long Description (ห้ามเกิน 1000 ตัวอักษร)
    • keyword (มากสุด 10 keyword)
    • Language ใส่คำบรรยายหลายๆ ภาษาได้
  8. Step 3
    • Product Icon - 480×480 pixel PNG Image
    • Product Featured Image - 1920×1186 pixel PNG image
    • Screenshots - ไม่เกิน 50 รูป, ห้ามเกิน 1280×1280 pixels และเป็น GIF,JPG, PNG
  9. Step 4 เปิดให้ประเทศไหนใช้บ้าง ไม่มีอะไรครับ
  10. เสร็จแล้วอาจสงสัยว่ายังไม่มีให้ submit ตัว app ที่สร้างมาเลยนี่หว่า - -” ยังไม่จบครับ เพราะเราต้องกลับมาหน้า Manage Product ก่อนอีกครั้ง
  11. กดตรงปุ่ม + ใต้ Release เพื่อ upload ตัว app จริงๆ ครับ
    vendor-portal-for-blackberry-worlde284a2-google-chrome_2013-01-31_23-08-26
  12. Next เรื่อยๆ จนมาถึง Step 4 ครับ (ก่อนถึง Step นี้จะมีรายละเอียดปลีกย่อยตามหัวข้ออยู่ ซึ่งสามารถข้ามได้ แต่บางอย่างเช่นการ encrypt, การใช้งาน third party ถ้ามีก็ต้องใส่ครับ) ตรงนี้แหละที่เราจะ upload ไฟล์ .BAR ที่เป็นตัว app ของเราขึ้นไปจริงๆ เสียที กดที่ Batch import file เพื่อ upload แล้วไฟล์จะปรากฎที่ด้านล่าง เราต้องเลือก Platform เป็น QNX, Min OS เป็น 10.0.0 (เราทำลง BB10 นี่!)
  13. Step 5 กรอกรายละเอียดขั้นสุดท้ายเป็นอันเสร็จ ทีนี้ก็ต้องรอ approve ประมาณ 1 อาทิตย์ครับ โชคดี :)