Archive

Archive for ธันวาคม, 2008

แก้ปัญหา ใช้งาน Mono ได้บ้างไม่ได้บ้าง!

ธันวาคม 28th, 2008

จากการทดลองติดตั้ง Mono-Project ซึ่งเป็น .net สำหรับ OS ที่เป็น Linux ซึ่งผมใช้ CenOS เป็นตัวทดสอบ
พบว่าในการติดตั้งทำได้ง่ายๆ แต่อาจจะมีปัญหาในส่วนของการทำงาน ซึ่งยังมีส่วนที่ยังไม่ค่อยเข้าใจอยู่บ้าง

ปัญหาที่พบล่าสุดและคิดว่าคงเป็นประโยชน์ท่านอื่นๆคือ เข้าใช้งานเว็บได้บ้างไม่ได้บ้าง เป็นครั้งคราว
ซึ่งในกรณีที่เข้าไม่ได้ จะเกิด error 500 ประมาณว่า Mono ไม่สามารถไม่สามารถทำงานได้

ผมได้ตรวจสอบพบว่า มี process ของ mono ค้างอยู่เป็นจำนวนมาก โดยใช้คำสั่ง

#ps -aux|grep mono

apache   32363  0.0  0.0  31964  1348 ?        Ssl  Dec27   0:00 /usr/bin/mono /usr/lib64/mono/1.0/mod-mono-server.exe –filename /tmp/mod_mono_server_global –nonstop –master
apache   32364  0.0  0.0  31964  1348 ?        Ssl  Dec27   0:00 /usr/bin/mono /usr/lib64/mono/1.0/mod-mono-server.exe –filename /tmp/mod_mono_server_global –nonstop –master
apache   32366  0.0  0.0  31960  1348 ?        Ssl  Dec27   0:00 /usr/bin/mono /usr/lib64/mono/1.0/mod-mono-server.exe –filename /tmp/mod_mono_server_global –nonstop –master

และเมื่อทำการ restart apache ทำไม่ได้ คุณจะต้องทำการ kill process ที่ค้างอยู่ให้หมดเสียก่อน โดยใช้คำสั่ง

#killall mono

และ restart apache ได้เลยครับ

#/etc/rc.d/init.d/httpd restart

และผมได้ทำการค้นหาคำตอบว่า ทำไมถึงมี process ของ Mono ค้างอยู่เป็นจำนวนมาก และในที่สุดก็รู้ว่า เกิดจากการ stop Apache ไม่สมบูรณ์ คือจะไม่มีการ kill process ของ Mono ไปด้วย (ซึ่งก็แน่นอนครับ) เราต้องเพิ่มเติมคำสั่งเข้าไปเอง โดย

#vi /etc/rc.d/init.d/httpd

แล้วเพิ่มบรรทัด killall เข้าไปในส่วนของโค้ดการ stop()

killproc -d 10 $httpd
#for Mono-Project
killall mono

RETVAL=$?

 แค่นี้เมื่อมีการ stop Apache ก็มีจะการสั่ง kill process ของ Mono ให้เราด้วย

Linux, OpenSource

การติดตั้ง vnc บน CentOS5.2

ธันวาคม 21st, 2008

VNC เป็นเครื่องมือสำหรับการ Remote เข้าไปจัดการกับเครื่องอื่น เป็นโปรแกรมประภท Remote Desktop
ซึ่งทำให้เกิดความสะดวกในการจัดการเครื่องปลายทาง

โดยทั่วไปแล้วบน Linux จะมีชุดโปรแกรมนี้มาให้ด้วยแล้ว และมีชื่อว่า vncserver

การติดตั้งในส่วนของ server และ client

#yum install vnc-server
#yum install vnc

ทำการตรวจสอบว่าเครื่อง server ของคุณได้ทำการติดตั้ง x windows และ GNOME หรือยัง หากว่ายัง ให้ดำเนินการโดยใช้คำสั่ง
yum หรือจะติดตั้งผ่านทาง rpm ก็ได้เช่นกัน
#yum groupinstall “GNOME Desktop Environment”

ในกรณีที่การติดตั้ง GNOME เกิดข้อผิดพลาด
missing xxxxxxxxxxx.so.0.

ให้ทำการดาว์นโหลดไฟล์ package มาติดตั้งเอง โดยค้นหาไฟล์ได้จาก
http://mirror.centos.org/centos/5/os/i386/CentOS/

และทำการติดตั้งด้วยคำสั่ง
#rpm -Uvh –nodeps xxxxxxxxxxxxxxx.rpm

ขั้นตอนต่อมาเป็นการสร้าง user และกำหนด password (หากมี user อยู่แล้วก็ไม่จำเป็นต้องสร้างใหม่)

# useradd suppakit
# passwd suppakit

ทำการ login ด้วย user ที่ต้องการ และทำการกำหนด password สำหรับ vnc ด้วยคำสั่ง
#vncpasswd

จะมีการสร้างไฟล์ path .vnc และไฟล์ passwd ให้เข้าไปดูผ่านทางคำสั่ง
#cd .vnc
#ls

ทำการแก้ไข Server configuration ด้วยคำสั่ง
#vi /etc/sysconfig/vncservers

และเพิ่มรายละเอียดของ user ที่ต้องการใช้งาน vnc เข้าไปดังนี้

VNCSERVERS=”1:suppakit”
VNCSERVERARGS[1]=”-geometry 800×600″

ทำการสร้างไฟล์ xstartup โดยการ startและ stop vncserver ดังนี้
#service vncserver start
#service vncserver stop

หากคุณลอง ls ดูจะมีไ ฟล์ .log, passwd แ ละ xstartup

ทำการแก้ไขไฟล์ xstartup ดังนี้

#!/bin/sh (-)
# Add the following line to ensure you always have an xterm available.

#( while true ; do xterm ; done ) &
# Uncomment the following two lines for normal desktop:
unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80×24+10+10 -ls -title “$VNCDESKTOP Desktop” &

exec gnome-session &

ในส่วนสีแดง ผมลองแล้ว ไม่ work เพราะมีการเปิดหน้าต่าง xterm ค้างใน process ไว้มาก

ทดสอบการทำงานด้วยโปรแกรม vnc โดยกำหนดค่าดังนี้

vncviewer 192.168.0.10:1

วิธีการกำหนดใ ห้ vncserver ทำการทุกครั้งหลังการ boot ด้วยคำสั่ง
#chkconfig vncserver on

 

From http://wiki.centos.org/HowTos/VNC-Server

Linux

เมื่อใช้ GNOME แล้วเกิดปัญหา “i’ve detected a panel already running, and will now exit”

ธันวาคม 21st, 2008

เป็นความผิดพลาดที่เกิดจาก มี process ที่เรียกใช้ GNOME ในส่วนของ panel อยู่แล้ว
ทำให้เมื่อคุณเข้าสู่หน้าต่างของ GNOME เกิดมีการแจ้งว่า
“i’ve detected a panel already running, and will now exit”

วิธีการแก้ไขทำได้โดย
#killall gnome-panel

หลังจากนั้นก็ทำการเรียกใช้ panel ขึ้นมาใหม่ ด้วยคำสั่ง
#gnome-panel

Linux

Another application is holding yum lock

ธันวาคม 21st, 2008

เนื่องจากผมใช้ CentOS 5.2 แล้วพบว่าเมื่อทำการยกเลิกการทำงานของ yum แล้ว
ก่อให้มี process ทำงานค้างอยู่ จึงไม่สามารถเรียกใช้ yum อีกครั้งได้

วิธีการแก้คือ ทำการ login เข้าเป็น su (super user)
# cd /var/run/
# dir 

มองหา yum.pid จากนั้นให้ทำการลบทิ้งครับ
# rm -f yum.pid
# dir

ทำการเรียกใช้ yum
# yum update

Linux

ติดตั้ง Xwindows,GNOME ด้วยคำสั่ง yum

ธันวาคม 17th, 2008

#yum groupinstall “X Window System” “GNOME Desktop Environment” “Sound
and Video”

หากต้องการทราบว่ามี กลุ่มของโปรแกรมอะไรบ้างที่สามารถติดตั้งได้
ต้องใช้คำสั่ง
#yum grouplist

อันนี้ผมทดสอบใน CentOS

Linux

การเชื่อมต่อ rs232 หรือ serial port โดยใช้ vb2005

ธันวาคม 17th, 2008

สร้าง Form1 ให้มี ปุ่ม 2 ปุ่ม
ปุ่มแรกชื่อ btnSend
ปุ่ม 2 ชื่อ btnClear
และสร้าง RichTextBox 2 อัน
อันแรกชื่อ txtSent อันที่ txtReceived
สร้าง Module1 ขึ้นมา แล้วใช้ code ตามนี้

Module Module1

Public Const xStartFrame = &H2 ‘@0×02

Public Const xStopFrame = &H5E ‘^

Public Const xCheckFrame = &HC6 ‘Protocal of Board RS232=&HB6

Public BTx(99) As Byte

Public BRx(99) As Byte

Public ReadBuf As String

Public index As Byte

Public inNo As Integer

Public x As Byte

 

 

Public Sub SendTx()

Dim i As Integer

Form1.SerialPort1.Write(BTx, 0, UBound(BTx) + 1)

For i = 0 To UBound(BTx)

Form1.txtSent.Text = Form1.txtSent.Text & “/” & Hex(BTx(i))

Call delay(30000)

Next i

End Sub

 

Public Sub delay(ByVal wait As Long)

Dim i As Long

For i = 0 To wait

Next i

End Sub

 

End Module

 

 

แล้วสำหรับ Form1 ใช้ code นี้

 

Public Class Form1

Dim inNo As Integer

Dim ReadBuf As String

Dim index As Byte

Dim BRx(99) As Byte

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

If Me.SerialPort1.IsOpen Then Me.SerialPort1.Close()

Me.SerialPort1.Open()

Me.SerialPort1.BaudRate() = 9600

Me.SerialPort1.DiscardOutBuffer() ‘clear output buffer

Me.SerialPort1.DiscardInBuffer() ‘clear input buffer

Me.SerialPort1.RtsEnable = True

Me.SerialPort1.DtrEnable = True

Timer1.Enabled = True

Timer1.Interval = 2

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Dim i As Integer

inNo = SerialPort1.BytesToRead

If inNo = 0 Then Exit Sub

For i = 1 To inNo

BRx(index) = SerialPort1.ReadByte

Me.txtReceived.Text = Me.txtReceived.Text & “/” & Hex(BRx(index))

index = index + 1

Next i

index = 0

 

End Sub

 

Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click

Dim i As Integer

ReDim BTx(7)

BTx(0) = xStartFrame ‘Start 0×02

BTx(1) = &HC6 ‘Check 0xC6

BTx(2) = &H10 ‘Command 0×108F

BTx(3) = &H8F

BTx(4) = &H1 ‘Len 0×01

BTx(5) = &H3 ‘Data 0×03

For i = 1 To 6

BTx(i) = BTx(i) Xor BTx(i + 1)

Next i

BTx(7) = xStopFrame

Call SendTx()

End Sub

 

Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click

Me.txtSent.Text = “”

Me.txtReceived.Text = “”

End Sub

End Class

 

เวลา Test ให้ short ขา 2กับ3 ของ serial port แล้วลองกดปุ่ม Send ดู ถ้ามี ข้อความขึ้นที่ txtReceived ตรงกับที่ txtSent ขึ้นก็แสดงว่า serial port ถูกแล้ว ใช้งานได้เป็นปกติ

 

From : http://forums.thainetdev.com/index.php?showtopic=121

VB.NET

สร้าง Windows Service ด้วย C#

ธันวาคม 15th, 2008

เป็นการ service เพื่อทำงานในลักษณะ background process ตัวอย่างที่เห็นได้ชัดคือพวก
apache, tomcat , fax service ของ microsoft ก็ใช้งานในลักษณะนี้

เริ่มต้นจากการสร้าง windows service

System.IO.StreamWrite file;

protected override void OnStart(string[] args)
{
    // create or open the file. Default path is "C:\windows\System32\"
    file = new StreamWriter( new FileStream("ServiceTest.log", System.IO.FileMode.Append ) );
    this.file.WriteLine("Starting Service");
    this.file.Flush();
}

protected override void OnStop()
{
    this.file.WriteLine("Stopping Service");
    this.file.Flush();
    this.file.Close();
}

จากนั้นให้สร้าง installer class โดยเพิ่ม using System.ServiceProcess; เข้าไปพร้อมโค้ดต่อไปนี้

ServiceInstaller si = new ServiceInstaller();
ServiceProcessInstaller spi = new ServiceProcessInstaller();

si.ServiceName = “Service1″; // this must match the ServiceName specified in WindowsService1.
si.DisplayName = “Devhood Tutorial Service”; // this will be displayed in the Services Manager.
this.Installers.Add(si);

spi.Account = System.ServiceProcess.ServiceAccount.LocalSystem; // run under the system account.
spi.Password = null;
spi.Username = null;
this.Installers.Add(spi);

เพื่อให้โปรแกรมทำงานได้ ต้องทำการติดตั้ง service ด้วยวิธี “installutil.exe C:\project\WindowsService1\bin\WindowsService1.exe” และใช้ “installutil.exe /u” ในการเอา service ออก

คุณสามารถดูผลของ service ว่าได้ติดตั้งไว้แล้วจาก Computer Management ในส่วนของ services

C#

ติดตั้งฟอนด์ไทยใน CentOS 5.2

ธันวาคม 15th, 2008

ดาวน์โหลดฟอนด์
# wget ftp://linux.thai.net/pub/ThaiLinux/software/thai-ttf/thai-ttf-0.4.6.tar.gz

แตกไฟล์
# tar xvfz thai-ttf-0.4.6.tar.gz

เข้าห้อง
# cd thai-ttf-0.4.6

สร้างห้องไว้ที่
# mkdir /usr/share/fonts/thai-ttf

ก็อปปี้ไฟล์
# cp *.* /usr/share/fonts/thai-ttf/

เพิ่มรายการฟอนท์ไทย เข้าไปในรายการ
# chkfontpath -a /usr/share/fonts/thai-ttf

ตรวจสอบด้วยคำสั่ง จะพบรายการ ฟอนท์ไทยของเรา
#chkfontpath -l

จากนั้นก็ทำการ restart เครื่อง

Linux

Mono ชื่อนี้สำหรับคน .NET หัวใจ OpenSource

ธันวาคม 13th, 2008

Mono ชื่อนี้คงพอคุ้นๆบ้าง สำหรับนักพัฒนา ที่ต้องการใช้เทคโนโลยี .net ของทาง microsoft แต่ต้องการใช้ของฟรี(หน่อย) คุณสามารถทำการ download และศึกษารายละเอียดได้จากเว็บ http://mono-project.com/

และเครื่องมือในการพัฒนา หรือเรียกทั่วไปว่า IDE นั้น ที่มีให้ใช้อยู่ก็คือ MonoDevelop ซึ่งเป็นของฟรี เพื่อใช้ในการเขียน C# และภาษาอื่นๆของ .NET รายละเอียดศึกษาได้จาก http://www.monodevelop.com

 

OpenSource

ตัวอย่างโค้ด สร้าง Thread ด้วย C#

ธันวาคม 11th, 2008

เป็นตัวอย่างการสร้าง thread ใหม่ขึ้นมาใช้งาน

———————

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{

static void PrintHellowFromThreadName() {
while(true) {
Console.WriteLine(”Hellow, from thread {0}”, Thread.CurrentThread.Name);
}

}

public void Start() {
PrintHellowFromThreadName();
}

static void Main(string[] args)
{
Thread.CurrentThread.Name = “Main Thread”;
Program obj = new Program();
Thread thread = new Thread(new ThreadStart(obj.Start ));
thread.Name = “Forked thread”;
thread.Start();

PrintHellowFromThreadName();

}
}
}

C#