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

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

วิธีการนำรูปที่โหลดมาจากภายนอก Flex มาใช้ซ้ำๆได้ by

30
Apr
0

ปกติแล้วนั้นเวลาเราทำการโหลดรูปจากไฟล์ภายนอก Flex เข้ามาใส่ Image นั้น ตัวรูปจริงๆจะอยู่ใน property ที่ชื่อว่า content ซึ่งเป็น bitmap เมื่อโหลดสำเร็จ ซึ่งถ้าเราเอาตัว content นี้ไปใช้งานเช่น นำไปใส่ container ต่างๆ จากทาง addChild ซึ่งหลังจากนี้ถ้าเรานำตัว content นี้ไปใส่ในที่อื่นๆ รูปจากที่แรกก็จะหายไป วันนี้จะมาเสนอวิธีโคลนรูปที่ได้มาจากภายนอกแบบง่ายๆกันครับ

  • โดยปกติเราจะทำการโหลดรูปจะมีโค้ดเป็นดังนี้

  • //ในส่วนของ ActionScript
    public function init():void{
    var img:Image = new Image;
    img.load(src); //src เป็น string ของ souce path ที่เราโหลดรูป
    img.addEventListener(Event.COMPLETE,loadImgComplete);
    }

    public function loadImgComplete(e:Event):void{
    container1.addChild(e.currentTarget.content); // container เป็นแท็ก swfLoader ด้านล่าง และ e.currentTarget มีค่าเท่ากับ img ที่โหลดมา
    container2.addChild(e.currentTarget.content); // ถ้าเราทำแบบนี้ รูปจาก container ก็จะหายไปซึ่งใช้ไม่ได้
    }

    //ในส่วนของ mxml
    <mx:SWFLoader id='container1'/>
    <mx:SWFLoader id='container2'/>

  • ทีนี้ถ้าเราต้องการจะนำไปโคลนใส่หลายๆที่ก็ให้ใช้ฟังก์ชั่นและวิธีดังต่อไปนี้
  • //ในส่วนของ ActionScript
    /* ทำการเพิ่มฟังก์ชั่นนี้เข้ามา */
    public var imgBitmap:Bitmap; //สร้างตัวแปร bitmap มาเพื่อรองรับ content หลังจากโหลดเสร็จ
    public function cloneBitmap(bmp:Bitmap):Bitmap{
    return new Bitmap(Bitmap(bmp).bitmapData); //ทำการสร้าง bitmap ตัวใหม่มาดึงค่า bitmapData ตัวเก่ามาใส่ซึ่งก็มีค่าเท่ากับการคัดลอกข้อมูลรูปมาใส่ตัวใหม่นั่นเอง
    }

    public function init():void{
    var img:Image = new Image;
    img.load(src);
    img.addEventListener(Event.COMPLETE,loadImgComplete);
    }

    public function loadImgComplete(e:Event):void{
    imgBitmap = e.currentTarget.content; //เก็บ content ไว้ในตัวแปรที่สร้างไว้
    container1.addChild(cloneBitmap(imgBitmap)); //ทำการโคลน bitmap จากตัวแปรที่ได้เก็บ content ไว้มาใส่ไว้ใน container
    container2.addChild(cloneBitmap(imgBitmap)); //ทำการโคลนเช่นกันแต่นำไปไว้ใน container2
    }

    //ในส่วนของ mxml
    <mx:SWFLoader id='container1'/>
    <mx:SWFLoader id='container2'/>

    เท่านี้ผลลัพธ์ของเราก็จะได้รูปภาพทั้งสองที่

    การออกแบบตัวละคร: วิธีการลบ by

    30
    Apr
    0

    จากที่เคยเขียนถึงวิธีการออกแบบตัวละครที่ได้อ่านจากหนังสือเริ่มนี้เมื่อเดือนม.ค.
    การออกแบบตัวละคร: วิธีบวก

    คราวนี้จะมาพูดต่อถึงวิธีถัดไปครับ คือ วิธีการลบ
    วิธีนี้จะว่าง่ายก็ง่าย จะว่ายากก็ยากครับ คือ คอนเซปต์ง่าย แต่ทำจริงต้องอาศัยประสบการณ์กับเซนส์เอาหน่อย

    จากวิธีการบวกที่เคยพูดถึงไปแล้ว ปัญหาที่มักจะเกิดคือ ใส่จนรกเกินไป และหาจุดเด่นของตัวละครนั้นๆไม่ได้ อย่างแย่เลยคือมองไม่ออกว่าไอ้นี่มันตัวอะไรกันแน่วะ

    ดังนั้นวิธีการลบก็คือ เอาของที่ไม่จำเป็นออกไปซะ คงไว้แ่ค่จุดเด่นๆของตัวละครแค่นั้นพอ

    ตัวอย่างจากในหนังสือ


    Catgirl with Glasses

    China Girl

    Angel-winged Girl

    Unit Test เบื้องต้นกับ mocha node.js by

    30
    Apr
    0

    เริ่มต้นก็ขอเกริ่นก่อนนะครับว่า Unit Test คืออะไร สำหรับคนที่ยังไม่รู้นะครับ

    Unit Test คือการทดสอบระบบหรือ function ของเราเองว่ามีการทำงานที่ถูกต้องหรือไม่ ซึ่งมีประโยชน์มากในการทำงาน เพราะถ้าเราเขียนโค้ดเพียงอย่างเดียว อาจจะมี test case บาง case ที่เรายังเขียนไม่ครบ ทำให้เกิด bug หรือทำงานไม่ถูกต้อง เกิด logic error ได้ ตรงจุดนี้ unit test จะช่วย check อีกรอบว่าโค้ดเราถูกต้องหรือไม่ อีกกรณีนึงก็คือ การ test ที่ยากลำบากที่ต้องทำหลายขั้นตอนกว่าจะ check ได้ unit test ก็ช่วยเราได้ โดยเขียนลำดับขั้นตอนตรงนั้นไว้ก่อนได้

    ก็เริ่มต้นนะครับต้อง install unit test ก่อน

    npm install mocha

    จากนั้นต้องสร้าง folder test เอาไว้ก่อนเพราะ mocha จะใช้ได้กับ file ที่อยู่ใน folder test เท่านั้น

    จากนั้นก็เริ่มต้นสร้าง file เขียน unit test กันได้เลย


    var assert = require("assert");

    function sum(a, b){
    return a + b;
    }


    describe('CalculateTest', function(){
    describe('#sum', function(){
    it('3 + 2 = 5', function(){
    assert.equal( 5, sum(3, 2));
    assert.equal( 4, sum(3, 2));
    });
    });
    });

    อธิบายในส่วนของโปรแกรม
    assert เป็น library ที่ต้องใช้ในการเปรียบเทียบ ยกตัวอย่างเช่น
    assert.equal(a,b) ใช้เปรียบเทียบค่าว่าเท่ากันหรือไม่ ถ้าไม่เท่าจะ error
    assert.notequal(a,b) ก็ตรงกันข้ามกับ equal

    ส่วน describe เป็นเหมือนที่กำหนดว่าเราจะ test ไฟล์อะไร และ test function อะไร เหมือนเอาไว้บอกเราเฉยๆ ไม่ได้ผูกกับ function
    นั้นโดยตรง

    it เป็นตัวบอกว่าเราจะ test เทสเคสอะไร แล้วผลลัพธ์ที่ได้เป็นอะไร เขียนไว้เพื่อความเข้าใจ ควรเขียนนะครับ มิงั้นอาจลืมเลือนได้ว่าทำไรไว้ และก็ทุกอย่างควรจะเอาไว้ใน it นะครับเพราะ it จะรันสุดท้ายเสมอไม่ได้รันเรียงกันแบบ synchronous

    จากนั้นก็จะ check ตรง assert ถ้าถูกทั้งหมดก็ผ่าน แต่ผิดซักอันนึงก็จะแสดง error ขึ้นมา
    จากโค้ดตัวอย่าง

    unit test

    unit test

    จะบึ้มลองเอาโค้ดด้านล่างนี้ออก
    assert.equal( 4, sum(3, 2));
    ออกจะได้แบบนี้ครับ

    test ผ่าน

    test ผ่าน

    ด้านบนนี่เป็นแบบธรรมดาครับ ถ้าเป็นแบบที่ต้อง test แบบ asynchronous จะต้องมี function callback ด้วย และวางไว้ตำแหน่งที่เทสเคสนั้นทำจบแล้ว ประมาณ code ด้านล่างครับ


    describe('#CreateRoomToServer()', function(){
    var data = {};
    var counter = 3;

    it('should have Tom's room and increase the room counter', function(done){
    Room.Room({ roomid: 1, roomname: 'monica'}, function(){
    Room.Room({ roomid: 2, roomname: 'Bukkak'}, function(){
    data.roomname = 'Tom';
    Room.CreateRoomToServer( data, socket, counter, function(counter){
    Redis_Client.hgetall("room:" + 3 + ":data", function(err, obj) {
    Client.GetClient(Redis_Client, socket_test.id, function(reply){
    assert.equal('Tom', obj.roomname);
    assert.equal(3, reply.roomid);
    assert.equal(4, counter);
    done();
    });
    });
    });
    });
    });
    });
    });

    สังเกตว่าเราจะเอา done() ไว้จุดในสุด
    เรื่อง unit test กับการใช้ mocha ก็ประมาณนี้ครับ

    การทำ callback หลังจบลูป by

    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});

    กู้เงิน | เศรษฐกิจพอเพียง | สินเชื่อบุคคล | สมัครบัตรกดเงินสด | สินเชื่อ | เงินกู้ด่วน | ยืมเงินทรูมูฟ | เงินด่วนนอกระบบ