Spinup หมุนมันขึ้นไป

หลังจากได้ training agile ที่ sipa จาก คุณจั้ว แล้วรู้สึกว่า spinup มีประโยชน์มากจึงนำมาเผยแพร่ดังนี้ครับ

spinup คืออะไร
คือการหมุนจากช้าไปเร็วครับเหมือนกับ harddisk หมุนๆ
เปรียบเทียบกับการทำงานแล้วก็คือการทำงานสำเร็จจากสิ่งเล็กๆและเริ่มงานทีใหญ่ขึ้นเช่นลูกหิมะที่ตกจากที่สูง
มันก็เริ่มจากก้อนเล็กๆและโตขึ้นเรื่อยๆ
1 งานเล็ก
2 ทำสำเร็จ
3 งานใหม่มาด้วย challenge ที่ใหญ่ขึ้น
4 สำเร็จ
5 งานใหม่มาด้วย challenge ที่ใหญ่ขึ้น
6 สำเร็จ

เปรียบเทียบกับ Spindown
1 งานเล็ก
2 ทำไม่สำเร็จ
3 งานใหม่มาด้วย challenge ที่เล็กลง
4 ทำไม่สำเร็จ
5 งานใหม่มาด้วย challenge ที่เล็กลง
6 ทำไม่สำเร็จ

จะเห็นได้ว่าความแตกต่างกันระหว่าง SpinUp และ SpinDown นั้นตรงที่ งานเล็กที่เท่ากันหากทำไม่สำเร็จจะเกิดความท้อและจับงานที่เล็กลง
ความสามารถอาจเท่ากันแต่ความแตกต่างกันอาจอยู่ที่ ซ็อกโกแล็ตชิพและลูกเกต ดังตัวอย่างต่อไปนี้

มีการทดสอบจากมีเด็กนักเรียน 2 กลุ่ม
กลุ่มแรกให้ทานซ็อกโกแล็ตชิพ
กลุ่มที่สองให้ทานลูกเกต

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

ผลปรากฏว่านักเรียนกลุ่มที่สองล้มเลิกความตั้งใจในเวลา 15 นาทีส่วนกลุ่มแรกล้มเลิกความตั้งใจในเวลา 30 นาที
ความแตกต่างของคน 2 คนคนแรกเป็น CEO ส่วนอีกคนเป็น พนักงานบริษัท นั้น
เริ่มจากสิ่งเล็กๆที่มองข้ามไปก็เป็นได้

กลับมาเรื่อง spinup มีอะไรบ้างที่เป็น spinup ผมขอยกตัวอย่างดังนี้
การได้ยูโดสายดำ นั้นไม่ใช่เรื่องงาน แต่ทุกอย่างเริ่มจากการเอาชนะคู่ต่อสู้เล็กๆและเกิดความมั่นใจจึงได้สู้ challenge ที่สูงขึ้นเป็นต้น
การได้เข้าร่วม Team Football ระดับเขตได้ ก็ต้องเริ่มจากการแข่งสนามข้างโรงเรียนทั่วไป
การซื้อมือถือที่เดิมทีซึ้อยี่ห้อนี้ spec นี้ตัวต่อไปที่ซื้อมันย่อมต้องอยากได้ของที่ดีกว่าเดิม

Spinup มันอยู่กับชีวิตของเรามาโดยตลอดทุกๆอย่างที่เราประสบความสำเร็จเริ่มจากสิ่งเล็กๆเสมอ

เริ่มฝึกผน Spinup
แนวทางของ Spinup นั้นสำหรับผมต้องเนริ่มจากสิ่งเล็กๆและประสพความสำเร็จก่อนเช่นเจองาน project ใหญ่มา project นึงใช้เวลาทำ
1 ปี สิ่งแรกคือเอามาแตก task ย่อยและดูว่าอันใหนมันง่าย(ไม่ที่สุดนะครับ) เอาให้ยากพอหรือน้อยกว่า challenge ของเรานิดหนึ่ง
ส่วนมากน้อยเราจะรู้สึกได้ครับ เพราะหากน้อยมากมันไม่อยากทำ และยากมากๆ หากเราทำไม่ได้เราจะท้อและงานนั้นอาจ fail เป็น spindown
ก็ได้
หลังจากทำงานเล็กชิ้นนั้นเสร็จแล้วเราจึงจับงานที่ใกล้เคียงกันและให้มันยากขึ้นทีละนิดครับ

มีเพื่อนๆและน้องๆใน Office หลายท่านอยากเขียน PHP เป็นผมคิดไม่ออกว่าจะสอนระยะสั้นอย่างไร เพราะสอนแล้วหากไม่ใช้งานความ
ชำนาญก็จะไม่เกิด เมื่อผมคิดถึง Spinup ของคุณจั้วแล้วทำให้ผมคิดได้ว่า ควรจะให้เริ่มจากสิ่งเล็กๆและใหญ่ขึ้นเรื่อยๆ
เมื่อก่อนเคยสอน php ไม่เป็นอ่าวเลยครับ เพราะสอนแบบไปตามที่ตนเองอยากสอน สิ่งที่ได้คือผู้เรียนเกิดความเบื่อหน่าย เพราะเราไม่ได้เริ่มจากสิ่ง
ง่ายก่อนและไม่ได้มอบความสำเร็จให้กับผู้เรียนทุกๆ section ซึ่งมีประโยชน์มากครับ

หลังจากสำเร็จแล้วทำอะไรต่อ
เมื่อเราทำงานอะไรเสร็จแล้วเราอย่าลืมคิดในใจว่า เราทำได้แล้ว
เราสำเร็จแล้ว ทำไมเมื่อก่อนทำไม่ได้ฟระ อะไรประมาณนี้ และอย่าลืมฉลองเล็กๆด้วยการดื่มน้ำเย็นๆเพื่อเป็นการ celebrate และ post ความ
สำเร็จของเราลงใน forum เพื่อสร้าง Checkpoint สำหรับ challenge ของเราว่าเราทำได้แล้วนะ

Spinup กับ Positive thinking
ผมว่ามันค่อนข้างสัมพันธ์กันครับ การ spin up เราต้องมอบ + ให้กับความคิดของเราเสมอแม้งานเล็กๆเราก็ต้องคิด + ว่าเราทำสำเร็จแล้ว
celebrate มันครับไม่ต้องอายใคร อย่าไปคิดว่า งานแค่นี้ก็ดีใจด้วย บ้าป่าววะ แบบนี้ Negative thinking ครับไม่ดี

สุดท้ายแล้ว ผมเคยอ่านหนังสือกินกบตัวนั้นซะซึ่งกล่าวถึง การทำงานที่ใหญ่ๆ หรืองานจำนวน 20% ที่ให้ผลลัพธ์มากๆ ก่อนซึ่งเมื่อก่อนผม
อ่านแล้วได้กำลังใจมาก กลับมาตอนนี้ผมกลับคิดว่า เราต้องทำงานเล็กๆก่อนครับ ในมิติของอารมณ์นั้นหนังสือไม่ได้คำนิงถึงซึ้่งหาก
งานใหญ่เกินไป แล้วเราทำไม่สำเร็จ เราจะไม่อยากจับงานนี้อีกเลยครับ วันใดเราตี dotA แพ้วันนั้นเราจะทำงานไม่ได้เลยครับ เรื่องอารฒณ์
เป็นสิ่งสำคัญในการทำงาน อย่าทำให้อารมณ์เศร้าหมองนะครับ

หากต้องการทำอะไรนึกเข้าไว้ครับ Spinup Spinup Spinup แล้วชีวิตจะดีขึ้นครับ

ขอบคุณที่พยายามอ่านถึงบรรทัดสุดท้ายครับผม 5555 ()

ตัวอย่าง extjs + combo แบบเขียนห่วยมากครับ

จากโจทย์ของเพื่อนน้องแจ้งว่าต้องการดังนี้ครับ

1. dropdown แรก คลิก เลือก แล้วให้ dropdown ที่ 2  เป็น subของ dropdown แรก  (ผมให้ชื่อ d1)
2. เลือก dropdown 2 (sub ผมให้ชื่อเป็น d2) แล้ว ที่ช่องกรอกตัวเลข (ผมให้ชื่อเป็น t1)
3. พอใส่ตัวเลขจะ แสดงค่า ID ในช่องสุดท้าย(ผมให้ชื่อเป็น t2) ว่า ค่าที่กรอกอยู่ range ใหน เช่น
d1 = asus
d2 = mb
t1 =  100
t2 = จะแสดงค่าเป็น 12 เป็นต้น

หรือ
d1 = asus
d2 = mb
t1 = 250
t2 = จะแสดงค่าเป็น 13 เป็นต้น

หรือ
d1 = lenovo
d2 = nb
t1 = 250
t2 = จะแสดงค่าเป็น 15 เป็นต้น

คร่าวๆครับ

file มี 3 file ครับดังนี้
 
index.html file นี้ include อย่างเดียวครับ







 
 


file MainPanel.js เป็นส่วนของการแสดงผล extjs ครับ

Ext.namespace('top');
Ext.onReady(function() {
	
	var brand_store = new Ext.data.JsonStore({
	    // store configs
	    autoDestroy: true,
	    url: 'json.php',
	    baseParams:{
			action:'getbrand'
		},
	    storeId: 'brand_store',
	    autoLoad:true,
	    root: 'docs',
	    fields: ['brand']
	});
	
	var cs_store = new Ext.data.JsonStore({
	    // store configs
	    autoDestroy: true,
	    url: 'json.php',
	    baseParams:{
			action:'getCSfromBrand',
			brand: ''
		},
	    storeId: 'cs_store',
	    autoLoad:false,
	    root: 'docs',
	    fields: ['cs']
	});	

    var panel = new Ext.Panel({
            renderTo : 'main_panel',
            title: 'Store',
            items:[{
				xtype:'combo',
				id:'brand_combo',
				fieldLabel:'Brand',
				typeAhead: true,
				triggerAction: 'all',
				lazyRender:true,
				mode: 'local',
				listEmptyText:'Empty',
				store: brand_store,
				valueField: 'brand',
				displayField: 'brand',
				listeners:{
            		beforeselect : function (mycombo, record,index ){
            			//var a = mycombo;
            			var brand = record.data.brand;
            			cs_store.reload({
            			    // store configs
            			    autoDestroy: true,
            			    url: 'json.php',
            			    params:{
            					action:'getCSfromBrand',
            					brand: brand
            				},
            			    storeId: 'cs_store',
            			    autoLoad:false,
            			    root: 'docs',
            			    fields: ['cs']
            			});
            			//alert(brand); 
            		}
            	}
	    	},{
				xtype:'combo',
				id:'cs_combo',
				fieldLabel:'CS',
				typeAhead: true,
				triggerAction: 'all',
				lazyRender:true,
				mode: 'local',
				listEmptyText:'Empty',
				store: cs_store,
				valueField: 'cs',
				displayField: 'cs'
	    	},{
	    		xtype:'textfield',
	    		fieldLabel:'qty',
	    		enableKeyEvents : true,
	    		listeners:{

	    			keyup : function ( cmp, e ){
	    				newvalue = cmp.getValue();
	    				cs_val = Ext.getCmp('cs_combo').getValue();
			    		Ext.Ajax.request({
			    		    url: 'json.php',
			    		    params: { 
			    				action: 'get_qty_t',
			    				value:newvalue,
			    				cs:cs_val
			    			},
			    		    success: function (response, opts){
			    				result = response.responseText;
			    				Ext.getCmp('qty_t').setValue(result);
			    		     }
			    		});
	    			}
	    		}
	    	},{
	    		xtype:'textfield',
	    		fieldLabel:'qty_t',
	    		id:'qty_t'
	    	}]
     });
    
    
    
});

file สุดท้ายคือ json.php สำหรับ ให้ ajax ดึงมาแสดงผล หรือ query mysql ด้วย pdo ครับ

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$action = $_POST["action"];
if(!$action){
	throw new Exception("Not found argv action");
}

switch($action){
	case "getbrand":
		$sql = "select `brand` from `brand_cs` group by `brand`";
		$results = $pdo->query($sql);
		$text = "";
		foreach($results as $v){
			if($text){
				$text .= ",";
			}
			$text .= "{'brand':'{$v['brand']}'}";
		}
		$docs = "{'docs':[$text]}";
		echo $docs;
	break;
	case "getCSfromBrand":
		if(!$_POST['brand']){
			throw new Exception("Not found argv brand");
		}
		$brand = $_POST['brand'];
		$sql = "select `cs` from `brand_cs` where `brand` = '$brand'";
		$results = $pdo->query($sql);
		$text = "";
		foreach($results as $v){
			if($text){
				$text .= ",";
			}
			$text .= "{'cs':'{$v['cs']}'}";
		}
		$docs = "{'docs':[$text]}";		
		echo $docs;
	break;
	case "get_qty_t":
		if(!$_POST['value'] || !$_POST['cs']){
			break;
			//throw new Exception("Not found argv value || cs"); 
		}
		$value = $_POST['value'];
		$cs = $_POST['cs']; 
		$sql = "select `qty_t` from `product_sample` where max_g >= $value and min_g <= $value and n1 = '$cs'";
		//echo $sql."\n";
		$results = $pdo->query($sql);
		foreach($results as $v){
			if($v){
				echo $v['qty_t'];
				break;
			}
		};
	break;
}

?>

การทำงานดังภาพครับ
สิ่งที่น่าสนใจจะเป็น MainPanel.js ซึ่งเขียนยังมั่วๆอยู่ครับ แต่พอเอาไปใช้สำหรับดูการใช้งานได้ครับ

ขั้นตอนการติดตั้ง phpvirtualbox บน linux ครับ

เริ่มกันเลยครับ

1. สำหรับผู้ที่ยังไม่ได้ทำการติดตั้ง virtual box ที่เครื่อง desktop สามารถ download ได้ที่นี่ครับ

https://www.virtualbox.org/wiki/Linux_Downloads

2.  แก้ไข  /etc/group โดยเพิ่ม user ลงไปใน group vboxusers

vi /etc/group

แก้ vboxusers โดยเพิ่ม ชื่อ user ลงไป(user ของ desktop น่ะครับ)

vboxusers:!:1000:admin

และ save)

3. ให้ทำการ download phpvirtualbox จาก link นี้ครับ

http://code.google.com/p/phpvirtualbox/downloads/list

เลือกตัวล่าสุดเลยครับ

4.   unzip และนำไปวางไว้ที่ root path ของ html ครับผมเช่น /srv/www/htdocs หรือ /var/www/html/ เป็นต้นครับ

5. rename เสียหน่อยครับเพื่อให้เข้าได้ง่ายขึ้น

mv /srv/www/htdocs/phpvirtualbox-4.1-7 /srv/www/htdocs/vbox

6.  แก้ไข file config.php

cd /srv/www/htdocs/vbox

cp config.php-example  config.php 

vi config.php

แก้ไข user และ password ให้เป็น user ของ desktop 

 

var $username = ‘admin’;

var $password = ‘admin1234′;

 

เสร็จแล้ว save ครับ

7. ติดตั้ง php-soap ด้วย yum(fedora,cent,redhat) หรือ apt-get(ubuntu) หรือ zypper(opensuse) ครับ search ดูก่อนนะครับว่า package นั้นชื่ออะไร

การ serch ประมาณนี้ครับ yum search soap,apt-cache search soap,zypper search soap ประมาณนี้ครับ

หลังจากเจอ package แล้วชื่อ php5-soap ก็ทำการ install ครับ

 

zypper install php5-soap 

และทำการ restart apache 

/etc/init.d/apache2 restart

 

8. สร้าง global variable ที่ /etc/default

touch /etc/default/virtualbox

vi /etc/default/virtualbox

เพิ่ม สองบรรทัดนี้ครับ

VBOXWEB_USER=root

VBOXWEB_HOST=0.0.0.0

และทำการ save

/etc/init.d/vboxweb-service start

ลองเปิด web ขึ้นมาจะได้หน้าประมาณนี้ครับ

 

9. ยังไม่เสร็จครับเราต้องลง Oracle VM VirtualBox Extension Pack เพื่อให้เปิดให้ เปิด ดู desktop ผ่านหน้า webbrowser หรือ rdp remote เข้มาดูจอได้ครับ

download ได้จากหน้านี้

https://www.virtualbox.org/wiki/Downloads

และ search(ctrl+f) หา extension pack   all platforms หายากนิดนึงครับ ซ่อนๆอยู่

และ download มาและ install ด้วยคำสั่ง

vboxmanage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.1.12-77245.vbox-extpack

และ restart vboxweb-service

/etc/init.d/vboxweb-service restart

 

เสร็จแล้วครับผม

 

 

แปลง byte เป็น KB MB GB TB

script php แปลง byte เป็น KB MB GB TB

เขียนไว้ใช้ภายหลังครับ

        //conv to TB
        $iso = array("KB","MB","GB","TB");
        $i = 0;
        do{
            $limit = $limit/1024;
            $limit = sprintf("%.2d",$limit);
            $i++;
        }while(($limit > 1024 &&  $i < 3));
        $limit = $limit.$iso[$i];

หมุนๆโปรดคอย (extjs)

การทำให้ extjs หมุนๆ เวลาไปเรียก ajax แล้วให้หมุนๆรอ
เขียนประมาณนี้ครับ

Ext.Ajax.on('beforerequest',function(){Ext.getBody().mask(loadText, 'loading') ;},Ext.getBody());
Ext.Ajax.on('requestcomplete',Ext.getBody().unmask ,Ext.getBody());
Ext.Ajax.on('requestexception', Ext.getBody().unmask , Ext.getBody());
Ext.Ajax.request({
    url: 'json.php',
    params: { action: 'clearindex'},
    success: function (response, opts){
         b = Ext.decode(response.responseText);
        if(b.responseHeader.status == "0"){
            Ext.Msg.alert("Alert","Clear index data success.");
        }
        //mycmp.setValue(b.format);
     },
});

บรรทัด 1,2,3 เป็นการกำหนดให้หมุนๆแสดง word ว่าอะไร
ส่วนบรรทัดที่ 4 เป็นต้นไปคือการเรียก ajax โดยปรกติได้เลยครับ
ชมภาพประกอบครับ