Friday, November 28, 2008

ติดตั้ง font ให้ CentOS เรา

How to install font to CentOS so simply.

# ไม่ได้ใช้ linux base redhat ตั้งนานแหละ เลยจำมะได้รู้แต่ว่ามันค่อยข้างง่ายกว่า base debian แน่ๆ

# แล้วมันก็ง่ายอย่างที่คิดไว้เลย

# ต้องการติดตั้ง font windows ให้ CentOS

1.ลง CentOS เราก็เค้าไปคัดลอกมันซะซึ่งจะอยู่ใน Control Panel แล้วเข้า Fonts
2.สร้าง folder ไว้ใน /usr/share/fonts ในที่นี้เราตั้งชื่อให้มันเป็น myfonts

# mkdir /usr/share/fonts/myfonts

3. คัดลอก font จาก windows มาไว้ใน /usr/share/fonts/myfonts ซะ

Note: connect to windows by samba => smb://windows-host/

4. แค่เนี๋ยเอง เราลองไปหา font เช่น Tahoma ดูสิว่ามันมียังโดยเข้าไปยัง System=>Perferences=>Fonts



# สรุป คือ เราแค่คัดลอกไปวาง ใน folder ที่เราต้องสร้างเพื่อเก็บ font อันใหม่ หรือ ไม่แน่เราไปวางใน folder ที่มีอยู่แล้วก็น่าจะได้นะ แล้วก็ไม่ต้องใช้คำสั่งอาไรต่อเลย ง่ายปะ (ubuntu ยังต้องสั่งคำสั่งต่อ - -')

# หรือ สามารถวาง font ไว้ใน home ของเราก็ได้ ถ้าเราไม่ใช่ root แล้วก็สร้าง link font เราให้ระบบอีกที

# ขี้เกียจพิมพ์แหละ ลอกมาแปะ เลย ^^'

1. First make a font directory in your home folder, say /home/myusername/fonts.
2. Login as root in a terminal
3. Go to /usr/share/fonts: $cd /usr/share/fonts
4. Create a symbolic link to /home/myusername/fonts: $ln -s /home/myusername/fonts myfonts

# Ref : centos.org

# Thai font => Loma => opentle.org

Wednesday, November 26, 2008

ควบคุมทุกเครื่องด้วย TeamViewer

Remote any computer all the world by teamviewer 3.
  • เวลาเพื่อนมีปัญหา หรือ อาไรที่ต้องใช้จินตนาการสูงในการที่จะทำความเข้าใจ มักจาฟังปัญหาไม่รู้เรื่อง ก็มันไม่เห็นภาพอ่ะนะ ^^'
  • ส่วนมากการติดต่อระหว่างถามตอบปัญหา ก็ผ่านทาง Instance Messenger หรือ ไม่ก็โทรศัพท์ - -'
  • ถ้าเป็นปัญหาธรรมดา ก็พอทำเนา แต่ปัญหาพวกที่ไม่เคยเจออ่ะดิ แถมคนถามยัง ถามไม่รู้เรื่องอีก แบบนี้ก็แย่นะสิ
  • จาใช้ Remote Desktop มันก็ติด ปัญหาเรื่อง Nat หรือ Private IP เซงเลย แบบนี้ก็ชิ่งเลยเรา ^^'
  • แต่วันนี้เราขอเสนอนวัตกรรมใหม่ TeamViewer
  • Team Viewer โปรแกรมประเภท Remote คล้ายกับ Remote Desktop ประมาณนั้นแต่เจ๋งกว่าเยอะเลย
  • สามารถรันบน Mac หรือ Windows ก็ได้ Get it

ความสามารถของโปรแกรม
  • Remote support สามารถควบคุมหน้าจอเครื่องปลายทาง ต่างจาก remote desktop เกี่ยวกับเรื่อง session
  • Presentation สามารถแสดงหน้าจอเครื่องเราให้เครื่องปลายทางเห็นได้
  • File tranfer มีโหมดการเข้าถึง จัดการไฟล์ระหว่างเครื่องเราและเครื่องเป้าหมาย
  • สามารถใช้ VPN ได้
  • ประมาณนี้อ่ะนะ แต่ถ้าอยากรู้ต้องอ่าน help เค้าเอง

การใช้งาน
  • โปรแกรมนี้จะมีประโยชน์เมื่อเราต้องการติดต่อกับคอมพิวเตอร์เครื่องอื่นๆ
  • ลงโปรแกรมไว้ที่เครื่องเรา กับเครื่องที่เราต้องการควบคุม
  • เราสามารถเลือกรันโปรแกรมได้เลยโดยไม่ต้องทำการติดตั้ง หรือ จาติดตั้งก็ได้
  • เมื่อเปิดโปรแกรมขึ้นมามันน่าจะทำการเชื่อมต่อไปยัง Server ของมันแล้วก็สร้าง id และ password ให้กับเครื่องที่รันโปรแกรมนั้น เพื่อเอาไว้ให้เครื่องอื่น เข้ามาควบคุมต้องใส่ id และ password ของเรา
  • กรอบสีเขียวด้านขวามือของเราให้กรอก id เครื่องเป้าหมาย และ ทำการการเลือกว่าเราต้องการควบคุม หรือ แสดงหน้าจอเรา หรือ ต้องการใช้โหมด การย้ายไฟล์ หรือ ใช้ VPN ก็เลือกซะ
  • มันก็จะมีหน้าขึ้นมาให้เรากรอก password เครื่องเป้าหมายที่เราจะควบคุม
  • ผลจากการเลือกแบบ Remote support จะแสดงหน้าจอเครื่องที่เราทำการควบคุมอยู่
  • ซึ่งเมื่อเราขยับ mouse ที่เครื่องเรา เครื่องปลายทางมันก็จะขยับตาม ^^' เท่ดี คล้ายพวก Real VNC เลยแฮะ

Note
  • อย่าลืมเปิด TeamViewer 3 ที่ฝั่งเครื่องเป้าหมาย

Related

Tuesday, November 25, 2008

สร้าง Audio CD ดัวย K3B

Build audio cd with k3b in ubuntu 8.04.

# K3B เป็น CD Burning ที่ค่อนข้างเป็นที่นิยมนะ ใน linux อ่ะฝั่ง Gnome เค้ายังใช้กันเลย เราอ่ะคนหนึ่ง
# แต่ก่อนใช้ Brasero ก็ใช้ง่ายดี อืมก็ดีอ่ะ
# วันนี้คิดเรื่องที่จะ update บล็อคไม่ออก เลย เอาเรื่อง สร้าง Audio CD จาก MP3 แล้วกัน
# โดยใช้ K3B เป็นตัวสร้าง

1. ติดตั้ง K3B ด้วยคำสั่ง $ sudo apt-get install k3b
2. ติดตั้งตัวนี้ด้วยสำหรับให้ k3b อ่านเล่นไฟล์ประเภท sound ต่างๆ ได้และที่สำคัญทำให้เราต้องใช้มันในหัวข้อนี้ด้วย ถ้าไม่ลง library นี้มันก็จะสร้าง audio cd ไม่ได้

$ sudo aptitude install libk3b3-extracodecs

- ในเว็บบอร์ดต่างประเทศ ubuntuforums.org ไง๋เค้าบอกให้ลง k3b-mp3 หว่าสงสัยเป็นเวอร์ชั่นเก่า
- ซึ่งถ้าเราไม่ได้ลง libk3b3-extracodecs เมื่อเราจะทำการสร้าง audio cd มันก็จะขึ้นประมาณเนี๋ย

"Unable to handle the following files due to an unsupported format:"

- เราสามารถใช้ Synaptic ซึ่งจะอยู่ใน System => Administration ก็ง่ายดี เพียงเราค้นหาด้วยคำว่า k3b

3. เมื่อการติดตั้งผ่านไปด้วยดีและ สำเร็จ k3b มันก็จะไปอยุ่ที่ Applications => Sound & Vedio
4. เปิดมันขึ้นมา แล้วเราก็ไปยัง folder ที่เราเก็บไฟล์เพลงที่จะนำมาสร้าง audio cd ซะ



5. เราจะเห็นคำว่า New Audio CD Project ตรงกรอบด้านล่าง คลิกเลย จากนั้นลากไฟล์เพลงใส่กรอบว่างๆ ที่ตรงด้านล่างซะ จากนั้นคลิกที่ Burn ที่อยู่เหนือคำว่า No. Artist (CD-Text)



6. ถ้าเราลืมใส่แผ่น CD เปล่า ที่ปุ่ม Burn เราจะไม่สามารถคลิกมันได้เลย แต่ถ้าเราใส่แผ่นแล้ว คลิกมันเลย



7. เมื่อมันทำการสร้าง audio cd เสร็จเรียบร้อยมันก็จะมีเสียงอาไรของมันดังขึ้นและ eject แผ่นออกมา



# Brasero ก็มีนะความสามารถนี้อ่ะ แต่ไม่แน่ใจว่าต้องลง library เพิ่มเหมือน k3b ป่าว

Related Links:

Monday, November 24, 2008

เปิดเผย ข้อความที่ซ่อนอยู่หลัง **********

Reveal the password behind this code "*******"
  • เมื่อไรก็ตามที่เราติ๊กเครื่องหมายจำรหัสไว้ และเราก็ไม่ได้กรอกมันอีกเลย ทำให้เราอาจลืมรหัสได้
  • เช่น โปรแกรมประเภท instance messenger เราต้องขี้เกียจต้องนั่งกรอกทุกครั้งแน่เลย
  • แล้วถ้าเราต้องการใช้รหัสผ่านนั้นล่ะจะทำไง

How to

  • หาโปรแกรมประเภท recovery password มา เช่น MessenPass
  • หรือถ้าจะให้ง่ายกว่าก็ใช้โปรแกรมประเภท reveal
  • เช่น Password Recover XP หรือ Spine PassView
  • หลักการใช้โปรแกรมพวกนี้ก็ไม่ยาก แค่เราลากเครื่องหมาย (Spine PassView จะเป็นรูปมือชี้) ของโปรแกรม ไปยังเป้าหมายเราคือ TextBox Password แล้วเราก็ปล่อย หรือ วางใกล้ๆ Textbox ก็น่าจะได้
  • มันก็จะแสดงรหัสผ่านที่ซ่อน ดังตัวอย่างจะเป็น 1234 ที่ได้จากการนำนิ้วไปวาง
  • บางที Application แต่ละตัวอาจมีตำแหน่งการวาง เพื่อที่จะได้รหัสผ่านไม่เหมือนนะ
  • หรือ ต้องลองมั่วเอาเอง
  • โปรแกรมเมอร์ พึงระวังเรื่องนี้ด้วยครับ

เพิ่มเติม

  • เมื่อเราลากนิ้ว ไปที่ password textbox เราจะปล่อยเมื่อมีคำว่า release แสดงในโปรแกรมเราอ่ะ

Logout Gmail ทุกเครื่อง จากเครื่องเดียว

Remote logout from your acc GMail.

# แน่นอนเวลาเราเข้าเมล์ ทุกค่าย เราคงไม่ได้เล่นที่คอมเครื่องเดียวตลอดไปแน่
# ถ้าเราเข้าเมล์ บนเครื่องเราเอง แล้วลืม Logout ก่อนปิดบราวเซอร์ ก็ไม่เป็นไร
# แต่ถ้าเราลืม Logout บนเครื่องอื่นๆ เช่น Internet Cafe หรือ Office มันก็แย่นะสิ
# ถ้ามีคนมาใช้เครื่องนั้นต่อจากเราแล้วเข้า พิมพ์ url ของ mail service อันเดียวกับที่เราใช้
# กูเกิ้ลเค้ามีความสามารถ หนึ่งซึ่งออกมานานแล้วอ่ะ แต่พึ่งนำมา update ลงบล็อค
# นั้นคือ การ Logout all จากเครื่องเดียว

1. เมื่อเราทำการเข้าระบบ GMail เรียบร้อยแล้วให้เรามองลงด้านล่าง หรือ เลื่อน scrollbar ลงมายังด้านล่างสุด จะเห็นข้อความ ภาษาอังกฤษ ประมาณนี้



2. ให้เราคลิกที่ Detail ด้านขวาสุด สีน้ำเงินมีเส้นใต้
# ถ้ามีคนเข้าใช้เมล์ account เดียวกันกับเรา ในเวลาเดียวกัน หรือ เราลืม Logout มันก็จะขึ้น

"This account is open in one other location"


# ในที่นี้คือเครื่องไอพี 124.120.159.208 เข้าใช้งานอยู่
# มองที่ด้านล่าง This computer is using IP address 124.120.159.208
# อย่าพึ่ง งง คือ อันนี้ทดสอบโดยมีใช้เครื่องสองเครื่องจาก NAT ตัวเดียวกัน มันเลยเห็น ไอพีเครื่องอื่นที่เข้าเมล์นี้ และ ไอพีเครื่องนี้ มันเลยเป็นอันเดียวกัน เนื่องจาก NAT นั่นเอง
# แต่ถ้าเราเข้าจากที่อื่นแล้วลืม Logout ไอพี่ทั้งสองตัวมันจะไม่เหมือนกันแน่นอน
# หรือ ถ้ามีคนแฮคเราด้วยวิธี ต่างๆ เราก็สามารถ เห็นไอพีเครื่อง แฮคเกอร์ ได้เช่นกัน

3. เมื่อเราพบว่ามีเครื่องอื่นเข้าใช้ account นี้เช่นเดียวกัน เราก็กดที่ปุ่ม

"Sign out all other sessions"

4. เมื่อเรา Sign out สำเร็จมันก็จะขึ้นแบบนี้

"Successfully signed out all other sessions."

5. เมื่อเรากด Detail อีกครั้งมันก็จะเป็นประมาณนี้ คือ ไม่มีใครเข้าใช้งาน account เดียวกันเราขณะนี้ ^^'

"This account does not seem to be open in any other location. "

Friday, November 21, 2008

จับภาพหน้าจอด้วย TakeScreenshot

Capture desktop tool for linux.

# TakeScreenshot เป็นโปรแกรมจับภาพหน้าจอบน linux

# ปกติแค่กด PrintScreen มันก็จะทำการจับทั้ง Desktop

# ถ้าต้องการจับภาพ window ที่เปิดอยู่เท่านั้น กด Alt + PrintScreen

# ใส่ Effect หลังจากจับภาพ ถ้าเราใช้ WinSnap มันจะมี Effect เงา ให้เราใส่ด้วย

# TakeScreenshot ก็เช่นเดียวกัน มี Effect เงาให้เราใส่ได้เช่นเดียวกับ WinSnap

# ฟังก์ชั่นน้อยกว่า WinSnap หลายๆ อย่างแต่ก็พอใช้แทนกันได้

# เมื่อต้องการจับ window ต้องตั้ง Delay และไปโฟกัสที่ window ที่จะจับภาพ

# เมื่อกด Take เลย โฟกัสขณะนั้นมันจะอยุ่ที่ Desktop ทั้งหมด ยุ่งเหมือนกันนะเนี๋ย

# Application => Accessories => Take Screenshot



# เราต้องเลือก Grap the current window และ ตั้ง delay มันด้วย

# Effect จะมี Drop shadow และ Border

# ไปใส่เงาใน Photoshop หรือ Gimp เลิกทำซะนะครับ มันเอ้านานแหละ

# แต่ PrintScreen และแปะบน Paint ก็ยังคลาสสิคอยู่นะ

# อันนี้สั่งผ่าน command เลยเท่ดี

$ gnome-screenshot --window --delay=8 --border-effect=shadow

# จับภาพหน้าต่างที่โฟกัส นับถอยหลัง 8 วินาที และ ใส่ effect ให้มีเงาด้วย

# ซึ่งเราสามารถหา วิธีใช้โปรแกรมใน yelp น่าจะมี เพราะคำสั่งด้านบนเอามาจาก Help ของ CentOS ^^'

เกี่ยวกับ TreeNode Component ใน C#

# เมื่อเราต้องการได้ค่าจาก node ที่เราได้ทำการ Click ไป 1 ครั้ง
# ทำไมใช้ Click Event แล้วมันได้ node เป็น null หว่า

TreeNode mySelectNode = treeNode.SelectedNode;

# ถ้าอยู่ใน Click Event mySelectNode มีค่าเป็น null ซะงั้น
# แต่เราสามารถใช้ AfterSelect Event แทนได้
# mySelectNode เราจะไม่เป็น null แหละ

# การปรับแต่งให้แสดง tooltips ไ้ด้ต้องตั้งค่าของ treeview ที่ ShowNodeToolTips = true
# treeNode.ToolTipText = "msg"; ถึงจะใช้งานได้

Wednesday, November 19, 2008

ตัวอย่าง Store procedure MySQL

Create store procedure by MySQL Administrator.

  • เปิด MySQL Administrator ซึ่งเป็นโปรแกรมใน MySQL Toolkit
  • เลือกเมนู Catalogs => เลือก Database ที่จะทำการสร้าง Procedure
  • เลือกที่แท๊ป Store procedure => Create Store proc

Example code store procedure MySQL :

CREATE DEFINER=`root`@`localhost` PROCEDURE `SAMPLE`(p1 varchar(50), p2 int)
BEGIN

# การประการตัวแปร หรือ สิ้นสุดประโยคใดๆ ต้องต่อท้ายด้วย semi-colon
 declare temp varchar(50) ;
declare i int ;

set i = p2;
# การกำหนดค่าให้ตัวแปร

while i <> '100' do # การใช้ while loop

if i % 2 = 0 then
# sql statement something or set some value ........... ;
end if;

end while ;

# จบ while loop แล้วอย่าลืม semi-colon ด้วย

END

  • เราสามารถเลือก store procedure ที่เราสร้างขึ้นโดยคำสั่ง
  • call store_name(param...);
  • สรุปคือไปดู mysql manual เค้าจะดีที่สุด

ตัวอย่าง Store Procedure SQLServer

Sample for create store procedure.

-- pattern mssql store procedure

CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>
-- Add the parameters for the stored procedure here
<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END

-- Converting procedure

ALTER PROCEDURE [dbo].[Convers]-- 1,4,5
-- Add the parameters for the stored procedure here
@p1 int = 0,
@p2 int = 1,
@sql varchar(49) = ''
AS
BEGIN
print (@p1 + @p2) -- plus int

-- convert int to varchar and append varchar
print convert(varchar,@p1+@p2)+@sql
print cast(@p2 as varchar(2)) -- convert int to varchar

declare @myDate varchar(50)
select @mydate = birthdate from test_1
--select birthdate from test_1


END

--select *,'test'=id +'-'+ convert(varchar(50),birthdate) from test_1
--select *, id +'-'+ convert(varchar(50),birthdate) as test from test_1
--select str(id, 10, 2) from test_1
--select convert(varchar(50), birthdate, 111) from test_1

-- End Converting

-- If

ALTER PROCEDURE [dbo].[If]
AS
BEGIN
if exists (select * from test_2)
begin
print 'Exist'
end
else
begin
print 'Not exists'
end

if 1 <> 1 OR 1 = 1 OR 2 >= 1
print 'True'
else
print 'False'
END

-- End if

-- Insert from select statement

ALTER PROCEDURE [dbo].[Insert_table_to_table]
AS
BEGIN

-- delete test_2
-- delete from test_2

-- INSERT INTO [sample].[dbo].[test_2]
-- ([id_2]
-- ,[birthdate_2]
-- ,[name_2])
-- select id, birthdate, name from test_1

INSERT [sample].[dbo].[test_2]
([id_2]
,[birthdate_2]
,[name_2])
select id, birthdate, name from test_1
END

-- End Insert from select statement

-- Set value

ALTER PROCEDURE [dbo].[Set]
AS
BEGIN
declare @temp varchar(50)

select @temp = id from test_1

-- or select statement must inside braces
set @temp = (select id from test_1)

print @temp

set @temp = @temp + ' hello '
print @temp
END

-- End set value

-- While

ALTER PROCEDURE [dbo].[While]
AS
BEGIN
declare @i int
set @i = 10
while @i > 0
begin
print @i
set @i = @i - 1
end
END

-- End while

-- check exist befor create table ที่มา
-- check ว่ามี table นี้อยู่หรือไม่ ถ้ามี ให้ drop ก่อน
if exists(select name from sysobjects where id = object_id('abc'))
begin
print 'try to drop table abc'
drop table abc
end
go

-- สร้าง table abc
create table abc (
code char(2) not null,
description varchar(20) null,
active bit null default 0)

-- สร้าง unique index
create unique index uni_abc on abc(code)

-- ทดสอบ insert ข้อมูล
insert into abc values ('AA','TEST 1',1);

-- check ว่ามี proc นี้หรือไม่ ถ้ามี drop ก่อน
if exists(select name from sysobjects where id = object_id('proc_abcInsUpdDel'))
begin
print 'try to drop proc proc_abcInsUpdDel'
drop proc proc_abcInsUpdDel
end
go

-- สร้าง store proc insert/update/delete
create proc proc_abcInsUpdDel
@option tinyint,
@code char(2),
@description varchar(20)=null,
@active bit=null
as
if @active is null
select @active = 1
if @option = 1
begin
insert into abc(code,description,active) values (@code,@description,@active)
if @@error <> 0
begin
raiserror( 'proc_abcInsUpdDel:ไม่สามารถบันทึกข้อมูลได้',16,-1)
end
else
begin
print 'save complete'
end
end
if @option = 1
begin
insert into abc(code,description,active) values (@code,@description,@active)
if @@error <> 0
begin
raiserror( 'proc_abcInsUpdDel:ไม่สามารถบันทึกข้อมูลได้',16,-1)
end
end
if @option = 2
begin
update abc set description=@description,active=@active
where code = @code
if @@error <> 0
begin
raiserror( 'proc_abcInsUpdDel:ไม่สามารถบันทึกข้อมูลได้',16,-1)
end
end
if @option = 3
begin
delete from abc where code = @code
if @@error <> 0
begin
raiserror( 'proc_abcInsUpdDel:ไม่สามารถบันทึกข้อมูลได้',16,-1)
end
end

-- ทดสอบ insert
proc_abcInsUpdDel 1,'BB','TEST2',1

-- ทดสอบ insert โดยไม่มี active
proc_abcInsUpdDel 1,'CC','TEST3'

-- ทดสอบ update
proc_abcInsUpdDel 2,'CC','TEST4'

-- ทดสอบ delete
proc_abcInsUpdDel 3,'CCC'

-- ตรวจสอบข้อมูล
select * from abc;


Notes:
  • การเรียก function ที่เราสร้างเองใน procedure ต้องเรียกแบบนี้ dbo.ชื่อฟังก์ชั่นเรา
  • dbo = database owner
  • คือต้องเติม dbo. หน้าชื่อ function ของเรานั่นเอง
  • ก่อนจบอ่ะ อีกนิดคือ
วิธีการรับค่า return จาก procedure กลับมายัง app เรา อ้างอิงบน C#

// สร้างตัวแปรแบบ sqlparameter ขึ้นมา 1 ตัวชื่ออาไรก็ได้ ในที่นี้ให้ชื่อ ReturnValue อาจจะไม่ใส่ @ ข้างหน้าก็ได้
SqlParameter returnparam = new SqlParameter("@ReturnValue", SqlDbType.Int);

// กำหนดให้ตัวแปรนี้เป็นการรับค่ากลับจาก procedure
returnparam.Direction = ParameterDirection.ReturnValue;

//และเพิ่มเข้าไปใน sql command ที่เรียก procedure
cmdStored.Parameters.Add(returnparam);

// เอ๊กคิ้ว sql command
cmdStored.ExecuteNonQuery();

// สร้างตัวแปรขึ้นมา รับค่าจากตัวแปร ^^' งง
string return = cmdStored.Parameters["@ReturnValue"].Value.ToString();

ทำไม

Msg 245, Level 16, State 1, Procedure BACKUP_SELENE, Line 40
Conversion failed when converting the varchar value '-1aaa' to data type int.

  • ข้อผิดพลาดด้านบนเกิดตอน execute procedure แต่ตอน compile ผ่านน่ะ
  • จากข้อความ error ใน procedure ทำการ return '-1aaa' กลับ ซึ่งค่านี้ไม่สามารถแปลงเป็น int ได้
  • แต่ถ้าเรา return 1 หรือ return '1' execute procedure แบบไม่มีปัญหาเลย
  • ค่าที่จะ return ต้องเป็น int หรือ ค่าที่สามารถแปลงเป็น integer เท่านั้นหว่า

Notes:
  • แต่สมมุติเรา ทำการ execute procedure ใน app เรา และ นำตัวแปรมารับค่า
  • int value = cmdStore.ExecuteNonQuery();
  • value จะเป็นได้แค่ 1 กับ -1 procedure จะ return ค่าอาไรก็ชั่ง ค่าจะอิงจากผลของ statement ใน procedure เท่านั้น
  • ถ้าใน procedure ไม่มี statement อาไรเกี่ยวกับ insert, update, delete ก็จะได้ค่ามาเป็น -1 ไง
  • พูดถึงเรื่อง procedure แล้วก็อยากเอ๋ยถึง การสร้าง function ซะหน่อย คือ create function [name] เสร็จแล้วต้องตามด้วยวงเล็บ ( เปิด และ ปิด ) อ่ะ ไม่งั้น execute ไม่ผ่านหว่า อีกอย่างทำไม return ค่าเป็นประเภท double execute ไม่ผ่านซะงั้น
  • เรื่องการ declare หรือ การประกาศตัวแปรนั้น ควรใช้หลักการของโปรแกรมมิ่งทั่วไป
Store error
can't declare repeat param @a same scope or not same scope

if ......1
begin
declare @a bit
set @a = 1
end

if .......2
begin
declare @a bit
set @a = 2
end

Store can execute but not recommended

if ......1
begin
declare @a bit
set @a = 1
end

if .......2
begin
set @a = 2
end

Store recommended

declare @a bit

if ......1
begin
set @a = 1
end

if .......2
begin
set @a = 2
end

References:

ตัวอย่าง Triggers SQLServer

How to Create After Triggers

# Triggers : คือ เมื่อเราต้องการจะ update บาง table เมื่อเกิดเหตุการกับบาง table

--pattern

CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>
ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name>
AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for trigger here

END


  1. Working with INSERT Triggers

    INSERT INTO Customers
    VALUES (‘Mayank’,’Gupta’,’Hauz Khas’,’Delhi’,’Delhi’,’110016’,’01126853138’)
    INSERT INTO Customers
    VALUES(‘Himanshu’,’Khatri’,’ShahjahanMahal ’,’Jaipur’,’Rajesthan’,’326541’,’9412658745’)
    INSERT INTO Customers
    VALUES (‘Sarfaraz’,’Khan’,’Green Market’,’Hydrabad’,’AP’,’698542’,’9865478521’)

    INSERT INTO Products
    VALUES (‘ASP.Net Microsoft Press’,550)
    INSERT INTO Products
    VALUES (‘ASP.Net Wrox Publication’,435)
    INSERT INTO Products
    VALUES (‘ASP.Net Unleased’,320)
    INSERT INTO Products
    VALUES (‘ASP.Net aPress’,450)

    CREATE TRIGGER invUpdate ON [Orders]
    FOR INSERT
    AS
    UPDATE p SET p.instock=[p.instock – i.qty]
    FROM products p JOIN inserted I ON p.prodid = i.prodid

    You created an INSERT trigger that referenced the logical inserted table. Whenever you insert a new record in the orders table now, the corresponding record in the products table will be updated to subtract the quantity of the order from the quantity on hand in the instack coloumn of the products table.

  2. Working with DELETE Triggers

    DELETE triggers are used for restricting the data that your users can remove from a database. For example

    CREATE TRIGGER DelhiDel ON [Customers]
    FOR DELETE
    AS
    IF (SELECT state FROM deleted) = ‘Delhi’
    BEGIN
    PRINT ‘Can not remove customers from Delhi’
    PRINT ‘Transaction has been canceled’
    ROOLBACK
    END


    DELETE trigger used the logical deleted table to make certain that you were not trying to delete a customer from the great state “Delhi” – if you did try to delete such a customer, you would be met with Mayank in the form of an error message (which was generated by the PRINT statement that you entered in the trigger code).

  3. Working with UPDATE Triggers

    UPDATE triggers are used to restrict UPDATE statement issued by your users, or to back your previous data.

    CREATE TRIGGER CheckStock ON [Products]
    FOR UPDATE
    AS
    IF (SELECT InStock FROM inserted) <>You created an UPDATE trigger that references the inserted table to verify that you are not trying to insert a value that is less than zero. You need to check only the inserted table because SQL Server performs any necessary mathematical functions before inserting your data.

Note
  • ด้านบนเป็น trigger แบบ after
  • แต่ถ้าเราต้องการให้ trigger ทำงานก่อน insert, update , delete เราต้องใช้ instead of แทน for หรือแทน after นั่นเอง
  • เช่น instead of insert, update, delete
  • table ชั่วคราวได้แก่ inserted, deleted ซึ่งใน trigger ก่อนหรือหลัง query จะมีผลต่อ table เหล่านี้ทั้งสิ้น
  • ส่วน update คือ ก่อน update จะเก็บไว้ที่ deleted หลัง update จะเก็บไว้ที่ inserted
  • เราสามารถใส่ rollback tran ได้เช่นกัน
  • instead of จะไม่สามารถสร้างบน table ที่มี foreign key ได้
  • และ instead of จะเป็นการทำงานแทน insert , update, delete เลย ไม่เหมือน after หรือ for ที่จะทำงานใน trigger หลัง insert, update, delete

References :

Tuesday, November 18, 2008

กู้รหัสผ่าน Gmail ,Yahoo, Live

Recover GMail, AOL, Yahoo or Windows Live Passwords.

# ถ้าโปรแกรม Messenger ทั้งหลายไม่ว่าจะเป็น GTalk, Windows Live, Yahoo Messenger และ อื่นๆ

# เมื่อเราเลือก Remember ขณะ Login ระบบ windows จบันทึก user หรือ password ลงในเครื่องๆ นั้น

# และใน ครั้งต่อไปที่เปิดโปรแกรม Messenger นั้น มันก็จะโหลด user หรือ password ขึ้นมา

# คล้ายกับระบบ Autocomplete ของ Browser ทั่วๆ ไป

# ซึ่ง user และ password พวกนี้เราก็จะใช้ login เข้าไปยัง e-mail ด้วยเช่นกัน

# ทำให้บางครั้งเมื่อเราจะเข้าระบบ e-mail อาจจะจำรหัสบางตัวผิดไป ทำให้เข้าระบบ mail ไม่ได้

# แต่เราสามารถเล่น instance messenger ได้โดยไม่ต้องจำอะไรเลย

# MessenPass ช่วยคุณได้ถ้าเกิดคุณเป็น อัลไซเมอร์ ขึ้นมา ^^' กระทันหันตอนเข้า mail



# ค่อนข้างอันตรายเหมือนกัน ถ้าเครื่องคอมพิวเตอร์ที่เราใช้เล่นไม่ใช่เครื่องเราเอง

# MessenPass ไม่ต้องทำการติดตั้ง launch .exe ได้เลย ทำให้สามารถพกไปกับ USB Drive ได้ง่ายๆ

# Cleaner ของระบบ windows มันก็ลบไม่ได้อ่ะ - -'

# ทางแก้ที่ดี เมื่อเราใช้โปรแกรมพวก Instance Messenger เราไม่ควรเลือก Remember

# Download ...

Monday, November 17, 2008

เคยเห็นแต่ในหนัง และแล้วก็เป็นจริง

# อยู่คนละที่ แต่สามารถคุยกัน ได้อย่างใกล้ชิด เลยเท่ ดีครับ

# หนังแนวโลกอนาคต แล้วก็ในการ์ตูน ด้วย

# จอร์จลูคัส คิดไว้ตั้งแต่ star war ภาคแรกเลย

# เค้าเรียกนวัตกรรมนี้ว่า Hologram สำนักข่าว CNN โชว์เป็นที่แรกเลยแฮะ

Friday, November 14, 2008

สร้าง script คำสั่งทำงานเมื่อบูตระบบ Ubuntu

How to build boot scripts for Ubuntu.

  • Enviroment : Ubuntu 8.04
  • Script รันตอนบูตระบบก็ เช่น MySQL , Apache หรือ Services ต่างๆ
  • คือ มันจะรันตอนบูตระบบให้เลยเราไม่ต้องมานั่ง start มันเอง

Example : สำหรับทำ ARP Static เมื่อบูตระบบใหม่ทุกครั้ง

1. เปิด gedit หรือ editor สักตัวที่เราใช้

2. สร้างไฟล์สคริป โดยบรรทัดแรกในไฟล์ ต้องขึ้นต้นด้วย #! /bin/sh และ จบคำสั่งด้วยการขึ้นบรรทัดใหม่ หรือ เครื่องหมาย semi-colon ";"

#! /bin/sh

# any command
arp -s 192.168.1.1 00:00:00:11:11:11

3. ทำการบันทึกไฟล์สคริป ในที่นี้จะตั้งชื่อไฟล์เป็น myscriptd แล้วกัน (จะใส่ .sh ด้วยก็ได้)

4. นำไฟล์ myscriptd ไปวางไว้ที่ /etc/init.d/

5. เปลี่ยน permission ให้ execute ไฟล์ได้

$ sudo chmod +x /etc/init.d/myscriptd
or
$ sudo chmod 755 /etc/init.d/
myscriptd

5. จากนั้นให้เราพิมพ์คำสั่งดังนี้ สำหรับสั่งให้สคริปทำงานตอนบูตระบบ

$ sudo update-rc.d myscriptd defaults
or

$ sudo update-rc.d myscriptd start 90 2 3 4 5 .

6. ถ้าเราต้องการยกเลิกคำสั่งในสคริป arpstaticd ตอนบูตระบบ

$ sudo update-rc.d -f myscriptd remove

7. ดูออฟชั่น update-rc.d ด้วยคำสั่ง

$ man update-rc.d

  • มันจะเห็น script เราเหมือน service ตัวอื่นๆ เราสามารถสั่ง /etc/init.d/myscriptd stop ซึ่งเราสามารถประยุกค์ใช้ ทำ services ของเราได้
  • ถ้าเราทำตามขั้นตอนแล้ว คำสั่งไม่ทำงาน เราสามารถทำได้อีกวิธีคือเพิ่ม /etc/init.d/myscriptd startarp -s 192.168.1.1 00:00:00:11:11:11 ลงไปในไฟล์ /etc/init.d/rc.local
  • หรือ นำคำสั่งไปฝากกับ shell ของ services ตัวอื่นๆ ก็น่าจะได้นะคิดว่า
  • /etc/init.d/rc.local จะรันเมื่อบูตระบบ (ubuntu นะ) แต่ปกติจะใช้ตัวนี้นะ /etc/rc.local แต่ทำไมใน ubuntu จะรันเมื่อปิดระบบซะงั้น ไม่แน่ใจ
  • เจอแหละ เค้าบอกให้วางคำสั่งใส่ใน /etc/rc.local ใส่ก่อนคำสั่ง exit 0 อ้างอิง ubuntu 8.10
  • แต่ก่อน หรือ distro ประมาณ Redhat หรือ Ubuntu รุ่นเก่าอ่ะ เคยเพิ่มคำสั่งใน /etc/rc.local ก็รันคำสั่งได้นะตอนบูตระบบอ่ะ แต่ทำไม ubuntu ใช้ได้เหมือนกันมั้ยหว่า
  • ถ้าเป็น windows เราก็ทำเป็น .bat แล้วก็นำไปวางที่ StartUp แต่คำสั่งจะทำงานเฉพาะ ตอนเรา logon เข้าระบบแล้วอ่ะ ถ้าทำแบบนี้ แก้โดยใช้ schedule task ของ windows ไง หรือไม่ก็ทำเป็น service ซะเลย
อ้างอิงข้อมูล
  1. debian.org
  2. ubuntuforums.org
  3. linuxlane.com
  4. ubuntu.wordpress.com
  5. debuntu.org
  6. debian-administrator.org
  7. การเขียน shell script
  8. golfreeze.212cafe.com


Wednesday, November 12, 2008

เก็บไฟล์ออนไลน์ ด้วย SkyDrive

Online storage with SkyDrive.

# SkyDrive เป็นบริการ สำหรับให้เราเก็บไฟล์ไว้บนอินเทอร์เน็ต (online storage) จากค่าย MS

# เค้าให้พื้นที่ประมาณ 5 กิ๊ก

# แต่เก่าก่อนนั้นเห็นทาง ตะวันตกเค้าเปิดให้บริการนี้นานแหละ แต่พี่ไทย พึ่ง จาใช้ได้ไม่นานนี้เอง

# Google มีแบบนี้ป่าวหว่า มะเคยเห็นเลยอ่ะ

# Lean more...

# ขั้นตอนการใช้บริการ SkyDrive

1. เราต้องมี account อย่างเช่น live.com , hotmail.com หรือ ไม่ก็ msn.com ก็สามารถใช้บริการได้แหละ

2. เข้าไปที่ skydrive.live.com อ่านรายละเอียด เพิ่มเติมที่ lean more... ซึ่งมันจะแบ่งการเก็บเป็น 3 ประเภท

- Personal folders อันนี้ส่วนตัว สำหรับเราคนเดียว

- Shared folders เลือกการแชร์ว่า เราจะแชร์ให้ใครบ้าง ด้วยการเลือก account

- Public folders ใครก็ได้ที่ต่อ อินเทอร์เน็ต สามารถเข้าถึงไฟล์ได้หมด



3. ก่อนเข้าระบบเราต้อง login ก่อน



4. เมื่อเราเข้าระบบแล้วก็จะมี folders พื้นฐานซึ่งมันจะมีให้เราเลยไม่ต้องตกใจว่า ใครมาสร้างให้เราหว่า และ ด้านขวา จะมีการบอกปริมาณว่าเราเก็บไฟล์ไว้ใน storage online เนี๋ยไปเท่าใหร่ แล้ว เหลือพื้นที่เท่าใหร่



5. ก่อนการ upload ไฟล์เราต้องมี folder ก่อน ถ้าเราไม่ต้องการสร้าง ก็ใช้ อันที่มันสร้างให้เราได้เลย แต่ถ้าเราต้องการสร้าง folder ให้เรามองไปด้าน ซ้ายบน จะเห็น New folder

6. มันก็จะให้เราใส่ชื่อ และ เลือก ประเภท เมื่อเราใส่ชื่อ และ รุปแบบการเข้าถึงแล้ว ก็คลิกที่ Create folder

- Anyone on the internet คือ แบบ Public folders

- Peple i choose... คือ แบบ แชร์ให้เฉพาะเพื่อน หรือ คนรู้จักที่เราอยากจะแชร์

- Just me คือ ไม่ให้ใครเข้าถึงได้นอกจากเราคนเดียว



- ถ้าเราเลือกแบบ Peple i choose... มันก็จะมี account ให้เราเลือกว่าจะแชร์ให้ใครบ้าง แล้ว สามารถทำไรได้บ้าง

7. เมื่อเรามี folder ที่เราต้องการแหละ เราก็คลิกขวา ที่ folder ที่เราต้องจะเก็บไฟล์ไว้ ในรูป ข้อ 5 ซึ่งตัวอย่างนี้จะคลิกที่ Temp มันก็จะขึ้นประมาณนี้ ซึ่ง ขณะนี้ใน Temp ยังไม่มีสักไฟล์



8. มองไปที่ด้านซ้ายบน จะเห็นคำว่า Add files คลิกมันซะ มันก็จะมีปุ่ม Browser ให้เราเยอะเลย เลือกไฟล์ และทำการ Upload โดย คลิกที่ปุ่ม Upload ด้านล่างขวา



9. ถ้าไฟล์ที่ upload มีขนาดใหญ่ ก็ต้องรอนานหน่อย กว่าจา upload เสร็จแต่ถ้าไฟล์ เอกสารเล็กๆ แป๊ป เดียว ซึ่งถ้า upload สำเร็จก็จะเห็นไฟล์นั้น ด้านบนชื่อ folder ดังตัวอย่าง จะเห็น test.rar เราสามารถเลือกมุมมองได้โดยคลิกที่ Views คล้ายๆ ในระบบ windows



10. เมื่อเราต้องการส่งลิ้งสำหรับดาวน์โหลดไฟล์นี้ให้เพื่อน เราก็คลิกสักครั้งที่ชื่อไฟล์ที่จะส่งให้เพื่อน จะเห็นทางด้านขวามือ ซึ่งจะมี tag html ให้เราคัดลอกใน Web address : แล้วส่งให้เพื่อนได้เลย

- Web address : คือ ลิ้งสำหรับดาวน์โหลดไฟล์โดยตรง

- Embed : มันเป็นการสร้าง icon สำหรับดาวน์โหลดไฟล์ ไว้สำหรับแปะบนเว็บ



# เราสามารถลบไฟล์ที่ upload ได้โดยสังเกตเมื่อเราคลิกที่ไฟล์นั้นแล้ว เมนูด้านบนจะมีคำว่า Delete

# เราสามารถเปลี่ยน รูปแบบ folder ที่เราได้สร้างไว้ได้ เช่น เราสร้าง folder เป็นแบบ public แล้วเรา upload ไฟล์ไว้ตั้งเยอะ ที่นี้เราไม่ต้องการให้ใครเข้าถึงมันได้ เราสามารถเปลี่ยน การเข้าถึงได้โดย

- คลิกที่ folder นั้นเลือก Folder options

- คลิกที่ Change permissions ถ้าต้องการเปลี่ยนรูปแบบการเข้าถึง แต่ถ้าต้องการลบให้เราคลิกที่ Delete

# แค่นี้เราก็ได้ online storage แหละ ^^'

Monday, November 10, 2008

แปลงเพลง Audio CD เป็น MP3 ด้วย Winamp

How to convert audio cd to mp3 with winamp.

1. ใส่แผ่นเพลง Audio CD เข้าไปในไดร์เรา จากนั้นเปิดโปรแกรม winamp ขึ้นมา มองไปทางด้าน ขวาล่าง



2. คลิกขวาแล้วเลือก Manage Playlists...



3. ให้เราทำการ คลิกขวา ที่ Audio CD (E:) อาจเป็นไดร์ อื่นที่ไม่ใช่ E: ก็ได้ โปรแกรมจะทำการโหลดเพลงลงทางกรอบด้านขวา



4. จากนั้นให้เราทำการคลิกขวาที่ Audio CD (E:) เลือก CD ripping perferences... เพื่อปรับแต่งเพลง



5. ที่แท๊ป Encoder ให้เราเลือกนามสกุลไฟล์ที่เราต้องการ เช่น MP3 และทำการเลือก Bitrate ปกติเลือก 128 พอ



6. เลือกพาธที่เก็บไฟล์ เมื่อเราทำการแปลงไฟล์สำเร็จ เราสามารถเข้าไปดูไฟล์ที่ทำการแปลงแล้วตามพาธนี้ ส่วนช่องด้านล่างเป็นการกำหนดการตั้งชื่อไฟล์ว่าเราจะตั้งในรูปแบบใด เราไม่จำเป็นต้องแก้ไข



7. กด Close ที่มุมซ้ายด้านล่าง หลังจากปรับแต่ไฟล์ที่เราต้องการได้แล้ว คลิกขวาที่ Audio CD (E:) อีกครั้ง ที่นี้เราเลือก Rip audio CD



8. เมื่อเราเลือก Rip audio CD เรียบร้อยแล้วโปรแกรมทำการแปลงไฟล์ทีละไฟล์ เมื่อแปลงเสร็จเราก็เข้าไปดูไฟล์ที่แปลงแล้วในพาธตามข้อ 6 ค่าเริ่มต้นจะอยู่ที่
C:\Documents and Settings\[User]\My Documents\My Music



# [User] เช่น ถ้าคุณ login เข้า windows ด้วย Home พาธก็จะเป็น
# C:\Documents and Settings\Home\My Documents\My Music

Tuesday, November 4, 2008

หาพิกัด Google Map ด้วย Youtube

Find latitude and longitude of Google Map with Youtube.

# One way for correct this problem is youtube.com

# You can use youtube.com find latitude and longitude

How to?

1. Log in on youtube with your account.

2. Click upload button.



3. Look at "Date and Map:" Options click "choose option" link.



4. It will be appear google map.



5. U must drag marker into your target for get latitude and longitude.



6. Look at "Map Vedio:" in box you can get latitude and longitude.



7. "geo:lat" = latitude and "geo:lon" = longitude .

8.Unnecessary use all decimal number.

Popular Posts