Codeigniter Smarty Integration , แบบน่าจะถูกต้อง

โพสท์ในหมวด () โดย ball6847 เมื่อ Tuesday, November 10, 2009

ตายๆๆๆคับ พักนี้ไม่มีเวลาเลยยยย รีบปั่นโปรเจ็คที่ทำอยู่ เจออะไรใหม่ๆก็ศึกษาจนงานเริ่มยืดดด ครบกำหนดส่งแล้วยังไม่เสร็จ - -*

โพสท์ก่อนโน้นนน ผมโพสท์เกี่ยวกับ View Codeigniter คือผมไม่อยากจะเอา Template Engine มาัใช้งานร่วมกับ Codeigniter เลย เพราะผมกลัวว่ามันจะเปลือง memory ลำพัง Codeigniter อย่างเดียวก็เยอะแล้ว ผมเลยใช้ View ของ Codeigniter ไปแบบจำใจ แถมศึกษาเสียเวลา extends Core ของ Codeigniter อีกกว่าจะใช้ views ในแบบของผมได้ แต่ทำยังงัยก็กลับตายรัง กลับมาใช้ Smarty อีกรอบดีกว่า สงสัยชาตินี้จะหนี Smarty ไม่พ้นแล้ว พอไม่ได้ใช้ Smarty ไปพักนึงก็กลับมาทวนความจำหน่อย

โชคดีที่ผมไป extends Core ของ Codeigniter บ่อยจนพอเข้าใจ core ของมันบ้าง แล้ววันนี้ผมก็จะกลับมาใช้ Smarty แทน View แต่ในระหว่างที่กำลังทำการลง Smarty ใน Codeigniter นั้น ผมมองโค้ดเก่าๆเลยรู้สึกว่า "แบบนี้มันไม่ได้ใช้ Smarty แทน View นี่นา"

ในโค้ดเก่าของผมก็คือ สร้าง class ลูก extends Smarty , เซ็ต Smarty Config ใน Contructor , จับใส่โฟลเดอร์ library แล้วก็ load เข้ามาใช้ใน Controller ก็จบ

จริงๆแล้วแบบนี้ก็ถูกแล้วครับ แต่มันไม่ควรจะจบแค่นี้ครับ (หมายถึงถ้าจะพูดว่าใช้ Smarty แทน vew มันไม่ควรจะจบแค่นี้) เพราะถ้าเราทำแค่นี้ output จะไม่ถูกนำไปประมวลผลโดย Output Class ของ Codeigniter , เพราะว่า Loader Class ซึ่งในกรณีนี้มันทำให้หน้า load view แล้วส่ง final output ไปยัง Output Class เพื่อประมวลผลครั้งสุดท้ายอีกที แต่ถ้าเราใช้ Smarty คือ output จะไม่ถูกนำไป final process โดย Output Class

แล้วใน final process ของ output class มันทำอะไร ?

อันนี้เนื่องจากว่าผมต้องการจะแสดง execution time ของสคริปท์ในหน้าเพจ ผมต้องการเวลาที่ใช้ไปตั้งแต่ Benchmark Class ของ Codeigniter เริ่มทำงาน ซึ่ง Class นี้จะเป็น Class แรกใน Codeigniter ที่เริ่มทำงานด้วย และ class นี้จะถูกเรียกอีกครั้งใน Output Class เพื่อเช็คเวลาที่ใช้ไปทั้งหมดตั้งแต่เริ่ม Codeigniter จน final output ถูกส่งไปยัง browser ครับ ผมก็เลยต้องทำการแก้ Class ลูก ที่ผม extends มาจาก Smarty เปลี่ยนจากการ display output ธรรมดาเป็นส่งไปยัง Output Class แทนครับ (การทำงานใน Controller ก็ยังทำงานเหมือนเดิมไม่เปลี่ยนแปลง)

ลองดู CI Smarty ของผมกันครับ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php defined('BASEPATH') or die('Direct Acces Not Allowed');
 
 
// โหลด Smarty
require_once 'smarty/Smarty.class.php';
 
// สร้าง Class ลูก ไว้ใช้ใน Codeigniter
class CI_Smarty extends Smarty {
 
	function CI_Smarty()
	{
		parent::Smarty();
 
		// Smarty Config
		$this->template_dir = ABSPATH . 'application/views';
		$this->compile_dir = SMARTY_DIR . 'templates_c';
		$this->config_dir = SMARTY_DIR . 'configs';
		$this->cache_dir = SMARTY_DIR . 'cache';
 
 
		// จัดการไฟล์ cache และ compiled file เก็บไว้ใน subdirectory
		// เพื่อป้องกันกรณีใช้ multiple template จะทำให้ compile ชนกัน
		$this->use_sub_dirs  = TRUE;
 
 
		// ไม่ค่อยแน่ใจตัวเองเลย ใช้อันนี้ดีป่าวเนี่ย
		$this->left_delimiter = '{!';
		$this->right_delimiter = '}';
 
 
		// โหลด Filter 
		$this->load_filter('output','trimwhitespace');
 
 
		// กำหนดค่า view uri , site_url และ site_domain ไว้ใช้ใน smarty ให้อัตโนมัติ
		$this->assign('view_uri' , ABSURL . 'application/views/');
		$this->assign('site_url' , ABSURL);
		$this->assign('site_domain' , DOMAIN);
 
	}
 
	/**
	 * ไว้เซ็ต base template จะถูก append ต่อจาก $this->template_dir
	 *
	 * @access	public
	 * @param	string	!	ชื่อของโฟลเดอร์เทมเพลท
	 * @return		void
	 **/
	function set_template($template)
	{
		// เปลี่ยนค่า view uri ให้ smarty อัตโนมัติ
		$this->template_dir .= '/' . $template;
		$this->assign('view_uri' , ABSURL . 'application/views/' . $template . '/');
	}
 
 
 
	/**
	 * ปรับปรุงจากคลาสแม่ ให้ส่ง output ไปยัง Output Class ของ Codeigniter แทนการ echo
	 *
	 * @access	public
	 * @param	ดูเพิ่มเติมใน Smarty - [libraries/smarty/Smarty.class.php]
	 * @return		void
	 **/
	function display($resource_name, $cache_id = null, $compile_id = null)
	{
		// ดึง output จาก template
		$output = $this->fetch($resource_name, $cache_id, $compile_id); 
 
		 // เรียก instance ของ codeigniter
		$CI =& get_instance();
 
		// ส่ง output เข้า Output Class ของ CodeIgniter
		$CI->output->append_output($output );
	}
 
 
 
}

เวลาจะแสดง execution time แค่ใส่ {elapsed_time} ลงไป template แค่นั้นเอง กรณีของผมผมใช้ {! ... } เป็น l/r delim เลยไม่มีปัญหา แต่ถ้าใครใช้ default ของ Smarty ให้ใช้ {ldelim}elapsed_time{rdelim} แทนครับผม

oicclip.com กว่าจะได้ใช้

โดย ball6847 เมื่อ Friday, October 9, 2009

หลายเดือนก่อน ผมไปช่วยเพื่อนใน ThaiSEOBoard ท่านหนึ่งโมบอร์ด SMF นิดหน่อย ครั้งนั้นทำให้ผมได้โดเมนฟรีมา 1 โดเมน ชื่อโดเมนว่า oicclip.com แต่ผมก็ไม่รู้จะเอาไปทำเว็บอะไร จริงๆแน่นอนหล่ะว่ามันต้องทำเว็บวิดิโอ ชื่อแบบนี้คงไม่เอาทำเว็บ Social Bookmark หรอกจริงมั้ย แต่ยังงัยซะผมก็ปล่อยโดเมนนี้ว่างๆมาตั้งหลายเดือน จะว่าไปก็เสียดายแต่ด้วยความขี้เกียจ + ไอเดียที่คิดตอนแรกมันเวอร์ไปหน่อยจนทำไม่ไหว

แต่และแล้ววันนึงผมก็นึกออกก็เลยไหนๆแล้วทำซะหน่อย เพราะว่าไม่รู้จะทำอะไรแล้ว ทีแรกว่าจะเอา PHPMelody มาทำ (ของเดิมที่เค้าทำไว้ก็รู้สึกจะ PHPMelody นี่แหละ) กะว่าจะทำเป็นเว็บดูวิดิโอแบบเป็น Series โดยผมจะรวบรวมหาวิดิโอมา add เอง แต่ตอนที่กำลังจะลงนั้น มีน้องคนนึงซึ่งเป็นเจ้าของโฮสท์รายนึง และก็เป็นโฮสท์ที่น้องเค้าให้ผมใช้ฟรีๆ (ซึ่งผมก็ไม่ค่อยจะเอาใช้ประโยชน์เท่าไหร่เหมือนกัน เสียดายแทนมันจริงๆ อุตส่าเอามาให้ใช้) น้องเค้าว่าให้ผมลงอีกสคริปท์นึงดีกว่า ตัวที่แนะนำมาเป็นสคริปท์เว็บวิดิโอตัวนึงที่มีแจกในบอร์ดนั่นแหละ ผมเองก็เคยลอง จากโครงสร้างสคริปท์มันก็เป็นเว็บปั่นดีดีนี่แหละเนื้อหาไม่มีอะไรนอกจากวิดิโอจาก Youtube แต่มันมีดีที่อย่างอื่น บวกกับสคริปท์เดิมๆมันมีปัญหาอยู่บ้าง แต่สคริปท์เล็กๆคับ แก้ไม่หนักเท่าไหร่ก็ใช้ได้แล้ว แก้เสร็จก็โมเพิ่มอีกนิดหน่อยให้เสียวขึ้นอีกนิด อันนี้ต้องขอบคุณน้องเค้าผมอุตส่าให้มันลิสท์รายการที่จะให้แก้ให้โมมาให้เรียบร้อย แล้วผมก็นั่งทำทั้งคืนเลยทีนี้ เพราะเน็ตมันจะหมด ไม่รู้จะได้ใช้อีกเมื่อไหร่ ไม่มีตังเติมด้วย เลยรีบทำให้เสร็จก่อนเช้า (เวนกำแท้ - -*) แต่ก็เสร็จจนได้แหละ

oicclip.com screenshot 2009-10-09

เสร็จสิ้นการปรุงแต่งสคริปท์เดิมจัดการแบ่งปันให้น้อง แล้วก็ลงเองด้วยเลย ไว้ที่เว็บ oicclip.com นี่แหละ แต่เสียดายที่สคริปท์มีข้อเสียอยู่นิดหน่อยที่แก้ไม่ได้คือมันไม่มี description ของวิดิโอมากับรายการด้วย ทำให้หน้าเว็บดูเหมือนสแปมยังงัยก็ไม่รู้ แต่ก็ช่างมันผมไม่แคร์ ฮ่าๆ

จริงๆนะผมพูดจากใจจริงเลย ผมไม่ได้อยากจะป่้าวประกาศให้ใครรู้หรอกหรอกว่าผมทำอะไร ที่มาโพสท์เนี่ย แค่จะเรียกบอทเท่านั้นแหละ ก๊ากๆๆๆๆ ก็ถือโอกาสเพิ่มบทความให้บล็อกด้วยเลย

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

ใช้ Autoit แก้ปัญหาความไม่ปลอดภัยของ Filezilla

โพสท์ในหมวด () โดย ball6847 เมื่อ Thursday, October 8, 2009

เมื่อวันที่ 12 กันยายน (เกือบเดือนที่ผ่านมา ซึ่งเป็นวันเกิดผมเอง) ผมเข้า ThaiSEOBoard แล้วเจอกระทู้นึงที่ว่าถึงเรื่อความปลอดภัยของข้อมูล FTP ของ Filezilla ซึ่งเป็น Opensource FTP Client ยอดฮิตของคนทำเว็บ ซึ่งผมก็ใช้เพราะมันฟรี ไม่ต้องคร้งต้องแครก ไม่ต้องเสียงกับ malware ติดมากะโปรแกรมหรือแครก แต่ Filezilla ก็ช่างย่ามใจเหลือเกินในการเก็บไฟล์ข้อมูล sitemanager ซึ่งมีแต่ข้อมูลของเว็บไซต์ของเราทั้งนั้น ที่สำคัญคือมันเ้ป็นไฟล์ XML ธรรมดานี่เอง เปิดปุ๊บเห็น host , username , password แบบไม่ต้องคิดอะไรมากเลย

ผมเลยคิดวิธีแก้ปัญหานี้มาเล่นโดยใช้ Autoit Script มาช่วยในการซ่อนไฟล์ sitemanager ไปที่ที่เราคิดว่าปลอดภัย ผมโพสท์วิธีและโค้ดไว้ที่ ThaiSEOBoard ผมขอก๊อปปี้เอามาไว้ในบล็อกเลยละกันครับ

ปล. กระทู้ถูกโพสท์ไว้ที่ http://www.thaiseoboard.com/index.php/topic,74659.0.html

===============================

Download AutoIt3 เลือก Full Download ไปเลย แล้วติดตั้งให้เรียบร้อย

สคริปท์

- สร้างไฟล์โดยใช้โค้ดข้างล่างนี่ เซฟชื่อว่า filezillaau.au3 หรืออะไรก็ตามแต่ต้องนามสกุล .au3 เซฟไว้ไหนก้ได้ ผมไม่ค่อยแน่ใจในเครื่องคนอื่นเลยให้กำหนด path ของ filezilla.exe เอาเลย ที่ตัวแปร $fz_path ถ้าในเครื่องอยู่ที่อื่นก็แก้ได้้เลย ส่วนจะย้ายไปที่ไหนให้แก้ที่ตัวแปร $move_to ผมให้ย้ายไปที่ My Documents ถ้าพอใจแล้วก็ไม่ต้องเปลี่ยนครับ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Opt('TrayIconHide',1) 
 
$fz_path = 'C:\Program Files\FileZilla FTP Client\filezilla.exe'
$move_to = @MyDocumentsDir & '\sitemanager-backup-159753.xml';
;=====================================================================================;
 
; check filezilla.exe 
If Not FileExists($fz_path) Then
	MsgBox(0,'System Check','FileZilla Executable Not Found')
	Exit
EndIf
 
 
; Try to detect sitemanager.xml 
If FileExists(@AppDataCommonDir & '\FileZilla') Then 
	$fz_data_path = @AppDataCommonDir & '\FileZilla\sitemanager.xml'
ElseIf FileExists(@AppDataDir & '\FileZilla') Then 
	$fz_data_path = @AppDataDir & '\FileZilla\sitemanager.xml'
Else
	Exit ; No FileZilla In System
EndIf
 
 
; move the last moved file (from the last FileZilla Operation) to FileZilla Data Directory 
If FileExists($move_to) Then
	FileMove($move_to,$fz_data_path,1)
EndIf
 
 
; Execute FileZilla
$fz_pid = Run($fz_path)
 
 
; Failed to Lunch
If Not  $fz_pid Then Exit
 
; Pause Autoit 'Till FileZilla closed
While ProcessExists($fz_pid)
	Sleep(10000) ; Check proccess again in 10 Seconds
Wend
 
; Function will Trigger on Autoit Exit To Move sitemanager.xml to other place
Func OnAutoItExit()
	If FileExists($fz_data_path) Then	FileMove($fz_data_path,$move_to,1)
EndFunc

หากเซฟเรียบร้อยแล้ว ลองดับเบิ้ลคลิ้กที่ไฟล์นี้ลองรันดูหน่อย ถ้า FileZilla ทำงานขึ้นมา และไม่มี error จาก autoit เด้งขึ้นมา ก็โอเคแระ ทดลองปิด FileZilla รอไม่เกิน 10 วิ ไปเช็คที่ที่ตั้งให้ย้ายไปว่ามันย้ายมามั้ยถ้าย้ายมาถูกต้องแสดงว่าใช้ได้ ไม่มีปัญหา ถ้า 10 วิแล้วไม่มา แสดงว่าดวงของเราไม่สมพงกันละ ลบไฟล์นี้แล้ว uninstall autoit3 ทิ้งไปเหอะ

ใครที่ทรัพยากรณ์ เครื่องจำกัดมากๆ ให้ Compile สคริปท์แล้วจะได้เป็นไฟล์ .EXE มา หลังจากนั้นจะ Uninstall Autoit ออกไปเลยก็ได้ เพราะ .EXE ที่ Compile มานี้สามารทำงานได้โดยไม่ต้องติดตั้ง autoit ไว้

ถ้าอยากให้เป็น ระเบียบหน่อยก็ย้ายไฟล์ .EXE ไปไว้ในแฟ้มเดียวกับ Program Files ของ FileZilla คลิ้กขวาที่ไฟล์ .EXE เลือก Create Shortcut แล้วย้ายมา Shortcut วาง Desktop ก็ได้

ถ้าอยากให้ Shortcut เป็น Icon ของ FileZilla เลยก้ได้ (จะได้รู้สึกเหมือนเราเปิด FileZilla ขึ้นมาจริงๆ) ให้คลิ้กชวาที่ Shortcut เลือก properties -> change icon แล้ว browse ไปหาไฟล์โปรแกรมจริงๆของ FileZilla เพราะที่ไฟล์นั้นจะมี icon ของ filezilla compile ฝังไว้อยู่ ทีนี้มันก็จะเหมือนเราใช้ FileZilla ปกติแระ

ถ้ายุ่งยากก็ไม่ต้องทำก็ได้นะคับ ใึีึครอยากลองอะไรแปลกๆก็ลองทำดู

Codeigniter - เล็กๆน้อยๆในการส่งตัวแปรเข้า Views

โพสท์ในหมวด ( , ) โดย ball6847 เมื่อ Tuesday, October 6, 2009

ตาม manual ของ Codeigniter ที่ผมได้อ่านจะบอกวิธีการส่งตัวแปรเข้า Views โดยใช้

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
class Home extends Controller {
 
	function Home()
	{
		parent::Controller();
	}
 
	function index()
	{
		$data = array('name' => 'value');
		$this->load->view('name',$data);
	}
 
}


ซึ่งมันก็โอเค แต่ผมอยากจะโหลด View ทั้ง header , footer และ main ใน Controller , ที่ต้องการโหลด multiple views แบบนี้ก็เพราะว่า ผมไม่อยากจะ include ไฟล์ใน view , ผมต้องการให้ view แต่ละไฟล์ไม่ขึ้นอยู่กับไฟล์ใดไฟล์หนึ่้ง แบบว่าต้องโหลด header กับ footer ใน view หลัก แบบนี้ผมไม่เอา

ทีนี้พอเวลาผมจะโหลด multiple views ผมก็เปลี่ยนวิธีการ assign ไปอีกแบบนึงเป็นแบบนี้

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
class Home extends Controller {
 
	function Home()
	{
		parent::Controller();
	}
 
	function index()
	{
		$data = array(
			'template_url' => 'http://somewhere.com/template/' ,
			'page_title' => 'Welcome to Ball6847 World'
		);
		$this->load->vars($data);
		$this->load->view('header');
		$this->load->view('main');
		$this->load->view('footer');
	}
 
}


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

ผมเลยแยกอีก method มาใช้ในการ load view โดยเฉพาะอีกที

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
 
class Home extends Controller {
 
	var $template_vars = array();
 
	function Home()
	{
		parent::Controller();
	}
 
	function index()
	{
		$this->template_vars = array(
			'template_url' => 'http://somewhere.com/template/' ,
			'page_title' => 'Welcome to Ball6847 World'
		);
		$this->_process_view('main');
	}
 
	function _process_view($view_name)
	{
		$this->load->vars($this->template_vars);
		$this->load->view('header');
		$this->load->view($view_name);
		$this->load->view('footer');
	}
 
}


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

ปล. method $this->load->vars() นี่ได้มาจากการเข้าไปส่องใน Loader Class ซึ่งเป็น Core ของ CodeIgniter ครับ

สองรัก - Zeal จัดไป ร้องเพลงแก้เครียด

โพสท์ในหมวด () โดย ball6847 เมื่อ Sunday, October 4, 2009

ไม่ได้ว่างจัดนะ แค่อยากจะร้อง เสียงก็อุบาทว์ยังไม่อายน้อ มั่นใจซะอย่าง อะไรก็ทำได้ (ชูสองนิ้ว ลิโพซะ)



เนื้อเพลงสองรัก เผื่อฟังแล้วเกิดอารมณ์ แล้วอยากร้องตาม หรืออาจจะเป็นอารมณ์เสียมากกว่า เสียนะไม่ใช่เสีย

แต่ก่อนแต่ไรเข้าใจ ว่าการเป็นคนรัก
คือเรียนรู้กันและกัน
แต่ถ้าใครคนหนึ่ง ไม่ใช่ตัวจริง
ก็คงต้องจากกัน เหมือนดังเรื่องเธอกับฉัน

ทนเจ็บและยอมรับมา
เมื่อเธอได้เจอตัวจริง กว่าฉันถึงต้องไป
แต่มาวันนี้ เธอมีเรื่องราวมากมาย
ที่ฟังไม่เข้าใจ ยิ่งฟังยิ่งทรมานฉัน

เธอบอกเหตุผลที่หยุดความรักระหว่างฉัน
เพราะเธอไม่รู้ว่า จะรักเขามากกว่าไหม
ตัวปลอมอย่างฉันก็ยังคงรัก บอกอย่างนี้ได้ไง
อย่าปล่อยให้หวังกันอีกเลย

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

เธอบอกเหตุผลที่หยุดความรักระหว่างฉัน
เพราะเธอไม่รู้ว่า จะรักเขามากกว่าไหม
ตัวปลอมอย่างฉันก็ยังคงรัก บอกอย่างนี้ได้ไง
อย่าปล่อยให้หวังกันอีกเลย

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

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


ปล. ตกลงบอลอยากจะทำอะไรกันแน่เนี่ย เขียนโปรแกรม ทำเว็บ เล่นกีต้าร์ ร้องเพลง เอามันทุกอย่างเลย