Powered By Blogger

10 October 2010

install apache on centOS

ต้อง DEBUG  PHP บนเครื่อง CentOS
เคยลองบน  WinXP แล้ว มีปัญหา เลยต้องลง OS เ้อง เลย

************************************************

config  Apache httpd
บน  CentOS
ลองทำบน  CentOS Live CD
ไปโหลด Live CD ตัวเล็กๆ 700MB จาก


sudo yum install httpd mod_ssl


ตาม
http://articles.slicehost.com/2008/2/6/centos-installing-apache-and-php5
http://www.techiecorner.com/125/how-to-install-lamp-apache-php-and-mysql-in-linux-using-yum/

แต่ยังไม่ได้ลอง mysql + php


ตรวจสอบต้องตรวจโดย  su - ก่อนเพื่อเป็น root
แล้วค่อย ใช้
service httpd status
service httpd start 
ตาม  http://www.mail-archive.com/centos@centos.org/msg02899.html
http://www.linuxmail.info/how-to-start-stop-services-centos-5/

ลองเปิด web browser แล้วเลือก
Browse  http://127.0.0.1/  จะเห็นหน้า CenteOS


************************************************
ก่อน install อาจต้อง ติดตั้ง network ก่อน
set default gateway โดย
http://www.cyberciti.biz/faq/howto-rhel-fedora-linux-setup-default-gateway/

# vi /etc/sysconfig/networkSetup GATEWAY={Router-IP}, if router IP is 74.86.49.129, type:
GATEWAY=192.168.1.1
ตัวอย่าง IP แต่ส่วนมากเป็น .1.1

Restart network ด้วย


# /etc/init.d/network restart


แล้ว ถ้าขึ้น OK หมด ก็ ลอง ปิง  192.168.1.1 
แล้วค่อยลองปิง google.co.th


อ้ันนี้ตามที่ลองทดสอบ จะได้ DHCP จาก router เอง
เช่น  192.168.1.34 




******************************************************
install mysql โดย 
******************************************************


# yum install mysql               <-- mysql client  
# yum install mysql-server 
ต้องคอยตอบ y  เรื่อยๆ 


#service mysqld status 
#service mysqld start  


connect mysql client by 
#mysql  
will prompt  
mysql> 


check database by 
mysql> show databases;
mysql> show status; 




******************************************************
Enable Service SSH  for Remote Access ( command line ) 
******************************************************
# service sshd status 
# service sshd start 




--------------------------------------------------------------------
Install ftp  on centOS (NOT Complete ) 


Install 
ftp server ( not secure ) 
by 
# yum install vsftpd
# chkconfig vsftpd on
# service vsftpd start

OpenFirewall
# vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
# service iptables start   <--- or restart   

if want to  Disable Firewall   - > #service iptables stop  

Test FTP 
$ ftp localhost

open at 
# vi /etc/vsftpd/vsftpd.conf
$ man vsftpd.conf

--  Help on  vsftpd  -- 
==================




====================================
SET  FTP  On  CentOS  , Thai/English

http://www.linuxlane.com/vsftpd-fedora-core-6-server/   <-- Thai
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch15_:_Linux_FTP_Server_Setup
http://www.cyberciti.biz/tips/rhel-fedora-centos-vsftpd-installation.html


14 July 2010

HTTP KeepAlive

ไปหาข้อมูล เกี่ยวกับ Tag KeepAlive ใน HTTP

พบข้อมูลดังนี้

สรุปสั้้น ก็น่าจะเป็นว่า ประหยัด ทรัพยากรของ server
เพราะไม่ทำให้ server ต้องเชื่อมต่อ connection จำนวนมากเกินไป
เช่น user เปิด browser แล้ว กด refresh หลายๆครั้ง
ถ้าไม่มีการ keepalive ก็จะมีหลาย conncetion แต่ถ้ามี keepalive ก็จะมีแค่
หนึ่ง connection
แต่ก็ขึ้นกับ เวลา timeout ที่กำหนดโดย webserver ด้วย เช่น Apache WebServer
ปัจจุบันที่ที่ HTTP/1.1 จำกำหนด Default เป็น keepAlive อยู่แล้ว
ยกเว้นมีการกำหนด


Apache HTTP , มีการ support keepalive

เอกสารอ่านยากแนววิชาการมากหน่อย และใช้เวลามาก ก็ตัวนีี้
http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html
http://tools.ietf.org/html/rfc2616

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

ที่กล่าวมาก่อนหน้าจะเป็นการพูดถึง HTTP - KeepAlive แต่จริงๆก็จะมี TCP KeepAlive ด้วย
ซึ่งเป็นการทำงานในระดับ network ระดับล่างที่ต่ำไปกว่า Level ของ HTTP
โดย HTTP นั้นจะอยู่ที่ระดับ Leyer 7 ของ TCP/IP Stack คืออยู่ระดับ Application
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

อันนี้ก็พูดกันไปถึง  SYN/ACK เป็น TCP/IP Protocol ระดับล่างๆเลย ไม่กล่าวถึงในที่นี้
เพราะก็ยังไม่ค่อยเข้าใจนัก

25 November 2008

เปลี่ยน port mysql ใน AppServ

ในที่นี้ เนื่องจาก ติดตั้ง mysql 2 instance บนเครื่องเดียวกัน
และ มีการ ใช้ port ชนกันจึงต้องเปลี่ยน ที่ ตัวหนึ่้ง
( หลังจาก มีการเปลี่ยน port ของ apache web server ไปแล้ว )
โดยให้ instance ตัวหนึ่ง ใช้ port 3306 ปกติ
และอีกตัว ใช้ port 3307

ต้องการเปลี่ยน port ก็ แก้โดย
C:\AppServ\MySQL\my.ini

เปลี่ยน section
[client]
port=3306

ให้กลายเป็น
[client]
port=3307

และต้องเปลี่ยน phpMyAdmin อีกให้ มองเห็นตัวนี้ รวมทั้ง เมื่อจะติดต่อด้วย php
ต้องเรียกด้วย
$link = mysql_connect('127.0.0.1:3307', 'mysql_user', 'mysql_password');
หรือ
$link = mysql_connect('example.com:3307', 'mysql_user', 'mysql_password');


แก้ไข ที่ phpMyAdmin ดังนี้
C:\AppServ\www\phpMyAdmin
config.inc.php แก้ไข จาก

cfg['Servers'][$i]['port'] = '';

ให้เป็น
cfg['Servers'][$i]['port'] = '3307';

แล้ว ลอง start mysql ใหม่
และ start phpmyadmin ใหม่ จาก browser

ถ้าทำการเปลี่ยน port ของ apache ต้อง restart apache ใหม่ด้วยครับ

Apache เพิ่ม Services และ uninstall services

View Help apache with :
>Apache.exe /?


Install Apache as Services
>apache.exe -n "Apache Web Server (Test)" -k install
-n คือชื่อที่จะเห็น ใน Services ของ Windows

สามารถ ลงได้ หลาย Service เช่น
apache.exe -n "Apache2(Test)" -k install
apache.exe -n "Apache2(Test 2)" -k install
apache.exe -n "Apache2(Test 3)" -k install
จะเห็นว่ามี 3 Services เมื่อ เปิด หน้าต่าง Services ใน Admin Tools
แต่ทั้ง สาม จะมี property ว่า เป็น .exe ตัวเดียวกัน
สามารถ แยก รันได้ อิสระ แต่มีปัญหาว่า มันใช้ port 80 เหมือนกัน มันเลย
รัน ให้พร้อมกันจริงๆไม่ได้ ในตอนนี้

apache.exe -k uninstall -n "Apache Web Server"
-n คือชื่อ

จาก ทั้ง 3 services ที่เห็น จะสามารถ uninstall ทั้ง 3 ได้ โดย
apache.exe -n "Apache2(Test)" -k uninstall
apache.exe -n "Apache2(Test 2)" -k uninstall
apache.exe -n "Apache2(Test 3)" -k uninstall

การ uninstall จะทำไม่สำเร็จ ถ้า service ยังรันอยู่
แต่ว่าจะโดนมาร์ค ไว้ว่า ให้ลบ เมื่อ มีการ stop services

mysql and mysqladmin

ดู help ของ mysql.exe
ได้โดย
>mysql.exe --help
>mysqld-nt.exe --help
>mysqld.exe --help


connect database
mysql.exe --user=myuser --pass=mypassword --host=myhost.com
mysql.exe --user=myuser --pass=mypassword --host=localhost
mysql.exe --user=myuser --pass=mypassword --host=127.0.0.1

connect database at localhost
mysql.exe

query data
>show databases
>use mydatabase
>show tables
>select count(*) from table1

mysql is active status
mysqladmin.exe ping ----- view status of mysql at localhost
mysqladmin --host=192.168.0.10 --user=root --pass=mmppst ping
mysqladmin --host=myhostname --user=root --pass=mmppst ping

show current mysql server variable (with path )
mysqladmin --host=myhostname.com --user=root --pass=mmppst variables
mysqladmin --host=myhostname.com --user=root --pass=mmppst variables more

shutdown mysql server
mysqladmin --host=myhostname.com --user=root --pass=mmppst shutdown

view version
mysqladmin.exe --host=myhostname.com --user=root --pass=mmppst version

การ์ตูน ตอนเด็ก

Locke the Superman



คำพูด ใน Red Alert (Games PC)
http://www.gamefaqs.com/computer/doswin/file/476890/20018

เขี้ยวงาสีแดง Crimson Fang Blue Sonnet
เขี้ยวงาสีแดง Crimson Fang/Red Fang โดย อ. Shibata Masahiro
http://www.bloggang.com/viewdiary.php?id=pookpui&month=10-2006&date=25&group=7&gblog=26

22 November 2008

ruby sketchup export to *.x ( for directx)

exportx.rb
place in folder Plugins
C:\Program Files\Google\Google SketchUp 6\Plugins

# add item if menu is not already loaded
if( $directxExport_loaded != true ) then
UI.menu("PlugIns").add_item("Export DirectX...") { export_directx3 }
$directxExport_loaded = true
end

#Collect objects and explode group or components, apply transformation
def get_all_model_faces(entities, trans)
# get the array of entities
if entities.class == Sketchup::ComponentInstance
entity_list=entities.definition.entities
elsif entities.class == Sketchup::Group
entity_list=entities.entities
else
entity_list=entities
end
# for each element
for e in entity_list
# if the element is a Group or a Component
if (e.layer.visible? and (e.class == Sketchup::Group or e.class == Sketchup::ComponentInstance)) then
$groups +=1 if e.class == Sketchup::Group
$components += 1 if e.class == Sketchup::ComponentInstance
#check for material to set it to the children on next recusive call
if e.material != nil
$parent_mat.push(e.material)
else
$parent_mat.push($parent_mat.last)
end
# recurs call on the group or component
get_all_model_faces(e, trans*e.transformation)
$parent_mat.pop
end
# if the object is a simple Face
if( e.class == Sketchup::Face and e.layer.visible?) then
# check for material
if e.material == nil
mat=$parent_mat.last
else
mat = e.material
end
# add object to the global collection
$face_trans_collection.push([e,trans,mat])
#print e.to_s + "#" + trans.to_s + "\n"
$faces += 1
end
end
end

# Main entry point
def export_directx3()
# display ruby panel for messages
Sketchup.send_action "showRubyPanel:"
# call Save Dialog function
filename = get_filename
if filename == nil then # exit if cancel was choosen
return
end
print "Saving to : #{filename} \n"

# get the active sketchup model
model = Sketchup.active_model
# get a new writer for textures export
texturewriter = Sketchup.create_texture_writer

#global array that stores each individual text mesh
meshes = []
vertex_collection = []
normal_objects = []
normal_collection = []
normal_faces = []
texture_coords = []
face_collection = []
material_collection = []
material_face = []
# array to store material
all_materials = []
# add a default material when nothing special is specified for a face
material_collection += ["{ Default_Material }"]

# global push/pop array for children material propagation
$parent_mat = []
# global collection that stores a triplet [face, transformation, material]
$face_trans_collection = []
$faces = 0
$groups = 0
$components = 0

#get model entities
entities = model.entities

$parent_mat.push(nil)
# collect faces
get_all_model_faces(entities, Geom::Transformation.new)

print "#{$groups} group(s), #{$components} component(s), #{$faces} faces."

startindex = 0
# for all Faces
for ft in $face_trans_collection
entity = ft[0]
trans = ft[1]
mat = ft[2]
if(entity.typename == "Face") then
# Get a the MeshPolygon from the Face
#0 (Include PolygonMeshPoints), 1 (Include PolygonMeshUVQFront), 2 (Include PolygonMeshUVQBack), 4 (Include PolygonMeshNormals).
mesh = entity.mesh 1 4
# apply transformation when the object was in a group or in a component
mesh.transform! trans
# For all points
#print "mesh\n"
for p in (1..mesh.count_points)
# get the 3D point
pos = mesh.point_at(p).to_a
# get the normal at this point
norm = mesh.normal_at(p)
normal_objects +=[norm]
norm = norm.to_a
# default texture size
texsize = Geom::Point3d.new(1,1,1)

# if the material was obtained from the group or component
if mat!=nil and mat.texture!=nil and entity.material==nil then
# get the texture size
texsize = Geom::Point3d.new(mat.texture.width, mat.texture.height, 1)
end
# get the mesh texture coords (texture deformation: texture can only be streshed, rotated, translated (no parallel deformation)
uv = [mesh.uv_at(p,1).x/texsize.x, mesh.uv_at(p,1).y/texsize.y, mesh.uv_at(p,1).z/texsize.z]
# change to left hand counter clockwise
pos = counterclockwise(pos)
v = "#{"%.4f" %(pos[0])};#{"%.4f" %(pos[1])};#{"%.4f" %(pos[2])};"
vertex_collection += [v]
# change to left hand counter clockwise
norm = counterclockwise(norm)
n = "#{"%.4f" %(norm[0])};#{"%.4f" %(norm[1])};#{"%.4f" %(norm[2])};"
normal_collection += [n]
u = "#{"%.4f" %(uv[0]+1)},#{"%.4f" %(-uv[1])};"
texture_coords += [u]
end

# for each polygon
for poly in mesh.polygons
v1 = (poly[0]>=0?poly[0]:-poly[0])+startindex
v2 = (poly[1]>=0?poly[1]:-poly[1])+startindex
v3 = (poly[2]>=0?poly[2]:-poly[2])+startindex
f = "3;#{v3-1},#{v2-1},#{v1-1}"
face_collection += [f]

mat_index = 0
# get the material
material = mat
if material then
# add the material to the global list if this is a new one
# ! only export texture on front faces (back faces are ignored)
if !(all_materials.index(material)) then
all_materials += [material]
if material.texture then
# build a filename based on the targetfilename and the texture name
f = filename + File.basename(material.texture.filename)
# load the texture of the entity into the texture writer object
texturewriter.load entity, true
# serialize the texture to disk
texturewriter.write entity, true, f
end
m = material.name.gsub(/[^a-zA-Z0-9]/, "_")
material_collection += ["{ " + m + " }"]
end
# get the index for the future added material
mat_index = all_materials.index(material)+1
end
# add the index of the material in the list
material_face += [mat_index.to_s]
end
startindex = startindex + mesh.count_points
end
end

text = "xof 0303txt 0032
// SketchUp 6 -> DirectX (c)2008 edecadoudal, supports: faces, normals and textures
Material Default_Material{
1.0;1.0;1.0;1.0;;
3.2;
0.000000;0.000000;0.000000;;
0.000000;0.000000;0.000000;;
}
"
#model.materials.purge_unused

all_materials.each{mat
# replace '[' and ']' in name by a '_'
n = mat.name.gsub(/[^a-zA-Z0-9]/, "_")
mat_string = "Material " + n + "{ \n"
# faceColor
mat_string += (mat.color.red/255.0).to_s + ";" +(mat.color.green/255.0).to_s + ";" + (mat.color.blue/255.0).to_s + ";"
# Alpha
mat_string += mat.alpha.to_s + ";;\n"
#power
mat_string += "3.2;\n"
# specularColor ColorRGB
mat_string += "0.000000;0.000000;0.000000;;\n"
# emissiveColor ColorRGB
mat_string += "0.000000;0.000000;0.000000;;\n"
if mat.texture && mat.texture.filename != "" then
mat_string += " TextureFilename { "
mat_string += "\"" + File.basename(filename) + File.basename(mat.texture.filename) + "\";"
mat_string += " } \n"
end
mat_string += "} \n"
text += mat_string
}
text+= "Mesh {\n"
text+= " #{vertex_collection.length};\n"
stxt = vertex_collection.to_a.join(",\n ")
text+= " #{stxt};\n"
text+= " #{face_collection.length};\n"
stxt = face_collection.to_a.join(",\n ")
text+= " #{stxt};;\n"
text+= " MeshMaterialList {\n"
text+= " #{material_collection.length};\n"
text+= " #{material_face.length};\n"
stxt = material_face.to_a.join(",\n ")
text+= " #{stxt};\n"
stxt = material_collection.to_a.join("\n ")
text+= " #{stxt}\n"
text+= " }\n"
text+= " MeshTextureCoords {\n"
text+= " #{texture_coords.length};\n"
stxt = texture_coords.to_a.join("\n ")
text+= " #{stxt};\n"
text+= " }\n"
text+= " MeshNormals {\n"
text+= " #{normal_collection.length};\n "
stxt = normal_collection.to_a.join("\n")
text+= " #{stxt};\n"
text+= " #{face_collection.length};\n"
stxt = face_collection.to_a.join(";\n ")
text+= " #{stxt};;\n"

text+= " }\n"
text+= " }\n"

write_file(filename, text)
print "end.\n"
end

def get_filename
model = Sketchup.active_model
model_filename = File.basename(model.path)
if model_filename != ""
model_name = model_filename.split(".")[0]
model_name += ".x"
else
model_name = "Untitled.x"
end
my_str = UI.savepanel("Export as", "", model_name)
end

#convert a clockwise vector in a counterclockwise vector
def counterclockwise(v)
v2 = Array.new
v2 += [-v.to_a[1]]
v2 += [v.to_a[2]]
v2 += [v.to_a[0]]
my_a = v2
end

def write_file(filename, text)
fout = File.open(filename, "w")
fout.puts text
fout.close
end

21 November 2008

เพลง

Mary MacGregor - Torn Between Two Lovers


Mary Macgregor - SAYONARA
http://www.youtube.com/watch?v=goMuRq9Z9Mk

Enigma- Push the Limits


Enya . The River Sings *by valerio ottaviani*


Crimson tide soundtrack-Main theme


COBRA THE ANIMATION - Ending + Vol.2 preview

คัดลอก ข้อมูล ,xcopy , with exclude option

การคัดลอก ข้อมูล โดยใช้ batch xcopy
อาจใช้
xcopy
และหากต้องการ ไม่รวม ไฟล์ใดๆ ใน xcopy ให้ใช้ /exclude:ชื่อไฟล์ที่เก็บข้อมูล exclude
http://www.tech-recipes.com/rx/2682/xcopy_command_using_the_exclude_flag/

ส่วนการ สร้าง file exclude
น่าจะสร้างได้โดย dir /s /b
เช่น

dir myexcludepath /s /b >> d:\exclude.txt
แล้ว รัน xcopy คล้ายๆ ต่อไปนี้

xcopy.exe pathที่จะคัดลอก pathปลายทาง /exclude:d:exclude.txt
ตัวอย่าง จริงๆ เช่น
XCOPY C:\DATA\*.* C:\BKUP /S /I /Y /EXCLUDE:c:\excludelist.txt

หรือ
xcopy.exe D:\ms4w\apps\myapp\*.* d:\backup1\ /S /I /Y /exclude:d:\exclude2.txt
โดยใน exclude2.txt มี
ข้อมูล
D:\ms4w\apps\myapp\data\picture\path1
D:\ms4w\apps\myapp\data\picture\path2
D:\ms4w\apps\myapp\data\picture\path3
D:\ms4w\apps\myapp\data\picture\path4

รายชื่อแฟ้ม ที่ Exclude อาจใช้โปรแกรม ช่วย หาให้โดย
การ ใช้ Backup utility ของ windows เอง
แล้ว เลือก Job > Save Selection As ...
แล้ว เปิดด้วย notepad ก็จะเห็น ชื่อ ไฟล์ที่จะเป็น exclude นำมาใส่ใน exclude2.txt

สมมุติว่า ข้อมูล ทั้ง folder ของ myapp = 150GB
แต่เป็นข้อมูลใน picture path1 ,path2 ,path3,path4 รวม 145 GB
ดังนั้น ถ้าคัดลอก ปกติ ต้อง มีเนื้อที่ 150 GB แล้วลบ ออกเหลือ 5 GB คือต้องหา HardDisk ใหม่มาอีก 1ลูก และ อาจต้องใช้เวลา ยาวนาน หลาย ชั่วโมง อาจถึง 4 ขม ถ้า ผ่าน network
รวมทั้ง อาจต้อง ทำในช่วงเวลาเย็นๆ หลัง จาก เครื่อง server ไม่ได้ ใช้งานแล้วนานๆ

แต่ ถ้า เป็นวิธีนี้ ก็ จะใช้เนื่อที่ เพียง 5 GB ในการคัดลอก
รวมทั้งเวลา ที่น้อยกว่า ลดความจำเป็นที่จะต้องเบิก HardDisk ใหม่

19 November 2008

เปลี่ยน port mysql ใน AppServ

ในที่นี้ เนื่องจาก ติดตั้ง mysql 2 instance บนเครื่องเดียวกัน
และ มีการ ใช้ port ชนกันจึงต้องเปลี่ยน ที่ ตัวหนึ่้ง
( หลังจาก มีการเปลี่ยน port ของ apache web server ไปแล้ว )
โดยให้ instance ตัวหนึ่ง ใช้ port 3306 ปกติ
และอีกตัว ใช้ port 3307

ต้องการเปลี่ยน port ก็ แก้โดย
C:\AppServ\MySQL\my.ini

เปลี่ยน section
[client]
port=3306

ให้กลายเป็น
[client]
port=3307

หมายเหตุ ในส่วน [client] อาจไม่ต้องแก้ไขก็ได้ เพราะจะ ใช้กับ mysql.exe ซึ่งเป็น client
แต่ server ส่วนใหญ่จะเป็น 3306 อยู่แล้ว อาจแก้ไขเฉพาะ [mysqld] ก็พอ

และต้องเปลี่ยน section mysqld จาก
[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3306

ไปเป็น
[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3307

แล้ว restart mysql
แล้วอาจทดสอบด้วยการ telnet localhost 3307 ดู

และต้องเปลี่ยน phpMyAdmin อีกให้ มองเห็นตัวนี้ รวมทั้ง เมื่อจะติดต่อด้วย php
ต้องเรียกด้วย
$link = mysql_connect('127.0.0.1:3307', 'mysql_user', 'mysql_password');
หรือ
$link = mysql_connect('example.com:3307', 'mysql_user', 'mysql_password');


แก้ไข ที่ phpMyAdmin ดังนี้
C:\AppServ\www\phpMyAdmin
config.inc.php แก้ไข จาก

cfg['Servers'][$i]['port'] = '';

ให้เป็น
cfg['Servers'][$i]['port'] = '3307';



แล้ว ลอง start mysql ใหม่
และ start phpmyadmin ใหม่ จาก browser

ถ้าทำการเปลี่ยน port ของ apache ต้อง restart apache ใหม่ด้วยครับ

17 November 2008

Apache Virtual Path

set Apache Virtaul Path by
edit httpd.conf
(for AppServe software bundle ( http://www.appservnetwork.com/ )
edit c:\Appserv\Apache2.2\httpd.conf


for : browse file , download
data path : c:\checkCPU
virtual path : /download/check_cpu
url : http:/127.0.0.1/download/check_cpu

Add this text to httpd.conf .

Alias /download/check_cpu "C:/checkCPU"
<directory>
Options Indexes FollowSymLinks MultiViews ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</directory>
ref from
http://www.amenco.com/golivein24//tips/dynamic_content/03_apache_alias.html
http://www.google.co.th/search?hl=th&q=apache++virtual+path&meta=

31 October 2008

SMS Gateway

ช่วงนี้ ศึกษา เกี่ยวกับ SMS Gateway ครับ
ยังไม่ชัดเจนนัก

ได้แนวคิดคร่าวๆ มา นิดนึง
จากเว็ป http://www.thaiseoboard.com/index.php?topic=22476.0
(Thai SEO Board )

SMS Gateway ต่อง่ายครับ แต่ติดต่อผู้ให้บริการยาก 555+

จะถูกแบ่งออกเป็น 2 แบบก็คือ

Bulk Messsage และ Short Code

โดยแบบ Bulk message นี่ง่ายโครต คือแค่ยิงข้อความไปตาม url ที่กำหนดโดยส่ง parameters ไปให้ครบ message ก็จะถูกส่งผ่าน API ของ ผู้ห้บริการเอง เช่น

$attr['msisdn'] = '086xxxxxxx';
$attr['operatorId'] = 14;
$attr['body'] = 'message';

$pass = http_build_query($attr);

file_get_contents('http://www.gatewayurlapi.php?'.$pass);
และระบบจะคืนค่้า มาให้เราตรวจสอบ
-------------------------------------------

ส่วนแบบ Short Code คือให้ user พิมพ์ ข้อความแล้วส่ง sms เช่น 45211 อันนี้เราจะต้องตั้งค่าที่ gateway ว่าจะให้ยิงกลับมาที่ไหน แล้วก็ไปเขียน Script รับไว้ เท่านั้นเอง มักจะใช้กับพวกที่ activate ผ่านระบบ


ส่วนที่ลำบากของระบบ ไม่ใช่ Code เลยครับ แต่เป็นการติดต่อ ผู้ให้บริการที่มี API ดีๆ ครบทุกค่ายไว้รองรับ และ Config Gateway ง่ายๆ




อธิบาย SMS Gateway
http://sms.vianett.com/kat/000358.asp
http://www.developershome.com/sms/howToReceiveSMSUsingPC.asp

30 October 2008

php Studs + eventum

พอดี ช่วงนี้ต้องพยายาม ทำความเข้าใจ Struts ให้ดี
แต่ ความรู้เดิมก็เป็น php และไม่ค่อยมี เวลาว่างไปอ่าน นัก
เลย คิดว่า เล่น php แนว struts หน่อย เผื่อว่าจะ ได้ทั้งสองอย่าง
คือ php เร็วขึ้นและ ได้ แนวคิด Struts ในส่วนของ concept บ้าง
http://www.mojavelinux.com/projects/studs/
http://www.mojavelinux.com/articles/studs_quickstart.html

และที่สำคัญ คือ ต้องโหลด studs_basic ที่นี่ครับ
http://sourceforge.net/project/showfiles.php?group_id=76836&package_id=77681
แล้ววางใน www ( appserv )
แล้ว เข้าลองด้วย
http://localhost/studs-basic/index.php
จะ ได้ url เช่น
http://localhost/studs-basic/index.php/example.do
http://localhost/studs-basic/index.php/welcome.do

แต่หลังจาก แก้ไข และพยายายามหา Model แล้ว พบว่า Documentไม่ดีเลย
เลย คิดว่า จะลอง
phpMVC แทน
http://www.phpmvc.net/docs/docsIdx.php?doc=features
เห็น เขาว่า
The php.MVC framework is based on Jakarta Struts application framework design. Struts has proven to be reliable, extendable and well supported.
ซึ่ง ถ้าเป็น จริง คือ ตาม Jakarta Struts ได้ ก็ น่าจะลองดู น่ะ
เห็น Help ของ php.MVC เยอะดีด้วย น่าจะดี มั้ง .... ... ..



ยังไม่เคยลอง นะครับ

ส่วนอันนี้ เป้น software PHP + MySQL ใช้กับ AppServ ได้
เพื่อ เป็น จัดกการ Help Desk ต่างๆ พวก Issue Traking
อันนี้เป็น English หมด แต่เก็บมาไว้เผื่อใคร จะลองใช้ดู ชื่อโปรแกรม eventum
http://dev.mysql.com/downloads/other/eventum/index.html
โปรแกรม นี้ถูกใช้โดยทีม ของ MySQL นะครับ
ติดตั้งโปรแกรมง่าย แต่ว่า ยัง ทำ Admin ไม่เป็นเลย

28 October 2008

Environment Variable


ตัวอย่างการใช้ ตัวแปร HomeDrive และ HomePath
D:\>
D:\>%HOMEDRIVE%
C:\>cd %HOMEDRIVE%%HOMEPATH%
C:\Users\user>

environment path อื่นๆ สำหรับ ใช้ในการเขียน Batch File ครับ
ก็น่าจะใช้กับ Vista ,XP ได้ แต่กับ 98 ไม่แน่นะครับ
ข้อมูลเพิ่มเติม หาเพิ่มมาเจอที่นี่ครับ  เยอะมากดี 
http://www.wilsonmar.com/1envvars.htm
และ 
http://kennethhunt.com/archives/000933.html
 

Map network drive in Vista

map network drive in Vista

สมมุติ แม็ปไปที่ IP 192.168.0.2
user = user1
password = password1

net use Z: /persistent:yes \\192.168.0.2\path /u:user1 password1
ก็จะได้ Drive Z: มา
ส่วน สิทธิ์ ก็จะตาม user

source from:
http://www.groovypost.com/howto/microsoft/vista/map-a-network-drive-using-windows-vista-or-windows-server-2008/

06 October 2008

ช่วงนี้ปรับปรุง เว็ปครับ

ปรับปรุงแล้ว และก็
ปรับมาเป็น CMS แทนแล้ว

แม้ว่า ทำเองจะดีกว่า เพราะ ขนาดเล็ก และก็ปลอดภัยกว่า
แต่ คงไม่มีเวลา
ทำมากนักครับ

เวลา ผ่านไป ไวเหมือนโกหก

อ้าว ดึกแล้ว ไปนอนก่อนละ ครับ หุหุ

30 August 2008

stupidity , and war , special war , ศาสนาพุทธ

"Two things are infinite: the universe and human stupidity
...and I'm not sure about the universe." --
Albert Einstein
"สองอย่างที่ไม่มีที่สิ้นสุด ได้แก่ จักรวาล และความงี่เง่าของมนุษย์
...และผมก็ยังไม่มั่นใจเกี่ยวกับจักรวาลนัก" ( แปลว่าน่าจะมั่นใจในเรื่องเกี่ยวกับมนุษย์ )
อัลเบิร์ต ไอสไตน์


พุทธศาสนากับสงคราม
http://www.skyd.org/html/sekhi/56/62-Buddhism_and_War.html

สงครามกองโจร Guerrilla warfare
http://en.wikipedia.org/wiki/Guerrilla_warfare

การรบในเมือง
http://www.thaiairsoftgun.com/?name=knowledge&file=readknowledge&id=25

สงครามพิเศษ
หลักพื้นฐานการปฏิบัติการจิตวิทยา (PDF )
น่าอ่านมากช่วงนี้ เพราะ เห็นตัวอย่างชัดเจน เข้าใจง่ายกว่า
http://www.geocities.com/cgscsos/psyop-1.pdf
http://www.geocities.com/cgscsos/psyop-2.pdf

การปฏิบัติการพิเศษ
http://www.geocities.com/cgscsos/

29 August 2008

ข้อมูลภาพยนต์ The Last Samurai

เรื่องเกี่ยวกับ ซามูไร คนสุดท้าย
จาก Pantip/ภาพยนตร์


และ ความรู้ เกี่ยวกับ ดาบไทย และ ดาบญี่ปุ่นครับ
http://zeus.cp.eng.chula.ac.th/~u45tkb/PhpBB/viewtopic.php?f=1&t=162


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

อืม เราก็มีความรู้น้อย ก็ได้ แต่มองตาปริบๆ

ข้อมูล Feature ใหม่ๆของ Visual Studio.NET 2008 แล้วอะ

มันรวมถึง Spec เครื่องที่ต้องการด้วยนะครับ
LINQ และก็ อื่นๆ อีกมากมาย
เช่น Foundation ต่างๆ
ก็ คงแค่ แสดงคร่าวๆ ให้พอรู้ ส่วนอื่นๆ คงต้องหาอ่านเพิ่ม

Visual Studio .NET รวมทั้ง Visual Studio.NET 2008
http://en.wikipedia.org/wiki/Microsoft_Visual_Studio

ภาษาไทย
http://www.microsoft.com/thailand/visualstudio/what_news.aspx
http://www.blognone.com/node/6351

27 August 2008

วันนี้มียึด ที่ต่างๆ กทม

ตะกี้ ดู ข่าว
เขายึด NBT แล้ว ก็ เฉยๆ แล้วอย่างอื่น ก็เฉยๆ

แต่ เห็น ตอนลำเลียงนักข่าว ออกมา
คิดว่า เพิ่งเคยเห็น คนไทย อยากทำร้าย คนไทยด้วยกันเองขนาดนี้

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

ป้าๆ ทั้งหลาย คงอยาก ถีบ เด็กๆ รุ่นหลานๆสาวๆ ให้ตายคาเท้า มั้ง เห็นเดินตามมาด่า
เมืองไทย ของเรา เบียร์ไทยของเรา จริงๆ ..... เอ้า เมาๆๆๆ

21 August 2008

ADS scripting

เกี่ยวกับ การเขียน Script สำหรับ Admin

มีทั้ง Logon Script
http://www.rlmueller.net/LogonScriptFAQ.htm
ซึ่งก็คือ script ที่ทำงานเมื่อมีการ logon นั่นเอง อาจเขียนด้วย vbscript หรือ อื่นๆ แม้แต่ exe
และ
Name Translate
http://www.rlmueller.net/NameTranslateFAQ.htm
ตรงนี้ ก็ยังไม่ค่อยแน่ใจว่าคืออะไร แต่คงเกี่ยวกับ LDAP ด้วย
(LDAP ก็คือคล้ายๆ ActiveDirectory,AD ใน WindowsServer แหละครับ )
การแปลงชื่อ NT Name

ส่วนอันนี้เป็น Resource จาก TechRepublic สำหรับเรื่อง เกี่ยวกับ logon script และ group policy
http://search.techrepublic.com.com/search/group+policy+script.html

และ จากเว็ป microsoft จะมี Script Center สำหรับเรื่อง เกี่ยวกับ group policy โดยเฉพาะ ที่นี่ครับ

(MS)/technet/scriptcenter/hubs/gp.mspx


ส่วนอันนี้ เป็น การเช็คข้อมูลพื้นฐาน ของเครื่อง computer ด้วย script

(MS.com)web



-------------------------------------------------------------------------------
ตัวอย่าง script copy folder โดยมี progress dialog ด้วย
Const FOF_CREATEPROGRESSDLG = &H0&
ParentFolder = "D:\Archive"
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(ParentFolder)
objFolder.CopyHere "C:\Scripts", FOF_CREATEPROGRESSDLG

เป็น การ copy จาก C:\scripts ไปยัง D:\Archive
-------------------------------------------------------------------------------
รวมถึงการใช้ cscript.exe และ wscript.exe (default)
(MS.com)/en-us/library/bb490887.aspx

install sharpdeveloper

เมื่อวาน ลง XP ใหม่
แล้วพยายาม ลง SharpDeveloper
พบว่า ลงไม่ได้ มันแจ้งให้ ServicePack ใหม่ ที่มี new version of Windows Installer Service
เนื่องจาก เป็น ServicePack1

บทความนี้จึง เน้นเฉพาะเครื่องที่ ลง XP แล้วเป็น แค่ Service Pack1
ส่วนเครื่องที่เป็น Service Pack2 (SP2) แล้วคงไม่มีปัญหาอะไร

ก็เลยต้องมาดูว่า Windows Installer Services จริงๆแล้วมันคืออะไร
ตอนแรกก็เข้าใจ ว่ามันเป็น service ที่ช่วยในการติดตั้ง โปรแกรมนั่นเองแต่ไม่ค่อยแน่ใจนัก
เลย หาลิงค์มาเพิ่ม ดังนี้
หน้าหลัก
http://msdn.microsoft.com/en-us/library/aa372866.aspx

download Runtime หรือ Redistributable
ปกติแล้ว แค่โหลดตัวนี้ก็น่าจะพอแล้ว และ มีให้หลายๆเวอร์ชัน มีวิธีการ setup ด้วย
http://msdn.microsoft.com/en-us/library/aa372856(VS.85).aspx

หน้าdownload สำหรับ SDK สำหรับนักพัฒนา (Developer)
http://www.microsoft.com/downloads/details.aspx?FamilyId=6A35AC14-2626-4846-BB51-DDCE49D6FFB6&displaylang=en

ส่วน Windows Installer Team Blog หรือ คือ Blog ของทีมที่พัฒนา Windows Installer
ของ Microsoft นั่นเอง
จะบอกข่าวสารใหม่ๆและ รายละเอียด เกี่ยวกับ โปรดักได้หรือแม้แต่ ส่ง comment ให้ได้ด้วย
http://blogs.msdn.com/windows_installer_team/default.aspx

ตอนนี้ ที่ทำก็แค่ โหลด Redistribution แล้วจะค่อยมาอ่าน ต่ออีกที
หรือ อาจจะลง Services Pack ใหม่ๆก็ได้ เช่น

---------------------------------------------------------
หลังจาก คลิกขวาที่ MyComputer Icon แล้ว
พบว่า เป็น XP Service 1
เลยตัดสินใจ ว่าจะไม่โหลด Windows Installer แล้ว
โหลด XP Service Pack 3 ดีกว่า

http://www.microsoft.com/downloads/details.aspx?familyid=5B33B5A8-5E76-401F-BE08-1E1555D4F3D4&displaylang=en
316.4 MB

ส่วน SP2 นั้นอยู่ที่
http://www.microsoft.com/downloads/details.aspx?FamilyID=049C9DBE-3B8E-4F30-8245-9E368D3CDB5A&displaylang=en 266 MB

----------------------------------------------------------------------------------------------
Windows Installer ,Redistributable ก่อนจากที่
http://www.microsoft.com/downloads/details.aspx?FamilyId=5A58B56F-60B6-4412-95B9-54D056D6F9F4&displaylang=en
ไปก่อนก็ได้ ครับ แค่ 2 MB หรือ อย่างมากไม่เกิน 43MB
เพื่อเฉพาะลงโปรแกรมบางตัวให้ได้ก่อน
แล้วค่อยไปติดตั้ง SP2 เพื่อให้ XP ปลอดภัยมากขึ้น
ส่วนเครื่องที่ลง SP2 แล้วน่าจะไม่มีปัญหาอะไร
แล้วก็พบปัญหา อีก .... ว่า
พบปัญหาว่า โหลด *.msu แล้ว ไม่มี โปรแกรมที่จะผูกเพื่อเรียกมารัน
ก็เลยไม่สามารถรันได้
File *.msu นี้จริงๆแล้วคือ ไฟล์ Windows Update Standalone
ซึ่งปกติต้องผูกกับ โปรแกรม wusa.exe ใน C:\Windows\System32 ใน Vista
หรือ หากจะโหลด *.exe มาลงก็มีปัญหาว่า ที่ทำงาน Firewall ไม่มียอมให้โหลด *.exe

สุดท้าย กลับไปโหลด SP2 มาใช้ดีกว่า ง่ายกว่าเยอะ -__- " หมดเวลาปายหลายชั่วโมง เลย

ถ้าในที่ทำงาน มี การ ติดตั้ง update server ไว้ก็ จะเร็วหน่อย
ก็ทำโดยเข้า
Start --> Run --> gpedit.msc
แล้ว เข้า local policy > Computer Configuration > Administrator Templates > System
แล้วเลือกหัวข้อ Specify Windows Service Pack Installation file location
แล้ว จะมี Dialog ให้ป้อน แบบ http:// ip : port
อันนี้ ก็ได้รับคำแนะนำมาอีกที น่ะครับ

กรณีนี้เป็น SP1 ไปเป็น SP2

19 August 2008

ลองใช้ jQuery

แล้วก็ ลองโค้ดดู
มา โพส ที่ blogspot
โค้ดมัน ก็มั่วๆๆ
เลยหาทาง ลองโพสที่ myspace แทนครับ

นี่ link ครับ ... รอ มาแก้ link อีกททีน่ะ ..

คงต้อง ใช้ function http://th2.php.net/manual/en/function.highlight-file.php
hilight_file ของ php เพื่อที่จะปรับให้ code สามารถ post บน Blogger ได้
ตัวอย่าง นี้ครับ

ใช้ $s = hightlight_file("file1.php",true); echo $s ;
โดยให้ ครอบ tag code ไว้ด้วย tag PRE อีกชั้นหนึ่ง
จะได้ผลดังนี้ ครับ





<?

$db 
= mysql_connect( "localhost" , "aa" 

,"123a" ) ; 


mysql_select_db("db1" ) ; 

$rs =  mysql_query( "select * from table1  ") ; 

$num =  mysql_num_rows($rs) ; 

echo  
"<BR>row  num  =  $num " ;

mysql_close($db ) ;

for (
$i = 0 ; $i < 10 ; $i ++) {

        echo 
"Test $i " ; 

} 

?>

<script  language=javascript >

function test(){

    alert( "abc") ;

}

</script> 






หรือหากไม่อยาก hilight อาจใช้วิธีนี้
<?
$s = file_get_contents( "hili2.php") ;
$s = htmlentities($s ) ;
echo "<PRE>$s</PRE>" ;
?>


ซึ่งก็จะได้ผล เป็น plain Text ซึ่งแสดง ข้อมูล
แบบที่เป็น TextFile ธรรมดา แต่มีการ ย่อหน้าได้ ด้วย
แต่ปัญหา ที่พบคือ คนที่มา copy code จะได้ ข้อความติดกัน เป็นพืดๆ ไม่มีการย่อหน้าเว้นบรรทัดอยู่ดี ตรงนี้คือ
จะอ่านได้อย่างเดียวแต่ยังก้อบปี้ยังไม่ได้ง่ายๆ ยังหาวิธีที่ดีกว่านี้ไม่ได้ ครับ

-------------------------------------------------------------------------------
แล้วในที่สุด ก็หาตัวอย่างง่ายๆ ของ jQuery มาได้
ว่าจะทำไง ให้โพสบนเว็ป
พอดีที่เครื่องไม่ได้ลง php / apache ไว้
ก็เลย ใช้โปรแกรมที่เขียนเอง แหละชื่อ Form Basic HTML version 1.03
โพสโค้ดที่ หน้าต่างซ้าย แล้ว ก็ เลือกเมนู Edit --> Convert To String in Language --> HTML
แล้วก็ก้อบโค้ดมา ง่ายๆ
เพียงแต่ ช่องว่างมันจะแสดงเป็น nbsp เท่านั้นเอง
แล้วต้องมา replace
ออก ด้วย notepad แล้ว เติม PRE ครอบไว้


<html>
  <head>
    <script type="text/javascript"
 src="jquery-1.2.6.js"></script>
    <script type="text/javascript">
      // Your code goes here
      $(document).ready(function(){
       alert("a");
       $("#sp1").addClass("red");
      
        $("#list1 li").hover(function(){
$(this).addClass("green");
     },function(){
$(this).removeClass("green");
  });    
      
      });


      </script>
 <style >
 .red     {background-color:red;}
 .green     {background-color:lightgreen;}
 </style>
   
  </head>
  <body>
    <a href="http://jquery.com/">jQuery</a>
    <button id=bt1 >aa</button>
    <span id=sp1 >aa</span>
    <ol id=list1>
     <li>aaa1</li>
     <li>aaa2</li>
     <li>aaa3s</li>
    </ol>
  </body>
  </html>

การใช้ jQuery


ตัวอย่าง jQuery ลองเล่นวันนี้

เพราะได้รับคำแนะนำ มาว่า ใช้แล้วง่าย สบายกับ DOM

ลองใช้ดู ก็จริงด้วย ใช้แล้ว ไม่ต้อง เชียน Javascript getElementById("") ให้เมื่อย ตุ้ม


18 August 2008

เวลามาตรฐาน

เนื่องจากข่าวนี้ครับ
http://news.sanook.com/social/social_296418.php
สรุปย่อๆได้ดังนี้
พระราชบัญญัติว่าด้วยการกระทำความผิดโดยมีผลบังคับใช้ในวันที่ 23 สิงหาคมนี้ โดยกำหนดให้ผู้ประกอบ 4 ประเภท ต้องปรับเปลี่ยนเวลาให้ได้มาตรฐาน เพื่อประโยชน์ต่อการรักษาข้อมูลทางคอมพิวเตอร์ ประกอบด้วย ผู้ประกอบกิจการโทรคมนาคมและกิจการกระจายภาพและเสียง ผู้ให้บริการการเข้าถึงระบบเครือข่ายคอมพิวเตอร์ ผู้ให้บริการเช่าระบบคอมพิวเตอร์ และผู้ให้บริการร้านอินเตอร์เน็ตต่างๆ หากไม่ปฏิบัติตามจะมีโทษปรับประมาณ 1-5 แสนบาท

อีกข่าวที่เกี่ยวข้อง และอาจมีข้อมูลต่างกันเล็กน้อย
http://hilight.kapook.com/view/27719

จึงจะอธิบายวิธีซะหน่อย และ ก็ Server ด้วย

วิธีการปรับเวลาของเครื่อง Windows XP ให้เชื่อมต่อไปยัง TimeServer ได้
พร้อมเบอร์โทรศัพท์ และคำแนะนำในการใช้งานการเชื่อมต่อ ต่างๆ
http://www.nimt.or.th/nimt/Service/index.php?menuName=time

ตามข่าวทางสถาบันได้ซื้อนาฬิกาซีเซียมมาใหม่ ดังนี้


ตัวอย่างเว็ป เวลามาตรฐานของไทย
ได้แก่

สถาบันมาตรวิทยาแห่งชาติ
time1.nimt.or.th
time2.nimt.or.th
time3.nimt.or.th

เวลามาตรฐานโดย nectec
clock.nectec.or.th
clock2.nectec.or.th


เวลามาตราฐานประเทศไทย โดย กรมอุทกศาสตร์ กองทัพเรือ
time.navy.mi.th

13 August 2008

tfs2008 ( 2008.08.12 )

ทำโปรแกรม ตรวจ folder เสร็จแบบ คร่าวๆแล้ว
ตั้งชื่อง่าย ๆ

ทำหลายๆ Thread จะมีปัญหาก็ในส่วน GUI กับ Thread ที่ UI
มันไม่ยอมให้ Thread อื่นแก้ไขข้อมูล เลยต้องหาวิธีเลี่ยงด้วย Invoke

คิดว่าน่าจะเพิ่ม Feature อื่นๆเช่น Export XML , CSV ไว้วันหลัง
เผื่อจะได้ เอาไว้ทำ Graph ด้วย Excel ได้ อีกทีหลัง อิอิ

ลอง ติด AdSense ดูด้วยครับด้านล่าง

http://www.thaisoftbox.com/thaifs/tfs20080812.zip

ถ้ายังไม่มี .NET Framework 2.0 ก็สามารถโหลดได้จากที่นี่ครับ
http://www.microsoft.com/downloads/details.aspx?familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=en

คิดว่าน่าจะทำงานได้เร็วกว่าเดิมมาก อาจจะช้ากว่า version c++ หน่อยแต่ว่า
ก็น่าจะพอรับได้
ระหว่างที่รัน อาจจะมี ข้อความแจ้งว่า Create ๆๆ ที่หน้าจอ ไม่ต้องตกใจครับ
มันแค่เป็นการ สร้าง Thread ในหน่วยความจำ เฉยๆ ไม่ไดสร้างอะไรใหม่เลยใน Folder

แตกไฟล์มาแล้ว ก็ คลิกเลือกปุ่ม ... เพื่อเลือก Folder
แล้วก็ค่อยกดปุ่ม ดึงข้อมูล
แล้วรอ ......
จะมี Tree มา ให้คลิกแต่ละ Tree จะมีตัวบอกว่า ขนาด กี่ byte/MB เมื่อเทียบกับ Parent Folder
และก็ จะมีการบอกด้วย ว่า เมื่อเทียบกับ Folder ย่อยๆทั้งหมดนั้น Folder นั้งมีเฉพาะไฟล์ เยอะไหม

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

ส่วน โฆษณาด้านล่างของโปรแกรม นั้นก็คือ Adsense นั่นเอง
จริงๆเป็นแค่ ไฟล์ ไฟล์นี้ครับ
http://www.thaisoftbox.com/banner/tfs20080812.htm

30 July 2008

การใช้กาน Thread + UI ของ Windows

ช่วงนี้ SMF webbord ที่ใช้โพสก็เข้าไม่ได้ ไม่ได้ติดตั้งใหม่
ไม่มีเวลา เข้าไปกู้ระบบ เลย จะลงใหม่ก็กลัวข้อมูลเก่าหาย นี่แหละหนา ปัญหาของการใช้ CMS

ส่วน WebPage ก็ update ไม่ค่อยได้ง่ายๆแล้ว
เพราะว่า เขาเปลี่ยนมาใช้ port ไม่มาตรฐาน ซึ่งก็คาดว่าทางที่ทำงาน block เรียบร้อย

ส่วน ThaiFolderSize โปรแกรม ตัวนั้นรู้สึกผมจะทำผิดเอง
ไป ซ่อนไว้ ทำให้เข้าใช้งานไม่ได้เลย

ก็เลยคิดจะเขียนใหม่อยู่เหมือนกัน ว่าจะเร่งความเร็วการค้นหา
แต่เพราะ C# มันไม่ใช่ C++ เลยลองหลายครั้งก็ช้าๆๆๆๆ
(จริงๆใช้ของ ยี่ห้ออื่น เขาก็ได้ แต่อยากลองเขียนดู )

เมื่อวานกับวันนี้ ทำโปรแกรม นำเข้าข้อมูล ใช้ Thread รัน SQL
ก็ เลย คิดว่า คงจะดี ถ้าการค้น Recursive ทุกครั้ง แยกๆๆ กันเป็น Thread
เลย ค้นหาและลองทำ

พบว่า Thread มันมีปัญหา กับ GUI พอควรเพราะคนละ Thread มันไม่ยอมให้ update GUI
เลยลอง มาหาวิธี กันต่อไป
ที่ Link นี้ครั บ

เขียนด้วย C# แหละเพราะว่ามีโค้ดเก่าอยู่ เขียนไว้นานแล้ว ของตัวเองเอามาโมดิฟายยย
ทั้งๆที่ช่วงนี้ ตั้งใจแล้วว่าจะเขียน แต่ VB.NET เพราะจะได้ไม่งง มาก หลายภาษาตีกันวุ่น
แต่ก็ โอเค นะ
Error แจ้งว่า ให้ ใช้ Control.Invoke หรือ Control.BeginInvoke แทน

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


http://weblogs.asp.net/justin_rogers/pages/126345.aspx
http://weblogs.asp.net/psteele/archive/2007/08/26/anonymous-methods-and-control-invoke.aspx
http://codebetter.com/blogs/jeremy.miller/archive/2006/11/05/Using-Anonymous-Methods-with-Control.Invoke_28002900_.aspx

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