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 หรือเกินวันที่จริงของเดือนนั้น มันก็จะปัดไปเป็นวันที่ของเดือนถัดไปอัตโนมัติ

Tuesday, February 1, 2011

SQL Server: sp_rename เปลี่ยนชื่อฟิลด์

ใช้ sp_rename 'ชื่อตาราง.ชื่อฟิลด์เก่า', 'ชื่อฟิลด์ใหม่', 'COLUMN'

ตัวอย่างเช่น

sp_RENAME 'Customer.DocNo', 'RefNo', 'COLUMN'


คือการเปลี่ยนชื่อฟิลด์ในตาราง Customer จาก DocNo ให้เป็น RefNo

ถ้า result ขึ้นว่า

Caution: Changing any part of an object name could break scripts and stored procedures.


แสดงว่าเปลี่ยนชื่อสำเร็จแล้ว

Saturday, January 1, 2011

JavaScript: IsNumeric, isNumber ยอมให้กรอกเฉพาะตัวเลขเท่านั้น

JavaScript มีฟังก์ชั่น IsNumeric() อยู่แล้ว สำหรับเช็คค่าว่าต้องเป็นตัวเลขเท่านั้น แต่มันไม่เวิร์คสำหรับบางเคส เช่น
// Whitespace strings:
IsNumeric(' ') == true;
IsNumeric('\t\t') == true;
IsNumeric('\n\r') == true;

// Number literals:
IsNumeric(-1) == false;
IsNumeric(0) == false;
IsNumeric(1.1) == false;
IsNumeric(8e5) == false;

เราเขียนฟังก์ชั่นเองก็ได้ เช็คได้ถูกต้องกว่าต้นฉบับอีก


function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}