Tuesday, February 21, 2012

รอบเมืองภูเก็ต 3 วัน 2 คืน


วันแรก - เมืองเก่า - พิพิธภัณฑ์สัตว์น้ำ - แหลมพรหมเทพ
ออกเดินทางโดยรถทัวร์ขึ้นที่หมอชิต ประมาณ 6 โมงเย็น
ถึงภูเก็ตก็เช้าพอดี 7 โมงครึ่ง ลงที่ขนส่ง เดินออกมาด้านหน้ามีร้านขายมอเตอร์ไซค์ ปกติวันละ 300 เช่าหลายวันหรือหลายคันก็ขอลดเขาได้ ผมได้วันละ 200 เสร็จแล้วก็ขับตรงออกมาเจอหอนาฬิกาดังรูป เจออะไรก็แวะจอดถ่ายรูป เราไม่รีบอยู่แล้ว วนไปวนมาแถวถนนพังงา ถนนถลางนี่แหละย่านเมืองเก่า อาหารเช้าก็ร้านดัง อรุณโภชนา มีโรตีกับชาชัก ข้าวยำ ข้าวหมก อาหารใต้ทั่วไป

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

พักที blumonkey จองทาง agoda 690 กว่าบาท รวมค่าโน่นค่านี่ 2 คืนโดนไป 1,500 กว่าต่อห้อง ห้องพักใหม่มาก ตกแต่งสวยใช้ได้ ฝากกระเป๋าไว้ก่อน บ่ายๆค่อยกลับมาเช็กอิน

สะพานหินอยู่ไม่ไกลจากย่านเมืองเก่า เลยไปชมสักนิด แต่ปกติเขาจะมาวิ่งเช้าๆกัน มีศาลเจ้าจีนอยู่ด้วย

แล้วก็ออกไปหาข้าวเที่ยงกิน พอดีมีเพื่อนเป็นเจ้าถิ่นบ้านอยู่แถววัดฉลอง เลยไปชมวัดฉลองก่อน แล้วเพื่อนก็พาไปกินส้มตำแถวจุดชมวิวเขาขาด วนไปแหลมพันวา มีพิพิธภัณพ์สัตว์น้ำค่าเข้าชมแค่ 50 บาท





วันที่ 2 - เกาะไข่
เที่ยวเกาะไข่ครึ่งวัน ลงเรือสปีดโบ้ทที่ท่าเรือ TNG ในเกาะสิเหร่ ราคาทั่วไปคนละ 1,200 บาท ให้เพื่อนจองให้ลดเหลือ 600 ^^ เกาะไข่อยู่ไม่ไกล นั่งเรือ 15 นาทีถึงเกาะแรก เกาะไข่ใน ให้เราเดินเล่นชายหาดและดำน้ำสน็อกเกิ้ลแถวๆชายหาด ปลาจะรีบว่ายมาหาคน เพราะเขานิยมให้นักท่องเที่ยวซื้อขนมปังมาให้ปลา (ถ้าไปดำน้ำแถวเกาะช้า
งเขาจะห้ามให้อาหารปลา กลัวปลาจะเสียนำสัย) แค่ริมหาดปลาก็เต็มแล้ว ชายหาดมีหินก้อนใหญ่สวยๆอยู่เยอะ แต่ถ้าจะเข้าไปใกล้ก็ดูให้ดี เพราะมีงูทะเลอยู่จริงๆตามคำขู่ของไกด์ ดำ+เดินเกาะแรกอยู่ 1 ชั่วโมงก็ไปดำเกาะที่ 2 เกาะไข่นุ้ย เกาะเล็กนิดเดียว ไม่มีชายหาดให้เรือเข้าไปเกาะ ได้แต่ดำน้ำรอบๆเรือ ดำอยู่ไม่ถึงครึ่งชั่วโมงก็ไปเกาะไข่นอก ทั้ง 3 เกาะอยู่ไม่ไกลกัน นั่งเรือ 5 นาที เก่าสุดท้ายเขาให้ relax เสียค่าเปลนั่ง 150 มีแซนวิชกับผลไม้เลี้ยง เที่ยงๆก็กลับ

บ่ายไปกินอาหารทะเลที่ปากน้ำซีฟู้ด อยากรู้ว่าอาหารใต้แท้เผ็ดยังไงให้สั่ง แกงส้มหอยจุ๊บ รับรองเผ็ดจนหน้าแดง

วันสุดท้าย - ป่าตอง
กินอาหารเช้าแถวเมืองเก่าเช่นเคย แวะเข้าไปชมพิพิธภัณฑ์ไทยหัว ค่าเข้า 50 บาท ถ้ามีกล้อง 200 กล้องมือถือไม่เป็นไร แล้วก็ขี่มอเตอร์ไซค์วนเที่ยวตามหาดต่างๆ

จากถนนเยาวราชตรงไปป่าตองแค่ 18 กิโล แต่ไปเที่ยงๆแดดเผาจนแสบหน้า หาอะไรกินแถวป่าตองหรือไม่ก็เข้าห้างจังซีลอน ร้านก็เหมือนห้างในกรุงเทพ แล้วจากป่าตองก็ขี่เลียบหาดไปเรื่องจะผ่านกาดสุรินทร์ หาดกมลา แล้ววนกลับมาทางอนุสาวรีย์ท้าวเทพกษัตรี-ท้าวศรีสุนทร มีพิพิธภัณฑ์ถลางอยู่ใกล้ๆ (ปิดวันจันทร์และอังคาร)

แล้วก็วนกลับเข้าเมือง แวะถ่ายสิ่งก่อสร้างทุกอย่างที่สวยงาม เก่าแก่ พักร้อนที่ร้านกาแฟใต้หอนาฬิกาที่เจอตอนมาวันแรกนั่นแหละ เย็นๆก็เอามอเตอร์ไซค์ไปคืนแล้วไปรอ Airport Bus ที่ขนส่ง เที่ยวสุดท้ายออก 6 โมง โดนไปคนละ 75 บาท บริการเหมือนรถปอ.ในกรุงเทพ แต่ราคาแพงกว่า จอดรับส่งคนทุกป้าย คนเยอะก็ต้องยืนโหน

จอง Air Asia เที่ยว 3 ทุ่มกว่า หิวเลยไปกินเชสเตอร์กริลล์ในสนามบิน โดนไปจานละ 165 บาท (ปกติจานละ 59 มั้ง) กะว่ากลับมาถึงสุวรรณภูมิ 5 ทุ่มกว่า ทันรถ Airport Link ซึ่งหมดเที่ยงคืน แต่เครื่องดันมาถึงเที่ยงคืนพอดี เลยต้องเสียค่าแท็กซี่กลับที่พัก

Wednesday, February 1, 2012

Buyincoins.com เว็บขายอุปกรณ์ติดจักรยาน

http://www.buyincoins.com/ เป็นเว็บจากจีนที่ราคาถูกและส่งจริง แถมถ้าเราสั่งหลายชิ้น ราคาจะลดลง ค่าส่งฟรีอีกต่างหาก ไม่มีราคาขั้นต่ำ สั่งชิ้นเดียวก็ส่ง แต่อาจจะใช้เวลารอนานหน่อย ประมาณ 2-3 สัปดาห์กว่าจะมาถึง

อุปกรณ์ส่วนใหญ่ก็เป็นพวกไฟ แบตเตอรี่ ไปจักรยานคู่ละ 60 ไมล์จักรยานอันละ 100 ลองเข้าไปดูกันได้ที่

นอกจากอุปกรณ์จักรยานก็ยังมีอุปกรณ์อื่นๆอีก จริงๆอุปกรณ์จักรยานเป็นแค่ส่วนย่อย ยังมีอุปกรณ์ iPhone เช่นฟิล์มกันรอยชิ้นละ 30 บาท

Friday, January 20, 2012

กะดีจีน

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

Sunday, January 1, 2012

EXTJS: refresh/reload ข้อมูลใน grid ใหม่ โดยไม่ต้องโหลดหน้าใหม่

grid จะแสดงข้อมูลที่ได้มาจาก store วิธีการก็คือ เราก็ดึงข้อมูลใหม่มาใส่ store แล้วให้ grid มาอ่านข้อมูลจาก store ตัวนี้ แล้วก็สั่ง grid ให้ refresh view
ตัวอย่าง
var response = Ext.decode(result);
storeSM = new Ext.data.Store({
proxy: new Ext.ux.data.PagingMemoryProxy(response),
remoteSort: true,
sortInfo: { field: "Date", direction: "ASC" },
reader: new Ext.data.ArrayReader({
fields: [{ name: "Id" },
{ name: "Date" },
{ name: "Status" }]
})
});
grid.store = store;
store.load({ params: { start: 0, limit: 20} });
grid.getView().refresh();


result ในที่นี้คือเราไปทำ Ajax select ข้อมูลส่งมาในรูป JSON

Thursday, December 1, 2011

SQUID: การตั้ง proxy บล็อคเว็บไซต์ตามช่วงเวลาที่กำหนด

Squid สามารถบล็อคเว็บไซต์เป็นบางวัน บางช่วงเวลาตามที่เราต้องการได้ วิธีการมี 2 ขั้นตอนด้วยกัน

1. สร้างไฟล์ใส่ชื่อเว็บที่ต้องการ เป็น text file ธรรมดา

vi myblockweb


สมมุติจะบล็อค facebook กับ pantip ข้างในไฟล์ myblockweb ก็พิมพ์

facebook.com
pantip.com


แล้วก็ save

2. แก้ไฟล์ squid.conf (ปกติก็อยู่ใน /etc/squid) ค้นหาบรรทัด bsex แล้วแก้ไขคำสั่งการ Blockweb ใหม่ ดังนี้

#blockweb จันทร์-ศุกร์ บล็อคช่วงเวลา 08.30 - 12.00 น. และ  13.00 - 17.30 น.
acl time_block time M T W H F 08:30-12:00
acl time_block time M T W H F 13:00-17:30

#blockweb เสาร์ ช่วงเวลา 09.00 - 12.00 น. และ 13.00 - 17.00 น.
acl time_block time A 09:00-12:00
acl time_block time A 13:00-17:00

# บล็อคเว็บที่อยู่ในไฟล์ myblockweb
acl bsex url_regex "myblockweb"
http_access deny bsex time_block
deny_info http://www.mycompany.com/deny.htm bsex time_block


M T W H F คือวัน จันทร์ อังคาร พุธ พฤหัส ศุกร์
A คือวันเสาร์
ถ้าจะบล็อควันอาทิตย์ด้วยก็เพิ่มตัว S ไปหลัง time
ตรงที่เป็น http://www.mycompany.com/deny.htm คือให้เด้งไปที่หน้านี้ ถ้ามีคนเข้าเว็บที่เราบล็อค

Saturday, October 1, 2011

C#: There is already an open DataReader associated with this Command which must be closed first

เมื่อคุณเจอ error: There is already an open DataReader associated with this Command which must be closed first.
เช่นตอนวนลูป while ตัวอย่างเช่น

ConnectionStringSettings connSettings = ConfigurationManager.ConnectionStrings["MyConnectionString"];
string connString = connSettings.ConnectionString;
SqlConnection conn = new SqlConnection(connString);

string strSQL = "SELECT * FROM MyTable1 WHERE DelFlag=1";
SqlCommand cmd = new SqlCommand(strSQL, conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string strSQL2 = "UPDATE MyTable2 SET DelFlag=1 WHERE RefId = '" + reader["Id"].ToString() + "'";
SqlCommand cmd2 = new SqlCommand(strSQL2, conn);
cmd2.ExecuteNonQuery();
cmd2.Dispose();
}
reader.close();
cmd.Dispose();


run ไปจะเจอ error นี้


วิธีแก้


ดูตรงเปิด connection ด้านบน

SqlConnection conn = new SqlConnection(connString);

ให้เพิ่ม MultipleActiveResultSets=True ลงไป เป็น


SqlConnection conn = new SqlConnection(connString + "MultipleActiveResultSets=True");

แค่นี้ก็เรียบร้อย

Thursday, September 1, 2011

C#: ไม่มีไฟล์ App.config

ถ้าคุณสร้างโปรเจ็คต์ Windows Form ใหม่ แล้วไม่มีไฟล์ App.config เพื่อใส่ค่า Configuration ต่างๆ เช่น ConnectionString ก็สามารถใส่ไฟล์ App.config ได้โดยการ

  1. คลิกขวาที่ชื่โปรเจ็คต์ เลือ Properties
  2. คลิกที่แท็บ Settings แล้วตรง Name กรอกอะไรเล่นๆสักค่าหนึ่ง ตรง Value ก็กรอกเล่นๆ
  3. Save แล้วลองรันโปรแกรมดู 
ทีนี้ไฟล์ App.config ก็จะโผล่มาใน Solution Explorer ให้คุณแก้ค่าได้ตามปกติ

Monday, August 1, 2011

SQL Server: RowNumber หมายเลขบรรทัดอัตโนมัติ

ถ้าเราต้องการจะแทรกหมายเลขบรรทัดอัตโนมัติ

SELECT ROW_NUMBER() OVER (ORDER BY StudentId DESC) AS RowNumber, * FROM Student


วิธีนี้สามารถเอาไปใช้ในการทำ paging หรือการแบ่งหน้าได้ เช่นถ้าเราต้องการ select เฉพาะรายการที่ 1000 ถึง 1100

with X as (SELECT ROW_NUMBER() OVER (ORDER BY StudentId DESC) AS RowNumber, * FROM Student)
select top 100 * from X where RowNumber >= 10000

Friday, July 1, 2011

MySQL: ย้าย Table ไป Database อื่น ใน Server เดียวกัน

ใช้คำสั่ง rename

สมมุติว่าจะย้ายตารางชื่อ tbl_name จาก database ชื่อ current_db ไปยัง other_db

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;

บรรทัดเดียวเสร็จ ไม่ว่าจะเข้าทาง command line หรือใช้ phpMyAdmin

หรือถ้าคุณไม่อยากย้าย แต่อยากจะ copy คือจะสร้าง table ใหม่ให้เหมือน table เดิมเป็น และ table เดิมยังอยู่ ก็ใช้

CREATE TABLE MyNewTable SELECT * FROM MyOldTable;

ก็จะได้ table ใหม่ชื่อ MyNewTable ที่มีโครงสร้างและข้อมูลเหมือน MyOldTable เป๊ะ ถ้าจะ copy table ข้าม database ด้วย ก็ใส่ชื่อ database. ข้างหน้าชื่อ table

ข้อควรระวัง วิธีนี้พวก Index หรือ Primary Key และพวก Auto_Increment ที่ตั้งไว้ใน table ต้นทางจะไม่ตามไปด้วย เราต้องทำเพิ่มใน table ปลายทางเอง ทางที่ดีควรจะสร้างสคริปต์ Create Table ไปสร้างใน database ใหม่ แล้วค่อยใช้คำสั่งย้ายข้อมูลคือ

INSERT INTO NewDB.NewTable SELECT * FROM OldDB.OldTable

Wednesday, June 1, 2011

SQL Server: การ join ข้าม database

เวลาคุณจะ join ตารางที่อยู่คนละ database หรือจะเพิ่มข้อมูลใน database หนึ่ง โดยการ select มาจากอีก database หนึ่ง ไม่ใช่ว่าอยู่ดีๆคุณก็จะทำได้ รายชื่อ table ที่คุณสามารถ join กัน หรือ select ร่วมกันได้จะอยู่ใน sys.servers ลอง

select * from sys.servers

ถ้ามีชื่อ server ที่คุณจะ join อยู่ในนี้ก็แสดงว่า join ได้ คำสั่งในการ join ก็เช่น

SELECT TOP 20 * FROM [MyServer1].[DBTest].[dbo].[Product] a 
INNER JOIN [MyServer2].[DBReal].[dbo].[Products] b ON a.code = b.code

การที่จะทำให้ MyServer1 กับ MyServer2 join กันได้ตามคำสั่งด้านบน คุณต้องเพิ่มชื่อ server ใน sys.servers เสียก่อน ถ้าคุณ log in ใช้ MyServer1 อยู่ ก็ run คำสั่งต่อไปนี้

EXEC sp_addlinkedserver @server='MyServer2' 

แล้วก็ต้องเพิ่ม user ที่ใช้ในการ log in เข้า MyServer2 ด้วย

EXEC master.dbo.sp_addlinkedsrvlogin  @rmtsrvname=N'MyServer2',  
@useself=N'False',
@locallogin=NULL,
@rmtuser=N'mydbuser',
@rmtpassword='mypassword'
GO

แค่นี้ก็เรียบร้อย

Sunday, May 1, 2011

IIS: The requested page cannot be accessed because the related configuration data for the page is invalid

เมื่อคุณเจอ Error

HTTP Error 500.19 - Internal Server Error

The requested page cannot be accessed because the related configuration data for the page is invalid.

ซึ่งเกิดขึ้นหลังจากที่คุณเปลี่ยน password ในการ log on เข้า windows
วิธีแก้ก็คือ
  • เปิด IIS (อยู่ใน Control Panel -> Administration Tools)
  • คลิกที่ Default Website
  • ด้านขวาจะมี Basic Settings คลิกเข้าไป
  • คลิกปุ่ม Connection as ใส่ username และ Password ใหม่ของคุณเข้าไป
แล้วก็ restart IIS ก็จะรันได้ตามปกติ
แต่ถ้า restart IIS แล้วยังเจอ error

HTTP Error 401.2 - Unauthorized

You are not authorized to view this page due to invalid authentication headers.

ให้ reatart Application Pools ด้วย

Friday, April 1, 2011

C#: การอ่านไฟล์ Excel

ถ้าเป็นไฟล์ excel เวอร์ชั่นเก่าที่เป็นนามสกุล .xls ให้อ่านด้วย Microsoft.Jet.OLEDB.4.0 แต่ถ้าเป็นเวอร์ชั่นใหม่ .xlsx ต้องใช้ Microsoft.ACE.OLEDB.12.0

HDR=YES คือไฟล์นั้นมีแถวที่เป็น Header
IMEX=1 เกี่ยวกับการ Encoding ภาษาให้ถูกต้อง


string filePath = @"C:\temp\test.xls";
DataSet objDataset1 = new DataSet();
string ConnectionString = "";
ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";
if (filePath.IndexOf("xlsx") != -1) // ถ้าเป็น excel เวอร์ชั่นใหม่
{
ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
}

OleDbConnection objXlsConn = new OleDbConnection(ConnectionString);
objXlsConn.Open();
OleDbDataAdapter objAdapter1 = null;
OleDbCommand objCmdSelect = null;
try
{
// หาชื่อ worksheet.
System.Data.DataTable dt = objXlsConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
DataRow row = dt.Rows[0];
string worksheetName = row["TABLE_NAME"].ToString();

// อ่านทุกแถวใน worksheet ด้วยคำสั่ง SQL
String strConString = "SELECT * from [" + worksheetName + "]";
objCmdSelect = new OleDbCommand(strConString, objXlsConn);
objAdapter1 = new OleDbDataAdapter(objCmdSelect);
objAdapter1.Fill(objDataset1);

// ตั้งตัวแปรสำหรับรับค่าในคอลัมน์
string dataColumn1;
string dataColumn2;

// วนลูปอ่านทีละแถว
foreach (DataRow dr in objDataset1.Tables[0].Rows)
{
dataColumn1 = dr[0].ToString();
dataColumn2 = dr[1].ToString();
// อยากทำอะไรต่อกับค่าที่ได้ก็เขียนตรงนี้
}
}
catch (Exception ex)
{
var strMsg = ex.Message;
// จะทำอะไรกับ error message ก็ทำตรงนี้
}


จะเห็นได้ว่าเราสามารถใช้คำสั่ง SQL กับ worksheet ของ Excel ได้ ทีนี้ในการ Insert, Update, Delete เราก็สามารถทำได้เหมือนกัน

Tuesday, March 1, 2011

JavaScript: วันที่วันพรุ่งนี้

var myDate = new Date(); จะได้วันที่ของวันนี้
ถ้าต้องการวันที่ของวันพรุ่งนี้ หรือล่วงหน้า หรือย้อนหลังไปกี่วันเราก็อาศัยคำสั่ง getDate() บวกหรือลบวันเอา
เช่นวันที่ของวันพรุ่งนี้

var myDate = new Date();
var myTomorrow = myDate.setDate(myDate.getDate()+1);

วันที่ของเมื่อวานนี้
var myYesterday = myDate.setDate(myDate.getDate()-1);

วันที่ของสัปดาห์หน้า
var myNextWeek = myDate.setDate(myDate.getDate()+7);

คำสั่ง getDate() จะได้วันที่ออกมา ถ้าบวก 1 แล้วได้ 32 หรือเกินวันที่จริงของเดือนนั้น มันก็จะปัดไปเป็นวันที่ของเดือนถัดไปอัตโนมัติ