Powered By Blogger

04 July 2007

ruby ,trim , strip , sketchup script , rails กับภาษาไทย

วันนี้ มาพูดถึง Ruby On Rails ( RoR ) กันต่อ
จดไว้กันลืม ด้วยครับ

ruby ไม่มีคำสั่ง trim แต่มี คำสั่ง ที่เหมือนกัน คือ strip
เช่น
" foo ".strip # returns "foo"
[first_name, last_name].each { s s.strip! } # ทำทั้ง array
หรือใช้ strip! เพื่อปรับปรุงทันที
เช่น
mydata = " test this is a book "
mydata.strip!
puts mydata # จะได้ "test this is a book"



ibrary สามารถ ใช้ได้ กับ Rails ได้ โดยแยกเป็น แฟ้มๆ
แล้วแทรกไว้ ใน controller หรือ view ได้ เช่น
ใน *.rhtml แทรกโค้ด ต่อไ ปนี้ไว้ เพื่อ add library


โดย ใน lib1.rb มีคลาสอยู่ จะทำให้เรียกใช้งานได้
lib1.rb เก็บไว้ใน path ที่หาได้ โดย Dir.pwd ( หา Current Directory )
แต่ปัญหา ของ rail ก็มีอยู่ที่ *.rb ไม่ support thai ( เท่าที่ผมลองดู ใช้แล้วแจ้ง error , utf ก็error ) เลย
งาน ที่ต้องใช้แสดงผลภาษาไทย เลยไม่เหมาะจะอยู่ใน library นี้
ยังรอดอยู่บ้างตรงที่ *.rhtml support ไทย ดังนั้น code ต่างๆของฟังก์ชัน
ที่ใช้ภาษาไทย เช่น วันที่ อาจเก็บไว้ที่ *.rhtml ของวิว แทน

ตัวอย่างโค้ดเก็บวันที่ เช่น



<%     def monthname_th(m)       nm =  ['มค.','กพ.','มีค.','เมษ','พค.','มิย.' , 'กค.' , 'สค.','กย.' ,'ตค.', 'พย' , 'ธค' ]       nm[m-1]   end %>

เป็นโค้ดแสดงเดือนไทยจาก วันที่ เมื่อ m เป็นตัวแปรชนิด date

และก็เพิ่งรู้ว่า sketchup (free)

สามารถ รัน Ruby Script ได้

ลองดูแล้วก็ทำได้จริงๆ ใช้ Generate line แบบง่ายๆได้ แสดง Html Form ได้

แสดง webpage window ได้ และอื่นๆ อีกมาก

ลอง ทดสอบ generate line ของสมาการ พาราโบลา 2 มิติง่ายๆ ดู พอได้แต่ไม่ชำนาญ

ทำโดย สร้าง file *.rb สมมุดิ ชื่อ Info.rb

สร้าง class ภายใน และเรียกใช้ class ดังนี้











class Info
def getCurDir
Dir.pwd
end
def msgbox(s )
UI.messagebox( s )
end
def draw_line_test()
model = Sketchup.active_model
pt1 = [0, 0, 0]
pt2 = [10, 10, 10]
model.entities.add_line(pt1, pt2)
pt2 = [0, 10, 10]
model.entities.add_line(pt1, pt2)
pt2 = [10, 0, 10]
model.entities.add_line(pt1, pt2)
end
def draw_line_test2()
model = Sketchup.active_model
z0 = 0
zn = 0
(-20).step(20,0.5){ x
z1= y = x * x / 10
z2 = y = (x+1) * (x+1) / 10
if x == -20
z0 = z1
elsif x == 20
zn = z2
end
pt1 = [x, 0 , z1]
pt2 = [x+1, 0 , z2]
model.entities.add_line(pt1, pt2)
}
end
end # class

#### start create class and call function
i = Info.new
i.draw_line_test
i.draw_line_test2
i.drawtext_test
i = nil






เซฟไว้ที่ c:\Info.rb
แล้ว เรียกใช้ ผ่าน RubyConsole ของ Sketchup
โดย ใช้คำสั่ง load
load 'c:\Info.rb'

ข้อควรระวัง คือ ต้องเป็น โคด แบบเดี่ยว ' ไม่ใช่ แบบ " ไม่เช่นนั้น อาจต้องใช้ string

แบบ "c:\\Info.rb" แทน แต่ยังไม่ได้ทดลอง

หลังจาก กดEnter ให้รัน จะได้ รูป ทรงแบบง่ายๆ ใน sketchup pro



เขียนไว้กันตัวเอง ลืมด้วยครับ
ช่วงนี้ ศึกษาหลายภาษา




13 June 2007

Mastermind

ข้อความเกี่ยวกับ คำนี้ ครับ
ได้ยินมา จาก Yuri.exe เกมส์ น่ะครับ Red Alert เลยหามาให้อ่านๆกัน เผื่อใครเล่นเกมส์นี้ บ่อยๆ
" yuri is master " :)
" he enlighted me " :)

http://en.wikipedia.org/wiki/Mastermind_%28Role_Variant%29
http://en.wikipedia.org/wiki/INTJ
http://en.wikipedia.org/wiki/Intuition_%28MBTI%29

http://keirsey.com/personality/nt.html
http://keirsey.com/personality/ntej.html


ส่วนอันนี้เป็น พวก Field Marshal
http://keirsey.com/personality/ntij.html
http://en.wikipedia.org/wiki/Field_Marshal
http://en.wikipedia.org/wiki/INTJ


แบบประเมินผลคร่าวๆ ในทางทฤษฏี ยังไม่ได้อ่านเลย
http://en.wikipedia.org/wiki/Keirsey_Temperament_Sorter

สภาประชาชน ekklesia cratia ความหมายคร่าวๆ

คำว่าสภาประชาชน
ช่วงนี้ได้ยินๆมาบ้าง ก็เลยสงสัยว่ามันคืออะไรกันแน่

เลยไปค้นหามา ได้จากเวปต่างๆดังนี้


http://pagebang.com/cgi/nph-proxy.cgi/111011A/http/th.wikipedia.org/wiki/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%8A%E0%B8%B2%E0%B8%98%E0%B8%B4%E0%B8%9B%E0%B9%84%E0%B8%95%E0%B8%A2

ประมาณ คร่าวๆ คือ

สภาประชาชน หรือ “ekklesia” ซึ่งเป็นที่รวมของรายชื่อประชาชนทั้งหลาย) อีกคำหนึ่งที่ประกอบคือ “cratia” ที่มีความหมายถึง ระบอบการปกครอง อันอาจจะสรุปความหมายของประชาธิปไตยได้จากสุนทรพจน์อันลือเลื่องของประธานาธิบดีลิงคอล์น อดีตประธานาธิบดีสหรัฐอเมริกาที่ว่า ประชาธิปไตยคือการปกครอง “ของประชาชน โดยประชาชนและเพื่อประชาชน”

และโดย เวปที่เกี่ยวกับ ศาสนาคริส อธิบายการแปลความหมายจาก ศัพท์ ของคำนี้
คือเวปนี้ http://www.bible-truth.org/Ekklesia.html#N_2_
เขียนแปลไว้ว่า

In classical Greek the word "ekklesia" meant "an assembly of citizens summoned by the crier, the legislative assembly."(2) The word as used in the New Testament is taken from the root of this word, which simply means to "call out." In New Testament times the word was exclusively used to represent a group of people assembled together for a particular cause or purpose. It was never used exclusively to refer to a religious meeting or group.

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

หรือถ้าจะอ้างอิงให้ชัดกว่านั้น ก็ ที่ http://www.searchgodsword.org
http://www.searchgodsword.org/lex/grk/view.cgi?number=1577
จะเป็น dictionary ของคำศัพท์ ที่อยู่ใน bible
เป็น New Testament Greek Lexicon

ส่วน cratia นั้น หาข้อมูลไม่ค่อยเจอ เหนื่อยเลย
พบ ที่ Encarta ของ msn ที่
http://encarta.msn.com/dictionary_/democracy.html

ด้านล่างสุดเขียน ผมแปลเอาเองว่า เป็น คำลาติน มาจากคำว่า demo cratia ซึ่งมาจาก คำว่า ปกครองโดยผู้คน
demo = people + kratos ( greek ) = rule

ดังนั้นจึง คล้องจองกับ ความหมายของคำว่า democracy ในข้อ 4
ที่แปลว่า control of organization by members ที่
แปลง่ายๆว่า ระบบที่ถูกควบคุมโดยสมาชิกของระบบเอง

คำนิยาม ง่ายๆ จริงๆ เลย แต่หายาก

ไม่แน่ใจ ว่าเหมือน self -organizing System (SOS) ใน Computer หรือเปล่าน่ะ
ก็ลอง เอาๆ มาฝาก เรื่อง SOS ไว้ ว่างๆ จะลองอ่านดู คร่าวๆ ก็น่าจะต่างกันนะ
แต่ ชื่อคล้ายกัน เลยพาให้นึกถึง เลยเอาลิงค์มาฝากไว้หน่อยแล้วกัน
http://www.calresco.org/sos/sosfaq.htm#6.1

new program uploaded & Ruby generate html

เมื่อวาน เพิ่งทำโปรแกรมแกรมดูข้อมูล HardDisk ใช้เอง ที่ทำงาน เสร็จ
Tsb::FileSize.NET
แสดงขนาดของแฟ้ม พร้อมด้วย แสดงกราฟแบบวงกลมได้ (Pie Graph )
รวมถึง อาจใช้เพื่อคำนวณ ขนาดของ Folder ที่เลือกหลายๆ Folder ได้ด้วย
แล้วก้อบ ไป ไว้ที่ MS Excel เพื่อทำกราฟ ออกรายงานต่อไป ก็ได้
( อันนี้ต้อง Manual หน่อย นะครับ )







วันนี้ ลองใช้ Ruby มา Generate HTmL File ดู
หลังจากเคยลองด้วย vb.netแล้ว
แต่ Ruby เขียนสั้นดี

ทีแรกกะว่าจะลองเขียน Parse TextFile ด้วย Ruby ด้วยแต่ยังไม่ค่อยชำนาญ
ช่วงๆนี้เลยแค่ๆ ลองเขียน ด้วย VB.netก่อน

ตัวอย่าง โค้ด Ruby ก็ดังนี้นะครับ


ให้เปลี่ยน < ===> "<"
> ==> ">"






def contentheight
200
end
def html
"<html>#{title}#{body}"
end
def title
"<title>Test Html Gen</title>"
end
def menuitem(i )
"<div style='background-color:lightblue;'>
menu #{i}</div>
"
end
def leftmenu
tab2("
#{menuitem(1)}
#{menuitem(2)}
#{menuitem(3)}
#{menuitem(4.2)}
",
"width=150 bgcolor=silver ",
"height=#{contentheight} valign=top " )
end
def tab1(s , att)
"<table border=0 cellspacing=0 cellpadding=1 #{att}>
<tr><td>
#{s}
</td></tr>
</table>"
end
def tab2(s , att ,attrtd)
"<table border=0 cellspacing=0 cellpadding=1 #{att}>
<tr><td #{attrtd}>
#{s}
</td></tr>
</table>"
end
def footer
tab2(" Copyright ",
"width=100% bgcolor=lightyellow " ,
" colspan=2 valing=center align=center ")
end
def topmenu
tab1("home download ","width=100% bgcolor=orange")
end
def data
tab2(
"data ",
"bgcolor=white width=100% height=#{contentheight}",
" valign=top " )
end
def tabtr
"
</td></tr>
<tr><td>
"
end
def tabtd(attr)
"
</td>
<td #{attr}>
"
end
def content
s = leftmenu + tabtd("align=left valign=top")
s = s +data
tab2(s ,
"width=100% bgcolor=lightnavy" ,
"width=100 valign=top ")
end
def body
topmenu + content + footer
end
def main
html
end

p main

f = File.open('htm.html',"w")
f.print(main )
f.close


08 June 2007

ตัวอย่างโปรแกรม Ruby ลบแฟ้มและ directory



ตัวอย่างโปแกรม Ruby สำหรับ ลบ TempFile
ใน Internet Explorer
โดยลบทั้ง file และ folder
และป้องกันปัญหาที่เกิดขึ้นเมื่อ มีการ ลบแฟ้มที่ลบไม่ได้ ซึ่งจะแจ้ง error แล้ว ทำงานต่อไป

ในที่นี้ สมมุติ user login windowsxp คือ css1

listtempfile(false) สำหรับ แสดงข้อมูล เท่านั้น
listtempfile(true) สำหรับลบ ด้วย

การ Run Program
C:\>ruby app1.rb


#---------------------------------
#file : app1.rb

dir1 = 'C:\Documents and Settings\css1\Local Settings\Temp'
dir1 ='C:\Documents and Settings\css1\Local Settings\Temporary Internet Files'
dir1 ='C:\Documents and Settings\css1\Local Settings\Temporary Internet Files\Content.IE5'


def listallfile(dir1)
puts dir1
i = 0
delcount = 0
Dir.chdir(dir1 )
Dir.foreach(dir1) { x
i += 1
print("Got #{i} " + x + ' ' + File.size(x).to_s)
if FileTest.directory?(x) and x != '.' and x != '..'
print (' [dir]')
Dir.foreach(x) {y
puts " Gots #{y}" + ' ' + FileTest.directory?(y).to_s
}
end
puts ""
}
end

def listtempfile( isdel )
dir1 ='C:\Documents and Settings\css1\Local Settings\Temporary Internet Files\Content.IE5'
puts dir1
i = 0
delcount = 0
Dir.chdir(dir1 )
Dir.foreach(dir1) { x
i += 1
print("Got #{i} " + x + ' ' + File.size(x).to_s)
if FileTest.directory?(x) and x != '.' and x != '..'
print (' [dir]')
Dir.foreach(x) {y
puts " Gots #{y}" + ' ' + FileTest.directory?(y).to_s
if isdel and ( not FileTest.directory?(y))
begin
fname = x + '\\' + y
print 'try delete ' + fname
File.delete(fname )
print " deleted"
rescue Exception => ex
print " can not delete " + ex
end
puts "" #new line
end

}
# del dir
if isdel
begin
puts "try to delete " + x
Dir.delete(x )
rescue
puts "can not delete dir " + x
end
end
end
puts ""
}
end


def delallfile(dir1)
i = 0
delcount = 0
Dir.chdir(dir1 )
Dir.foreach(dir1) { x
i += 1
puts("Got #{i} " + x )
begin
if ( File.stat(x).file? )
delcnt = File.delete(x )
delcount += delcnt
end
rescue Exception => detail
puts "can not delete " + x + " " + detail
end
}
puts "deleted #{delcount} file(s) "
end

#-----------------

#listtempfile(false)
listtempfile(true)

#---- end of file



อย่ารันเล่นนะครับ ไม่รับประกัน ความผิดพลาด นะครับ

05 June 2007

Ruby On Rails กับ MySQL , Thai Character display

การแสดงผล ภาษาไทย
รับข้อมูล ภาษาไทย จาก form
ใส่ใน mysql อาจทำให้ ตัวหนังสือที่แสดงออกภายหลัง กลายเป็น ???????? แทน

แก้ไขได้ ดังนี้ คือ

เพิ่ม โค้ด

---------------------------------------------
before_filter :configure_charsets

def configure_charsets
@headers["Content-Type"] = "text/html; charset=TIS620"

suppress(ActiveRecord::StatementInvalid) do
ActiveRecord::Base.connection.execute 'SET NAMES TIS620'

end
end
----------------------------------------------

ไว้ที่ส่วนต้น ของ ทุกๆ Controlers แล้วก็ ลองป้อนและแสดงข้อมูลใหม่ทาง browser
ไม่จำเป็น ต้อง Restart webserver ครับ ลองๆ
ดูแล้ว ก็ใช้งานได้

ผมใช้ AppServ mysql เป็น ฐานข้อมูล ก็ใช้งานได้ เปลี่ยนจาก ??? มาเป็น ภาษาไทยได้ทันที

ตัวอย่าง เช่น
class EbitController < ApplicationController
before_filter :configure_charsets

def configure_charsets
@headers["Content-Type"] = "text/html; charset=TIS620"

suppress(ActiveRecord::StatementInvalid) do
ActiveRecord::Base.connection.execute 'SET NAMES TIS620'
end

end #def

...... โค้ด ส่วนอื่นๆ เช่น def

end #class
----------------------------------

จริงๆแล้วก็ไม่เข้าใจความหมายหรอก
อ่านมาจาก คนที่ชำนาญกว่า ที่เวปนี้ครับ
http://weblog.punneng.com/index.php?m=200607&paged=2

Ruby update ข้อมูล กับ database ด้วย console

หลังจาก ลองมั่วๆ Ruby OnRails มาสักสามสี่วันแล้ว มึนๆเลย

ก็เลยลองทวน basic กันหน่อย
โดยใช้

Ruby script/console เพื่อช่วยเรียน rubyเอง

สร้าง model ชื่อว่า user (table users )
ด้วย ruby script/generate model user user <-- ไม่ค่อยแน่ใจ
กับ controller
ด้วย ruby script/generator scaffold mydb user
แล้วเปิด ruby script/server เป็น web server
แล้ว เข้า page ด้วย http://localhost:3000/user

พอดีต้อง ปรับปรุง model แต่ไม่ค่อยเข้าใจ ActiveRecord เลยหาทาง
ทำความเข้าใจ ก็เลย ลองใช้วิธี console ช่วยให้เข้าใจ มากนิดนึง

ก็ เปิด ruby script/console
ทีนี้ ลองสร้าง
u = User.new ( ) ทำเท่าไร ก็ error เลยหาข้อมูลสักพัก หลังจากไปนั่งอ่านเวปสนุกๆ
พอ กลับมา ก็เปิด fxri ปรากฏว่าโหลดนานพอดู เพราะเครื่องช้าไปนิด
แล้วก็ ใส่ keyword ลองเดามั่วๆ หาคำว่า connection

พบ ActiveRecord::Base.establish_connection ก็เป็นการเดาล้วนๆ
เดาจาก ADODB ของ VB6 เพราะว่า ก่อน ใช้ RecordSet ต้องเปิด connectionก่อน
เพราะ เดิม แจ้ง error ว่า login เข้าเบส ไม่ได้คล้ายๆ ไม่มี การใส่ password

ได้คำอธิบายว่า ทำแนวๆนี้
ActiveRecord::Base.establish_connection( :adapter => "mysql", :host => "localhost", :username => "myuser", :password => "mypass", :database => "somedatabase" )

ก็เลยแก้ไขนิดหน่อย แล้วก็ไป Paste ใน console
ผลคือ มันคล้ายๆทำงานแทน database.yml ใน directroy config
ซึ่งก็คือ มีการเปิด connection ใหม่ให้
คราวนี้
ก็ลอง

u = User.new( )
ได้ผล ใช้งานได้ ได้ instance u สำหรับจัดการ Table Users มาแล้ว

ทีนี้ลองใช้ ดึงข้อมูลล่ะ
rows = User.find ( :all ) ได้ผลครับ ออกมา 2 แถว
อ้างได้ด้วย
rows[0].name = "new name"
rows[0].save
ผล คือ database ใน phpMyAdmin เปลี่ยนตามทันทีเลย

หรือจะลองด้วย เงื่อนไข where กับ first
cond = [ "name=? and password = ? " , "myname" ,"mypass" ]
row = User.find (:first , :conditions => cond )
ก็ได้ผลเหมือนกัน แต่ได้ แถวเดียว
แล้วแก้ไขโดย
row.name= "newname1"
row.save


หากจะค้นหาด้วยเงื่อนไขอื่นๆ อาจใช้ like เช่น
row = User.find(:first, :conditions=> "name like '%user%'" ) ก็ได้

04 June 2007

ลองทำ model 3D จาก google sketchup 6

ใช้เวลาว่างสัก 15 นาที ลองๆทำดู โดยมีรูป notebook ค้นหาจาก web
รูปตัวอย่าง ที่นี่
sketch up สามารถ ทำ 3d โดยเลียนแบบ จากภาพถ่ายได้
ลองๆทำดู ก็ช่วยให้ ระบุตำแหน่งของ วัตถุโดยใช้การ map ด้วยภาพถ่ายได้ง่ายขึ้น
เช่นจากรูป จะเห็นว่า จะระบุ ตำแหน่งของ keyboard , mouse pad ได้ง่าย

โดยการใช้ Import รูป ให้เป็น texture
แล้วค่อยมา ใช้ popup menu : Texture > position
ถือเป็นโปรแกรมฟรี ที่นำรูปทรง 3 มิติจากโลกจริง มาสู่โลก virtual ได้อย่างค่อนข้างสะดวก
แม้อาจจะ เหมาะสำหรับงานที่มีรูปทรงไม่ซับซ้อนนักก็ตาม









หลังจากนั้น หากเป็น โปรแกรม Sketchup Pro 6 สามารถ Export ออกไปสู่
3D Max ได้ เพื่อ Render ให้เหมือนภาพถ่ายอีกครั้ง และอาจนำภาพที่ได้
ไปตกแต่ง ร่วมกับ PhotoShop ต่อได้
ซึ่งก็คิดว่า การ สร้าง model เริ่มต้อนที่ sketchup น่าจะเป็นวิธีการขึ้นรูป 3d ที่ไม่ซับซ้อนมาก
ที่สะดวกมากๆวิธีหนึ่ง


ลองทำ model 3D จาก google sketchup 6

ลองๆทำดู


sketch up สามารถ ทำ 3d โดยเลียนแบบ จากภาพถ่ายได้

ลองๆทำดู ก็ช่วยให้ ระบุตำแหน่งของ วัตถุโดยใช้การ map ด้วยภาพถ่ายได้ง่ายขึ้น


เช่นจากรูป จะเห็นว่า ใช้อะไรในการแมพ

27 May 2007

น้ำตาลเทียม_ความหวานเทียม

เมื่อวานซื้อ น้ำอัดลมมากิน
เห็นข้างกระป๋องเขียนเกี่ยวกับ ว่าใช้สารที่ช่วยทำให้หวาน คือ

ใช้สารเอสปาแตม และอะซิซัลเฟม เค เป็นสารให้ความหวาน

ลองหาข้อมูลของ เอสปาแตม ซึ่งพบว่า อาจมีผลกระทบบ้าง ดังนี้

http://my.dek-d.com/writer/story/viewlongc.php?id=96382&chapter=72

ส่วน ใน wikipedia เขียนไว้ดังนี้ นะครับ
http://en.wikipedia.org/wiki/Aspartame

24 May 2007

เห็นกงจักรเป็นดอกบัว

เห็นกงจักร เป็นดอกบัว

เจอเข้ากับตัว เพิ่งรุ้ว่า คำโบราณ ยังขลังจริงๆ

http://www.krusakon.com/sontanaa/view.php?No=2019

23 May 2007

ตัวอย่างโปรแกรม IronPython ( .NET 2.0)

เป็นตัวอย่าง WinForm ด้วย Iron Python for .NET
ซึ่งโปรแกรม นี้ ต้องลง .NET 2.0 Runtime ก่อน
โปรแกรม Iron Python โหลด ได้จาก http://www.codeplex.com/IronPython ขนาดไม่ใหญ่นัก ไม่เกิน 5 MB
แต่ อาจต้อง ติดตั้ง .NET 2.0 Redistribut ที่อาจตัวใหญ่หน่อย
หรือ ถ้า ได้ติดตั้ง VS.NET 2005 Express แล้วก็ไม่ต้อง ติดตั้ง Redistribut อีก

ตัว Ironpython สามารถ integrate เข้ากับ VS.NET ได้ ตามคู่มือ แต่ยังไม่ได้ทดลองทำ
ในตัวอย่าง นี้ลองเขียนด้วย notepad
และ run โดย ใช้


c:\>ipy db.py


โดย db.py จะเป็นไฟล์ที่เก็บ โปรแกรมนี้
ใน package ของ iron python อาจจะไม่มีข้อมูล วิธีการเขียน python นัก
แต่อาจหาได้ โดย อ่าน Help ของ Python 2.5 ที่โหลดและ ติดตั้งจาก http://www.python.org/

ตัวโปรแกรม จะทำหน้าที่ สร้าง Form และ สร้าง Control ตาม Table ตาม
Odbc DataSoure , Database ที่ใช้ เป็น MSAccess และดึงข้อมูล Table เข้า
สร้างเป้น Field Label , TextBox, ComboBox สำหรับ LookupTable ที่หน้าจอ
และ มีการ ผูก Event Click เข้ากับ Function

โค้ด มีดังนี้




import clr
clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")
clr.AddReference("System.Data")

import System.Windows.Forms as WForm
import System.Drawing as    Draw
import System.Data as    Data
import System.Data.Odbc as    Odbc
import System.Console as Con

class Form1(WForm.Form):
def __init__(self):
Con.WriteLine("OK")
self.Text= "OK"
self._mLeft = 175
self._mTop = 10
#self.BackColor= Draw.Color.White
#self.addControls()
self.addCtrlDb()
@property
def mLeft(self):
return self._mLeft
@property
def mTop(self):
return self._mTop

# not use now
def addControls(self):
t = WForm.TextBox()
t.Text=  "dbApp"
self.Controls.Add( t )
self.Size=  Draw.Size(300 ,200)
def getCon(self):
str1 = "DSN=spt_import_cd";
self.dbg(str1)
cn = Odbc.OdbcConnection(str1)
cn.Open()
self.dbg(" ConnectOK")
return cn
def getDt(self,sql):
cn = self.getCon()
da = Odbc.OdbcDataAdapter(sql , cn)
dt = Data.DataTable()
da.Fill(dt )
return dt

def readToCombo(self ,combo ,sql , fldvalue , flddisplay):
dt  = self.getDt(sql)
for r in dt.Rows :
disp = r[flddisplay] + ''
combo.Items.Add ( disp )

def addCtrlDb(self):
cn = self.getCon()
sql = "select * from cd WHERE idcd = 0 "
da = Odbc.OdbcDataAdapter(sql ,cn )
dt = Data.DataTable()
row =da.Fill(dt )
cn.Close()

#self.AddLabel( "TableCD")
#self.NewLine()

lookupwi = 300
maxwi = 0
for col in dt.Columns:
self.dbg(col.ColumnName )
colname = col.ColumnName
self.AddLabel( colname)
if colname=="ProvID" :
sql2=  "Select * , ProvID & ':' & ProvName as ProvName2 from Province"
wi =self.AddLookupCombo(colname,sql2,"ProvID","ProvName2",lookupwi)
else:
if colname=="WhEnvID" :
sql2=  "Select * , WhEnvID & ':' & Title  as Title2 from WhEnvelope"
wi =self.AddLookupCombo(colname,sql2,"WhEnvID","Title2" ,lookupwi) 
else: 

wi = self.AddTextBox(colname )
if  wi > maxwi :
maxwi = wi
self.NewLine()
self.dbg("ListColAndCloseOK")
self.Height = self.mTop + 50
self.Width = self.mLeft + maxwi + 40
self.Text = "Table CD"

bt =  WForm.Button()
bt.Text = "Close"
bt.Left = self.mLeft
bt.Top = self.mTop
bt.Click += self.OnButtonClose
self.Controls.Add( bt )
self.Height += bt.Height

def AddLabel(self,name):
lb = WForm.Label()
lb.Name = "lb" + name
lb.Left =  20
lb.Top  = self.mTop
lb.Text = name
lb.AutoSize = True
self.Controls.Add(lb)
def AddTextBox(self,name):
t = WForm.TextBox()
t.Name = "tx" + name
t.Left =  self.mLeft
t.Top  = self.mTop
self.Controls.Add(t)
return t.Width
def AddLookupCombo(self,name,sqlsel,fldValue ,fldDisp,wi):
t = WForm.ComboBox()
t.Name = "cblookup" + name
t.Left =  self.mLeft
t.Top  = self.mTop
self.Controls.Add(t)
t.Width = wi
self.readToCombo(t ,sqlsel, fldValue ,fldDisp)
t.DropDownStyle = WForm.ComboBoxStyle.DropDownList

return t.Width
def NewLine (self ):
self._mTop += 23

def ListData(self,dsn):
str1 = "DSN=" + dsn;
self.dbg(str1)
cn = Odbc.OdbcConnection(str1)
cn.Open()
self.dbg(" ConnectOK")
cmd = cn.CreateCommand( )
cmd.CommandText = "SELECt * from cd "
rd = cmd.ExecuteReader()
while (rd.Read()):
self.dbg(str(rd["idcd"]) + ' ' + rd["Title"])
pass
cn.Close()
self.dbg(" CloseOK")
def dbg(self ,str1 ):
#WForm.MessageBox.Show(str1)
Con.WriteLine(str1)
#def OnButtonClose(*arg ):
def OnButtonClose(self ,ctrl, a ):
self.Close()

f = Form1()
WForm.Application.Run( f)











ปัญหา เท่าที่พบ คือ ไม่มี intellisense แต่ถ้าหากใช้กับ VS.NET และ มี Intellisense ได้
ก็น่าจะช่วยแก้ปัญหาได้
และ ปัญหาอีกอย่างที่พบ คือ Python หรือภาษาตระกูล นี้จะให้ความสำคัญกับ ย่อหน้ามากๆ
หาก มีการเปลี่ยนย่อหน้าหลายๆบรรทัดติดกัน การใช้ Editor notepad อาจไม่สะดวก
อาจใช้ editor ตัวอื่นๆ เช่น editplus แทน

และ พบว่า เราสามารถ compile code ของ iron python ให้เป็น .exe ได้
( แต่อาจต้อง ลง iron python ในเครื่อง ที่มี .exe นั้น ) โดย ทำตามขั้นตอนของ
การถามตอบ ดังนี้
http://lists.ironpython.com/pipermail/users-ironpython.com/2006-February/001825.html







In the IronPython distribution, Src/Scripts/Tests/compiler.py should
be enough to get started.

Here's a minimal example in IronPython:

# compiler.py
from IronPython.Hosting import PythonCompiler

from System.Collections.Generic import List
sources = List[str]()
sources.Add('hello.py')
outfile = 'hello.exe'

compiler = PythonCompiler(sources, outfile)
compiler.Compile()

Seo Sanghyeon





หวังว่า สำหรับใครที่ลองดู จะทำให้ งานง่ายขึ้น

รูปโปรแกรม หลังรันกับ database ตัวอย่าง ( ไม่ได้ให้มา ในนี้ )

15 May 2007

asp.net เซ็ต timeout

การ เซ็ต session timeout ของ ASP.NET นะครับ

ที่นี่ครับ

http://msdn2.microsoft.com/en-us/library/h6bb9cz9(VS.71).aspx
ใช้ attribute ชื่อ timeout ของ element ที่ชื่อ sessionstate นะครับ

ตัวอย่างเช่น (ลอกมาจาก เวปอ้างอิง )





05 May 2007

Troubleshooting the "The Binding Handle Is Invalid" error in Visual Studio 2005

แก้ปัญหา นี้ ใน ทั้ง Visual C# 2005 Express Edition และ
Visual Web Studio 2005 Express Edition เวลามีปํญหา
เวลารัน แล้ว ขึ้น msgbox ว่า
The Binding Handle Is Invalid
ซึ่ง ทำให้ เข้า Debug Mode ไม่ได้
ทำดังนี้ ตาม ลิงค์


http://blogs.msdn.com/habibh/archive/2005/11/10/491572.aspx

โดย สรุป คือ ให้ Enable Services ชื่อ 'Terminal Services'
เมื่อ ทำแล้ว จะรัน ใน Debug Mode ได้เลย ครับ

ตอนแรก ติดปัญหานี้อยู่เป็นเดือน ไม่ได้ ดีบักเลย นึกว่าลงโปรแกรมผิด
เพิ่งรู้ว่า จริงๆเป็นทริก เล็กน้อย แต่ก็เป็นปํญหาหนัก ถ้าแก้ไขไม่ได้ นะ

04 May 2007

Digital Sign MSAccess VBA

http://office.microsoft.com/en-us/access/HA011071651033.aspx
ถ้าเปิดMS Access 2003 จะพบว่ามีการแจ้งเตือน ด้านความปลอดภัย หากต้องการเปลี่ยนแปลง
ต้องมีการ ทำการ Digital Sign ก่อน ซึ่ง มีขั้นตอน วิธีการคือ
เราจะต้อง มีการลงทะเบียนขอ Certificate กับ บริษัทที่ให้บริการเช่น Vergisign หรือใน ไทยก็มี
ไม่แน่ใจว่า เป้น TOT หรือ กสท หรือบริษัทอื่นๆ อันนี้ไม่ทราบ


http://msdn2.microsoft.com/en-us/library/aa141471(office.10).aspx
แต่ถ้าต้องการ ใช้เฉพาะในเครื่อง หรือเพื่อทดสอบ
ก็ใช้ เครื่องมือชื่อ selfcert.exe ที่อยู่ใน Folder ของ Office 2003
เช่น
C:\Program Files\Microsoft Office\OFFICE11
แล้วป้อน ชื่อ ที่จะใช้เก็บใน certificate มันจะเข้ารหัสไว้ แบบ private-public key
จะไม่เห้น ไฟล์ใหม่ปรากฏขึ้น แต่ ms office จะรับรู้ได้

ให้เปิดไฟล์ msacess นั้นแล้ว เข้าไปที่ Visual Basic Editor
แล้ว ก็ เข้าเมนู Tools > Digital Signatures
แล้วเลือก Certificate ที่ต้องการ ในรายการ กดปุ่ม OK

แล้วปิด MS Access File เมื่อปิดใหม่ จะพบว่าไม่มีการถามแล้ว

ถ้าจะนำไปใช้ ที่เครื่องอื่น ก็ต้องไปรัน selfcert.exe ทำแบบเดียวกันที่เครื่องอื่นก่อนด้วย
แต่เราจะต้องจำ ตัวหนังสือที่เราป้อน ให้กับ selfcert.exe ให้ดี ด้วย หรืออาจใช้ชื่อที่เราใช้ประจำๆ ก็ได้
ปกติ เราก็ใช้แค่แบบเดียว สองแบบ เพราะถ้าใช้งานจริง คงไม่อยากจ่ายเงินให้กับผู้ให้บริการ certificate
หลายๆใบ


การ Sing จาก certificate นั้นจะทำโดย

03 May 2007

sqlcmd

from http://msdn2.microsoft.com/en-us/library/ms162773.aspx
sqlcmd Utility
ยอมให้คุณป้อน T-SQL statement,system procedure, script file ที่ command prompt ได้,
ทั้ง ใน Query Editor ใน SQLCMD mode ,
ใน windows script file
หรือ ใน cmd.exe ของ SQL Server agent job .

โปรแกรมนี้ใช้ OLE DB ในการรัน T-SQL แบบ แบทช์
ข้อสำคัญ
SQL Server Management Studio ใช้ SqlClient Class ใน .NET Framework ในการรันปกติ
และใช้ โหมด SQLCMD ใน Query Editor .

เมื่อ sqlcmd ถูกรันจาก commandline , sqlcmd จะใช้ OLE DB Provider.

เนื่องจากที่มีค่าเริ่มต้นที่ต่างกัน ก็อาจจะเห็นการทำงานที่ต่างกันได้ ในQuery เดียวกัน เมื่อใช้ในSQL Server Management studio ใน SQLCMD mode และใน sqlcmd utility .


...จะเห็นได้ว่า นอกจากจะใช้ graphics tools แล้ว เราก็อาจใช้sqlcmd.exe เพื่อรัน T-SQL ได้เช่นกัน ส่วนรายละเอียดนั้น ค่อนข้างมาก ในที่นี้ เขียนสั้นๆ และแค่มาแนะนำ นะครับ
from
http://msdn2.microsoft.com/en-us/library/ms165588.aspx
Overview of SQL Server Express .

SQL Server 2005 Express Edition เป็น database platform ที่อยู่บนพื้นฐานของ MSSQL Server 2005 , มาแทน MSDE . ทำงานร่วมกันได้กับ MS Visual Studio 2005, SQL Server Express ช่วยให้ง่ายในการสร้างapplicationที่เน้นงานด้านข้อมูล ซึ่งต้องเก้บข้อมูลจำนวนมาก , เพิ่ม ปลอดภัยของการเก็บข้อมูลมากขึ้น และติดตั้งระบบได้เร็วขึ้น

SQL Server 2005 Express Edition with Advanced Service ใน SQL Server Express เป็นรุ่นของ SQL Server Express ที่ได้รวม เครื่องมือ
สำหรับจัดการระบบในแบบ GUI, ความสามารถด้านการทำรายงาน และ ค้นหาแบบ text-based ได้

ทั้งสองรุ่น ให้ดาวน์โหลดฟรี สามารถ redistribute ได้ในเงื่อนไขของข้อตกลง
แต่ละรุ่น สามารถ ทำงานได้ทั้งเป็น client และ basic server database .
รุ่น Express เหมาะสำหรับ ISV , Server user , non-professinonal developers , web developer ,
Web site host , และผู้ที่ทำเป็นงานอดิเรก ซึ่ง สร้าง client application , ถ้าต้องการความสามรถระดับสูงกว่านี้ ควร upgrad เวอร์ชัน

http://msdn2.microsoft.com/en-us/library/ms165636.aspx
SQL Server Express Features
รุ่น Express สนับสนุนความสามารถส่วนใหญ่ของ Database Engine ของ SQLServer

หมายเหตุ
ถ้าเราสร้างและออกแบบ ข้อมูล ใน Express, สามารถปรับแต่งไปเป็น SQLServer 2005 ได้
แต่ไม่สามารถใช้ SQL Server version 2000 หรือต่ำกว่าได้

ต่อไปก็จะเป็นตารางแสดงสิ่งที่ SQL Server 2005 สนับสนุน
[ดูที่ต้นฉบับ]

ส่วนตารางต่อไป จะเป็น เรื่องของ Feature ที่มีใน SQL Server ร่นปกติ
แต่จะไม่มีใน SQL Server Express ซึ่งหลักๆก็คือ
[ดูที่ต้นฉบับ]
Reporting Services , Nofification Services , Integration Services , Analysis Services ,
Full text searcch , OLAP Service /Data Mining

from
http://msdn2.microsoft.com/en-us/library/ms365248.aspx
ส่วน SQL Server Express with Advanced Services Features นั้น
จะมี ฟีเจอร์เพิ่มมาอีกจาก รุ่น Express คือ
  • SQL Server Management Studio Express เป็นเครื่องมือแบบ graphic สำหรับจัดการดูแล SQL Server Database
  • Reporting Services รวม ตัวสร้างรีพอร์ท และสภาพแวดล้อมการออกแบบรายงาน ไว้
  • Full-text Search , เป็น Search Engine ที่ทรงพลังในการ ค้นหา ข้อมูลที่มีลักษณะ text-sensitive
ด้านล่างเป้นตารางว่าความสามารถไหน จะได้รับการสนับสนุน บ้าง จะไม่กล่าวถึง

02 May 2007

from
http://msdn2.microsoft.com/en-us/library/aa172787(SQL.80).aspx
Writing International Transact-SQL Statement

ถ้าต้องการให้ T-SQL Statement portableมากขึ้นให้ทำดังนี้
-เปลี่ยน char, varchar ,text ให้เป็น ncharm , nvarchar , ntext
ซึ่งจะทำให้ไม่ต้องเลือก codepage ในการเปลี่ยนชุดตัวอักษร
- เมื่อประมวลผลเปรียบเทียบ mount / day-of-week ให้ใช้
function dateparts() แทน datename() เพราะว่าแต่ละภาษาจะ ส่งค่ามาต่างกัน
อย่าโค้ด ใน program ให้ผูกกับ function datename เว้นแต่เมื่อจะแสดงผลอย่างเดียวเท่านั้น
- เมื่อ อ้างถึง วัน ในการเปรียบเทียบหรือ เป็น input ของ INSERT หรือ UPDATE
statement ให้ใช้ ค่าคงที่ ซึ่งจะแปลงไปเป็นค่าเดียวกันเสมอ ในทุกๆภาษา
ADO ,OLEDB ,ODBC application จะต้องใช้ รูปประโยคของ timestamp,date , และ time ในแบบ Odbc escape clause ลักษณะนี้
{ ts 'yyyy-mm-dd hh:mm:ss[.fff] '} เช่น: { ts '1998-09-24 10:02:20' }
{ d 'yyyy-mm-dd'} เช่น: { d '1998-09-24' }
{ t 'hh:mm:ss'} เช่น: { t '10:02:20'}

Application ที่ใช้ API อื่น หรือ T-SQL Script Store procedure และ Trigger จะต้องใช้
การเขียนในลักษณะ ที่เป้นตัวเลขที่เชื่อมต่อกันโดยไม่เว้นวรรค ตัวอย่างเช่น yyyymmdd เช่น 19980924

Application ที่ใช้ API อื่น หรือ T-SQL Script Store procedure และ Trigger อาจจะใช้
CONVERT Statement ร่วมกับการระบุ style parameter สำหรับทุกๆการแปลงค่าระหว่าง
ตัวแปรประเภท date และ smalldate และ character string และ data types .
ตัวอย่างเช่น ประโยคต่อไปนี้จะได้รับการแปลแล้วเหมือนกัน ในทุกๆภาษา หรือในทุกๆ การเซ็ตรูปแบบวันที่

SELECT *
FROM Northwind.dbo.Orders
WHERE OrderDate = CONVERT(DATETIME, '7/19/1996', 101)

ข้อมูล เพิ่มเติม ให้ดูที่ CAST และ CONVERT Statement

ทดลองส่งภาพ




ลองเอาภาพ ขึ้น blog เผื่อว่าวันหลังจะได้


นำภาพหน้าจอโปรแกรมที่แนะนำ หรืออื่นๆ มาให้ดูกันครับ




ภาพนี้ทำเอง ด้วย Google SketchUp 6


และ เร็นเดอร์ด้วย software free ที่ชื่อ blender อีกครั้ง




blender นั้น อาจจะสู้ 3D Max ไม่ได้ มีข้อดีอย่างเดียวคือ ฟรีครับ แต่เท่าที่ดู ใช้ยากและยังมี crash ระหว่างทางอีก










ส่วนอันนี้ เป็น iGoogle หรือ เป็นเว็ปที่เราจะ customizeได้ เมื่อ login เข้าสุ่ google Account ซึ่งจะเป็น mail ของเรา mail อะไรก็ได้ ไม่จำเป็นต้องเป็น g-mail แล้วเมื่อเข้าไปแล้ว เรา จะเลือก wiget (ช่องแต่ละช่อง ของ application ) มาใส่ เช่น นาฬิกา ปฏิทิน( บันทึกแก้ไขรายการได้อีกเยอะ) หรือ notepad หรือดิกชันนารี และการ์ตูนการ์ฟิว ข่าว




แต่ปัญหา ของ iGoogle ที่พบ คือ แม้จะเพิ่มหลาย tab แล้ว บางครั้งเมื่อใช้ๆไป


อยุ่ๆ tab หาย , widget ที่ใช้อยู่หาย ก็ต้องมาเพิ่มใหม่ไม่แน่ใจเหมือนกันว่าเพราะอะไร ลองๆเอาหน้าจอมา


ให้ดูกันน่ะครับ การล้อกin ก็จะใช้ Google Toolbar ที่เป็นรูป วงกลมสีเขียวเป็น ตัว singin , singoff


แล้วค่อยกด ตัวหนังสือ google ที่ toolbar เพื่อมาที่หน้าจอนี้




26 April 2007

วันนี้ลอง Ad Sense

ลองติดตั้ง Adsense ที่ web ทั้ง thaisoftbox และ ที่นี่
ว่าจะเป็นยังไง ทั้งๆที่เขาบอกว่า ให้ English เท่านั้นแต่ก็ลองๆดูก่อน
ไว้ค่อยๆดูกันไป จะได้เงินไหมเนี่ยะ counter ก็ไม่ได้มากมาย แต่
มันก็มีปํญหาเรื่องการ เข้าใช้ Ad Sense พอควร มันต้องใช้ account ที่ไม่ใช่ของ blog เพื่อที่จะ เข้าใช้ adsense ด้วย แต่สำเร็จแล้ว สังเกตได้จากส่วนหัวของเวป ที่มีอะไรแปลกๆ ของ google แปะอยู่

Adsense มี 3 แบบ คือ
1 แบบ โฆษณา โชว์แบนเนอร์เลย
2 แบบ แสดง link ไปหน้าของ แบนเนอร์
3 แสดง icon ให้คลิกเพื่อลิงค์ให้ผู้สมัครๆ ถ้าคนที่คลิกลิงค์ของเราสมัคร แล้วเขาทำเงินได้เยอะ เราจะได้เงินด้วย ครั้งละ 5 เหรียญ อันนี้คิดว่าน่าจะคล้ายๆ แอมเวร์นะแต่น่าจะได้อัตราที่น้อยกว่ากัน


วันก่อนลองใช้ IDE ของ Eclipse กับ PHP ที่เขาเรียกว่า โปรเจค PDT
แล้ว ก็พบว่า ง่ายดี มีทั้ง Intellisense + class outline
และยัง integrate กับ Appserve ได้อีกด้วย
แถมยังไม่ต้อง install ,extract แล้วใช้ได้เลย
แต่ปัญหา ว่า ก่อนใช้ ต้อง config server ก่อน ว่า root path ของ webserver อยู่ที่ไหน และ php.exe อยู่ที่ไหน กันแน่
ก่อนจะรัน

ส่วน config server นั้น ทำได้หลายๆตัว สำหรับ รันไฟล์ต่างๆกันไป
ถ้าจะเปลี่ยนไฟล์ที่รันก็ใช้ เปลี่ยนที่ config แต่ละตัวแทน

อาจพบปัญหาการใช้ ภาษาไทยบ้างที่ทำให้ save ไม่ได้
ก็ให้ แก้ด้วย notepad แล้ว save เป็น utf 8 แทนแล้ว
แล้วค่อย refresh ให้ eclipse รับรู้

----------
วันนี้ ลองเข้าหา คำว่า notepad พบว่า
มีเวปที่ อธิบาย สรรเสริญ ความสามารถของ notepad มากมาย
ว่า เป้น ~ The Internet's most versatile HTML editor
และ Universal file format รวมทั้ง compatible กับ html และ java รุ่นต่างๆ
ก้อดูเหมือนว่า จะจริงอย่างเขาว่า ถ้าไม่นับเรื่อง productivity ก็จริงหมดเลย
ที่นี่ notepad.org :)

ลอง counter ใหม่ด้วย ที่ http://www.webstat.net/ เพราะว่า เปลี่ยน Theme
ทำให้ code html เก่าที่ลิงค์ไว้ หายไปหมด รวมทั้ง counter ด้วย
ดังนั้นก็ลองกันใหม่ โดยเริ่มต้นไว้ให้ ที่ 400 แล้วกันครับ

เกือบเข้า blogger ไม่ได้

นึกว่าจะเข้าบล็อกนี้ ไม่ได้ ซะแล้วครับ

โชคยังดี ที่เข้าได้ ตั้งแต่วันอัพเดท บล็อกล่าสุดก็ไม่ได้เข้ามาอีกเลย เพราะเข้าไม่ได้
วันนี้มีเวลาว่างๆ บ้างเย็นๆ เลยหาทาง เข้า มั่วๆไปเรื่อยๆ

ค่อยยังชั่ว นึกว่า จะต้องได้ Account ใหม่ซะแล้ว

สรุป ตอนแรก ต้อง ใช้ mail ให้ผูกกับ google ก่อนและ reset password
แล้ว ค่อย นำ mail นั้นมา login และเลือก yes เพื่อ login ด้วย password ใหม่

C# กับ Method Split String ครับ

ใครที่กำลังใช้ C# อยู่อาจเห็นว่า Function Split ใน C# นั้นแตกต่างจาก
VB.NET อยู่มาก คือว่า มันมี prarameter เป็น char

ถ้าต้องการให้ ใช้ String ในการแยก ข้อความ ให้ทำโดย ใช้ Function ของ Web นี้ครับ
http://community.sgdotnet.org/blogs/triplez/archive/2005/04/24/14627.aspx

หรือ อีกวิธีก็ใช้ Regex class , static function ดังตัวอย่างนี้ครับ

String s = "Test ==> do you like it ";
String [] buf = System.Text.RegularExpressions.Regex.Split( s , "==>" ) ;

ก็จะได้ ผลลัพท์ เป็น
buf[0] = "Test" ; buf[1]="do you like it " ; ครับ
วิธีนี้ใช้ได้กับ String s ส่วนมากแต่ไม่ทั้งหมดนะครั้บเนื่องจากถ้าเป็น Regulaexprersion เช่นแยกด้วย จุด (.) ต้องใส่เครื่องหมายเป็นดังนี้ครับ
"\." ลองอ่านเพิ่มอีกทีนะครับ

=======================
update 25 april 200 7
จากลองเล่น C# ดูแล้ว ปรากฏว่า String.Replace(String, String , Enum บางอย่าง );
มันใช้งานได้ นะครับ แต่ว่าต้อง กำหนด ประเภทวิธีการเปรียบเทียบก่อน (enum นั่นแหละ )

ตัวอย่างการ ก้อบปี้ File ทั้ง Folder ด้วย VB.net กับ xcopy.exe ครับ

ตัวอย่างการ ก้อบปี้ File ทั้ง Folder ด้วย VB.net
กับ xcopy.exe ของ windows xp กันครับ

--------------

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Not txEnvWhiteAbsPath.Text.EndsWith("\") Then
txEnvWhiteAbsPath.Text &= "\"
End If
If Not IsNumeric(txCdID.Text) Then
MsgBox("หมายเลขซีดีต้องเป็นตัวเลขเท่านั้น", MsgBoxStyle.Exclamation)
Exit Sub
End If
Dim sNewPath As String = txEnvWhiteAbsPath.Text & "Cd" & txCdID.Text.Trim
Try
MkDir(sNewPath)
Catch : End Try
'Dim p As New Process
Process.Start("Explorer.exe ", sNewPath)
Dim sCmd As String = "c:\xcopy.exe "
Dim sArgs As String = DriveListBox1.Text.Substring(0, 2) & " " & sNewPath & " /I /E /V"
Shell(sCmd & " " & sArgs, AppWinStyle.NormalFocus, True)
MsgBox("สร้าง Folder และคัดลอกข้อมูลแล้ว กรุณาเอาแผ่นซีดีออก" & vbCrLf & sNewPath)
' txCdID.Text = ""
End Sub