24 กุมภาพันธ์ 2552

C# กับ Tcp

(Toggle Plain Text)
using System;

using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Net;

namespace _8246_ACW_Coursework
{
class ServerApp
{
public void runServer()
{
//creates a TcpListener Object to listen for incoming connections
TcpListener listener;
//creates a socket to send and recieve data
Socket connection;
//creates a network stream
NetworkStream socketStream;

for (;;)
{
try
{
//creates an instance Tcp listenter to listen for connections on port 43
listener = new TcpListener(43);
//begins listening for incoming connections
listener.Start();
while (true)
{
//starts new thread
Thread thread = new Thread(runServer);
thread.Start();
//accepts socket if request is made to connect
connection = listener.AcceptSocket();
//sets a network stream instance to the connection socket
socketStream = new NetworkStream(connection);
//calls method doRequest which takes a socketstream and handles its request
doRequest(socketStream);
//closes the socket stream
socketStream.Close();
//closes connection
connection.Close();
}
}
catch (Exception e)
{
e.ToString();
}
}
}
public string doRequest(NetworkStream socketStream)
{
//streamReader reads incoming connection from client
StreamReader sr = new StreamReader(socketStream);
//writes in coming data
StreamWriter sw = new StreamWriter(socketStream);
//Assigns data from the streamreader to a string
string streamReader = sr.ReadLine();
return streamReader;
}
}
}


I have a client, which connects to the server.
using System;

using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace _8246_ACW_Coursework
{
public class ClientApp
{
//creates a new instance of the clientform windows form application
static ClientServerGUI clientform = new ClientServerGUI();

//variables
public static string address,
sendData,
updateData,
userName;
private static string space = " ";
public static int port;

//method which connects to the server and returns information back to the forms class
public static string SendData()
{
TcpClient client = new TcpClient();
//calls the TCP client and connects to the address and port passed in by the User from GUI
client.Connect(address, port);
//Creates a stream writer instance so user can send data to server
StreamWriter sw = new StreamWriter(client.GetStream());
//reads the information sent back from the server
StreamReader sr = new StreamReader(client.GetStream());

//if statement evalutes to see if the user has selected to update the server
//" " = update server
//"" = do not update the server
if(updateData.Equals(""))
{
space = "";
}
else if(!updateData.Equals(""))
{
space = " ";
}
//Refrences stream writer, username variable passed in from GUI
//space variable provides update function: "" = dont update. " " = update database.
sw.WriteLine(userName + space + updateData);
sw.Flush();
//data send back from the server assigned to string variable
string recieved = sr.ReadLine();
return recieved;

}
}
}

สิ่งที่ต้องรู้ในการสือสารผ่านเครือข่าย

Physical Network คืออะไร
physical network คือ กลุ่มของคอมพิวเตอร์หรืออุปกรณ์ที่ติดต่อกันและสือสารกัน เช่น คอมพิวเตอร์,สแกนเนอร์ฯ ซึ่งเชื่อมต่ออยู่กับโครงข่าย ที่เรียกว่า Node โดยแต่ละโหนดจะเชื่อมต่อกันผ่าน Link และแต่ละโหนดนั้นจะสามารถส่งข้อมูลต่างๆผ่าน Link เหล่านี้
ชนิดของโครงข่ายได้แก่


LAN (Local Area Network) เป็นโครงข่ายขนาดเล็กในพื่นที่ใกล้ๆกันเช่น ใช้ภายใน สำนักงานหนึ่งๆ
WAN(Wide Area Network) เป็นโครงข่ายที่ประกอบไปด้วย LAN หลายๆโครงข่ายเชื่อมต่อกัน ในการเชื่อมต่อเข้าสู่
WAM ทำได้หลายวิธีดังนี้ 1. ผ่าน Leased lines 2. ผ่าน Modem (Switched lines) 3.ผ่าน Packet-switching network
MAN(Metropolitan Area Network) เป็นการเชื่อมต่อ LAN หลายๆโครงข่ายเหมือนกับ WAN แต่มีขนาดใหญ่กว่า WAN ซึ่งหมายถึงเป็นการเชื่อมต่อระหว่างเมือง โดยวิธีนี้จะใช้สายสัญญาณความเร็วสูงเช่น ดาวเทียมหรือ Fiber Optic

Protocol คืออะไร
protocol คือ กฏหรือรูปแบบในการส่งสัญญาณเพื่อให้ฝ่ายส่งและรับเข้าใจกันโดย protocol ที่ใช้กันในปัจจุบันที่ใช้กันมาก คือ Ethernet

Ethernet Protocol
ในระยะแรกนี้ Ethernet protocol ถูกออกแบบมาด้วยความเร็ว 10 Mbps และหลังจากนั้นได้ถูกพัฒนาต่อไปทำให้มีความเร็วในการรับส่งข้อมูลมากขึ้น มาตรฐานของ Ethernet protocol ได้แก่
10Base5,10BaseT,100BaseTX,1000BaseSX

CDMA/CD คืออะไร
CDMA/CD (Carrier Sense Multiple Access/Collision Detect)เป็นมาตรฐานในการส่งสัญญาณ หลักการของ CDMA/CD คืออุปกรณ์(Devices) ต่างๆที่เชื่อมต่อกับโครงข่ายนั้นๆจะได้รับ message โดยอุปกรณ์ที่จะได้รับ
Message นั้นจะต้องเป็นอุปกรณ์ที่มีใน Message เท่านั้นจึงจะนำเอา Message ไปใช้งานได้และอุปกรณ์ที่สามารถใช้รับ message จะต้องมีหมายเลขประจำตัวด้วยซึ่งเรียกว่า MAC(Media Access Control Address)

ลำดับชั้นของ OSI Model
มี 7 ชั้นด้วยกันคือ
Application Layer
Presentation Layer
Session Layer
Transport Layer
Network Layer
Data Link Layer
Physical Layer

Network Protocol
OSI จะเป็นตัวกำหนดรูปแบบของ Protocol Layers โดย แบ่งออกเป็นประเภทต่างๆดังนี้
Basic Protocols
ทำหน้าที่ในการควบคุม (Control) การสือสารข้อมูล
ได้แก่ IP,TCP,UDP,IGMP,ICMP

Internet Protocols
เป็น protocol ในระดับบนสุดของ TCP/IP Protocol Stack เป็นชุดของ Protocol ที่นิยมใชักัน ในInternet
ได้แก่
HTTP (Hypertext Transfer Protocol ) อยู่ในระดับชั้น Application Level ถูกใช้ใน World Wide Web (WWW)
HTTPS (Hypertext Transfer Protocol over Secure Socket Layer, or HTTP over SSL) คือ Web Protocol ที่ถูกใช้ใน Browser และจะมีการเข้ารหัสและถอดรหัสโดยผู้ใช้ โดย HTTPS จะใช้ port 443 ซึ่งแตกต่างจาก HTTP ที่ใช้ port 80
FTP (File Transfer Protocol) ให้บริการการเคลื่อนย้ายข้อมูล

Email protocol
เป็น protocol ที่ใช้ส่งและรับ email ได้แก่
POP3 (Post Office Protocol - Version 3 (POP3)) เป็นโปรโตคอลมาตรฐานในการรับข้อมูลจาก email โดย POP3 จะทำหน้าที่เป็น Client/Server protocol จะใช้ Port 110
SMTP (Simple Mail Transfer Protocol) ใช้ในการส่ง email ผ่านเครือข่าย(internet)
IMAP (Internet Message Access Protocol) สามารถเข้าถึง Remote file บน Server ได้ และสามารถจัดการกับ folder ต่างใน server
NNTP (Network News Transfer Protocol) เป็นโปรโตคอลทำหน้าที่เคลื่อนย้ายข้อมูล

Image Processing ด้วย C# 2

คราวนี้เราจะลองมาดูวิธีการเข้าถึง pixel ของรูปบ้าง ซึ่งโดยทั่วไปมีสามวิธีคือ
  1. ใช้ฟังก์ชัน Bitmap.GetPixel และ Bitmap.SetPixel วิธีนี้จะง่ายที่สุด แต่มีข้อจำกัดคือ ใช้ได้กับรูปที่เป็นแบบ RGB เท่านั้น และ การประมวลผลค่อนข้างช้า
  2. ใช้ pointer เข้าไปจัดการกับค่าของ pixel ในหน่่วยความจำโดยตรง ข้อดีคือเป็นวิธีที่เร็วที่สุด แต่ถือว่าเป็น unsafe code ก่อนคอมไพล์ต้องไปกำหนดรูปแบบให้ยอมรับ unsafe code ด้วย
  3. ทำการสำเนาค่าค่าของ pixel ในหน่่วยความจำ มาเก็บไว้ในตัวแปรชุด จากนั้นก็ประมวลผลค่าของ pixel ให้เสร็จเรียบร้อย จึงค่อยสำเนาค่าตัวแปรชุด กลับไปทับค่าของ pixel ในหน่่วยความจำ
วันนี้เราจะลองใช้วิธีแรกครับ
เป้าหมาย
สร้างฟังก์ชันในการกลับสี (Invert, Negative)


เมื่อ Invert เสร็จ


หลักการ
การ Invert ก็คือการนำค่าสูงสุดของสี มาหักลบด้วยค่าของ pixel นั้น เช่น
p = 255 - p

รหัสโปรแกรมก็จะเป็นประมาณนี้ครับ
//*********************************
//This function uses GetPixel and SetPixel which are very easy but quite slow, and only applicable to RGB image
//*********************************
public static void InvertSlow(Bitmap bmp)
{
// Image width and height
int w = bmp.Width;
int h = bmp.Height;
// Color
Color CL1,CL2;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
// get pixel color
CL1 = bmp.GetPixel(x,y);
// change to negative
CL2 = Color.FromArgb(255 - CL1.R, 255 - CL1.G, 255 - CL1.B);
// set pixel to new color
bmp.SetPixel(x, y, CL2);
}
}
}

Image Processing ด้วย C# 1

Image Processing ด้วย C# 1



ในบทแรกนี้เราจะทำการเปิดไฟล์ภาพแล้วแสดงผล
เป้าหมาย



ขั้นตอน
สมมติว่าเราสร้างเมนูเรียบร้อยแล้ว

1. ประกาศตัวแปรสำหรับเก็บภาพ เป็นตัวแปรคลาส
private Bitmap bmp;

2. ในส่วนของเมนู Open ให้เพิ่มรหัสโปรแกรมดังนี้
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
//Call open dialog
OpenFileDialog openFileDialog = new OpenFileDialog();
// Default Initial directory
openFileDialog.InitialDirectory = "c:\\";
// File type filter
openFileDialog.Filter = "Bitmap files (*.bmp)|*.bmp|Jpeg files (*.jpg)|*.jpg|PNG files (*.png)|*.png|All valid files (*.bmp/*.jpg/*.png)|*.bmp/*.jpg/*.png";
// Set png to be a default format
openFileDialog.FilterIndex = 3;
openFileDialog.RestoreDirectory = true;

// if click OK to open image
if (DialogResult.OK == openFileDialog.ShowDialog())
{
// Load bitmap from file
bmp = (Bitmap)Bitmap.FromFile(openFileDialog.FileName, false);
// set width and height of form, compensate for menubar
this.Width = bmp.Width + 5;
this.Height = bmp.Height + 55;
// invoke paint method
this.Invalidate();
}
}

3. เพิ่ม Event ชื่อ Paint ให้กับฟอร์ม
แล้วเพิ่มรหัสโปรแกรมดังนี้

private void Form1_Paint(object sender, PaintEventArgs e)
{
// if image file does not exist
if (bmp == null)
return;

// else draw image to form
Graphics g = e.Graphics;
Rectangle r = new Rectangle(0, 25, bmp.Width, bmp.Height);
g.DrawImage(bmp, r);
}

Thread

Thread
Thread คือ สิ่งที่ทำงานโปรแกรมได้ เราสามารถเรียกดู Thread ได้ใน Windows Task Managerโดยเปิด Windows Task Manager ขึ้นมาแล้วไปที่ View->Select Column แล้วเลือกตรง
Thread Count จากนั้นคลิกที่ปุ่ม OK จากนั้นมาที่ แถบ Processes จะมี Thread เกิดขึ้นมา
การสร้าง Thread
เราสามารถสร้าง Thread โดยใช้คลาสที่ชื่อว่า Thread ที่อยู่ใน System.Threading โดยคอนสตรักเตอร์ของคลาส Thread ไดแก่
Thread t =new Thread(ParameterizedThreadStart start);
Thread t =new Thread(ThreadStart start);
Thread t =new Thread(ParameterizedThreadStart start),int maxStackSize);
Thread t =new Thread(ThreadStart start,int maxStackSize);
โดย ThreadStart จะใช้กับเมธอดที่ไม่มีการ return ข้อมูลและไม่มี Argument ใดๆ
ส่วน ParameterizedThreadSTart จะเป็นการส่งข้อมูลไปที่ Thread
หลังจากที่สร้าง Thread แล้วเราสามารถใช้เมธอด Start() ผ่านobject ของคลาส Thread เพื่อให้ Thread เริ่มทำงาน
ตัวอย่างการสร้าง Thread

Code:
using System;
using System.Threading;
public class TestThread
{
    public static void Main()
    {
        Thread t = new Thread(MyThread);
        t.Start();
        Console.ReadLine();
    }
    public static void MyThread()
    {
        Console.WriteLine("This is no parameter");
    }
}

การกำหนดรายละเอียดของ Thread เราสามารถกำหนดรายละเอียดต่างๆเกี่ยวกับ Thread ได้เช่น
Name = ชื่อThread
Priority = ลำดับความสำคัญของ Thread
ThreadState = สถานะของ Thread ได้แก่ Running,Aborted,Stopped,Suspended,Unstarted,WaitSleepJoin,StopRequested,AbortRequested,SuspendRequested,Background
IsAlive = ตรวจสอบสถานะว่ายังทำงานอยู่หรือไม่
IsBackground =ตรวจสอบว่าเป็น Background Thread หรือไม่
IsThreadPoolThread = ตรวจสอบว่าเป็น Thread pool หรือไม่

ตัวอย่างการแสดงรายละเอียดของ Thread

Code:
using System;
using System.Threading;
public class TestThread
{
    public static void Main()
    {
        Thread t = Thread.CurrentThread;
        Console.WriteLine(t.Priority);
        Console.WriteLine(t.IsAlive);
        Console.WriteLine(t.IsBackground);
        Console.ReadLine();
    }
   
}
ในตัวอย่างด้านบนนี้เป็นการแสดงรายละเอียดของ Threadปัจจุบัน(Main) สังเกตุได้ว่า ตรง IsAlive จะแสดง True เนื่องจากว่า หลังรันโปรแกรมแล้วทางโปรแกรมจะทำงาน
ที่เมธอด Main ซึ่งเมธอด Main กำลังทำงานอยู่จึงแสดงค่า True

การใช้ Anonymous เมธอด

Code:
using System;
using System.Threading;
public class TestThread
{
    public static void Main()
    {
        Thread t = new Thread(
            delegate()
            {
                Console.WriteLine("Thread is running....");
            });
        t.Start();
        Console.ReadLine();
    }
   
}

หรือ

Code:
using System;
using System.Threading;
public class TestThread
{
    public static void Main()
    {
        new Thread(
            delegate()
            {
                Console.WriteLine("Thread is running..");
            }).Start();
        Console.ReadLine();
    }
   
}
ผลลัพธ์จะเหมือนกับวิธีแรก



การส่งค่าไปที่ Thread โดยใช้ ParameterizedThreadStart


Code:
using System;
using System.Threading;
public class TestThread
{
    public static void Main()
    {
        Thread t = new Thread(ThreadWithParameter);
        t.Start("TestThreadWithParameter");
        Console.ReadLine();
    }
    public static void ThreadWithParameter(object o)
    {
        Console.WriteLine("Working in {0}",o);
    }
}
ในตัวอย่างนี้ ตรงที่เรียกใช้เมธอด Start จะมีการส่งค่า ไปที่เมธอด ThreadWithParameter ด้วย และใน เมธอดของ ThreadWithParameter จะมีการรับค่าเข้ามาแล้วแสดงค่า
ที่ส่งเข้ามา

การส่ง parameter โดยใช้ Struct

Code:
using System;
using System.Threading;
public struct SendingData
{
    public string data;
}
public class TestThreadWithSendingData
{
    public static void ThreadWithParameter(object o)
    {
        SendingData s = (SendingData)o;
        Console.WriteLine("'{0}' has been sent ", s.data);
    }
    public static void Main()
    {
        SendingData s = new SendingData();
        s.data = "one";
        Thread t = new Thread(ThreadWithParameter);
        t.Start(s);
        Console.ReadLine();
    }
}

การใช้สร้าง Thread โดยใช้ ThreadStart

Code:
using System;
using System.Threading;
public class TestThread
{
    public static void Main()
    {
        Thread t = new Thread(new ThreadStart(MyThread));
        t.Start();
        Console.ReadLine();
    }
    public static void MyThread()
    {
        Console.WriteLine("Hello");
    }
}

การใช้งาน เมธอด Sleep()เมธอด Sleep(int milliseconds) เป็นการกำหนดเวลาในการพักThread พอโปรแกรมทำงาน มาถึง เมธอด Sleep นี้ก็จะหยุดพักเป็นเวลาตาม ที่เรากำหนด ในเมธอดนี้พอถึงเวลา
แล้วก็จะทำงานต่อไป ในการเรียกใช้งานเมธอด Sleep ให้เรียกผ่านคลาส Thread ได้เลยดังนี้
Thread.Sleep(เวลา);

ตัวอย่างการใช้งาน Sleep

Code:
using System;
using System.Threading;
public class TestThread
{
    public static void Main()
    {
        Thread t = new Thread(new ParameterizedThreadStart(MyThread));
        t.Start(1000);
        Console.ReadLine();
    }
    public static void MyThread(object o)
    {
        int num = Convert.ToInt32(o);
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine(i);
            Thread.Sleep(num);
        }
    }
}
ในตัวอย่างนี้จะเป็นการสร้าง Thread โดยใช้ ParameterizedThreadStart เพื่อส่งค่าเวลาที่มีค่าเท่ากับ 1 วินาที(1000 millissecond) ไปที่เมธอด MyThread ในเมธอดนี้รับค่าเข้ามา
เป็น object ดังนั้นจึงต้องแปลง object ให้เป็น int ก่อน และให้แสดงตัวเลขตั้งแต่ 0 ถึง 4 โดยพอแสดงตัวเลขตัวแรกก็จะหยุดพักเป็นเวลาที่รับเข้ามาซึ่งก็คือหยุดพัก 1 วินาที
แล้วค่อยแสดงตัวเลขถัดไปแล้วก็หยุดพักแล้วก็แสดงตัวเลขถัดไปเรื่อยๆถึงเลข 4

ตัวอย่าง Multiple Thread

Code:
using System;
using System.Threading;
class TestThread
{
    private int count;
    private Thread t;
    public TestThread(string str)
    {
        count = 0;
        t = new Thread(StartingThread);
        t.Name = str;
        t.Start();
    }
    public void StartingThread()
    {
       
        while (count < 5)
        {
            Console.WriteLine("..............{0} is starting................", t.Name);
            Console.WriteLine(count);
            Thread.Sleep(1000);
            count++;
        }
       
    }
}
public class TestMainThread
{
    public static void Main()
    {
        TestThread t1 = new TestThread("Threadone");
        TestThread t2 = new TestThread("Threadtwo");
        TestThread t3 = new TestThread("Threadthree");
        Console.ReadLine();
    }
}
ในตัวอย่างนี้ เป็นการทำงานแบบ multiple thread คือ สร้าง object ของคลาส TestThread 3 ตัวแล้วมีการส่งชื่อ Thread ทั้ง 3 ไปที่คลาสของ TestThread ในคอนสตรักเตอร์
ของคลาสนี้จะมีการเรียกใช้งาน Thread เพื่อไปเรียกเมธอด StartingThread ให้ทำงาน


การใช้งาน Background Threadในการสร้าง Thread นั้น Thread ที่ถูกสร้างขึ้นมาจะเป็น Foreground Thread ซึ่ง application ต่างๆที่ทำงานได้ก็ต่อเมื่อต้องมี Foreground Thread อย่างน้อยหนึ่งตัวถ้าไม่มี Foreground Thread แล้ว
application ก็จะหยุดทำงาน ดังนั้นถ้าใน application หนึ่งๆมี Foreground Thread มากกว่า 1 ตัวที่ทำงานอยู่ และ Main Thread หยุดทำงานแล้ว application ก็จะทำงานไปเรื่อยๆแล้วจะหยุดทำงานลงเมื่อ Foreground Thread ทั้งหมดทำงาน
เสร็จเรียบร้อย ดังนั้นถ้าเราต้องการเปลื่ยนจาก Foreground Thread ให้เป็น Background Thread ก็ใช้ properties ที่ชื่อว่า IsBackground
ตัวอย่าง

Code:
using System;
using System.Threading;
public class TestBackgroundThread
{
    public static void Main()
    {
        Thread t = new Thread(MyThread);
        t.Name = "one";//กำหนดชื่อ Thread ปัจจุบัน
        t.Start();
        Console.WriteLine("This Main Thread Stopped");
        Console.ReadLine();
    }
    public static void MyThread()
    {
        Console.WriteLine(" '{0}' started ", Thread.CurrentThread.Name);
        Console.WriteLine(" '{0}' finished", Thread.CurrentThread.Name);
    }
}
ในตัวอย่างด้านบนนี้ ผลลัพธ์จะแสดง
This Main Thread Stopped
'one' started
'one' finished
คำอธิบายเนื่องจากตัวอย่างนี้ มี MainThread และ Foreground Thread(ค่า Default เมื่อสร้างThread ใหม่) สังเกตุได้ว่าเมื่อ Main Thread หยุดทำงานแล้ว
(แสดง คำว่า This Main Thread Stopped ) foreground Thread ยังทำงานต่อได้โดยแสดงคำว่า 'one' started และ 'one' finished พอแสดงถึง one finished แล้ว
foreground Thread ก็จะหยุดทำงาน แต่ถ้าเราต้องการเปลื่ยนจาก ForeGround Thread เป็น Background ก็ใช้คำสั่ง t.IsBackground=true; ดังนี้

Code:
using System;
using System.Threading;
public class TestBackgroundThread
{
    public static void Main()
    {
        Thread t = new Thread(MyThread);
        t.Name = "one";//กำหนดชื่อ Thread ปัจจุบัน
        t.IsBackground = true;
        t.Start();
        Console.WriteLine("This Main Thread Stopped");
        Console.ReadLine();
    }
    public static void MyThread()
    {
        Console.WriteLine(" '{0}' started ", Thread.CurrentThread.Name);
        Thread.Sleep(1000);
        Console.WriteLine(" '{0}' finished", Thread.CurrentThread.Name);
    }
}

ผลลัพธ์ที่ได้จะขึ้นอยู่กับระบบของแต่ละเครื่องที่รันคำสั่งนี้ซึ่งจะให้ผลลัพธ์ไม่เหมือนกันบางเครื่องจะให้แสดง This Main Thread Stopped 'one' started หรืออาจจะแสดง
ทั้งหมดเหมือนกับ foreground เลยก็ได้

การใช้ Priority
Priority ใช้กำหนดระดับความสำคัญของ Thread โดย Thread ไหนที่มีความสำคัญกว่าก็จะแสดงขึ้นมาก่อน วิธีการกำหนด Priority มีดังนี้
t.Priority =ThreadPriority.Highest;
ชนิดของ Priority ต่างๆมีดังนี้
AboveNormal
BelowNormal
Normal
Highest
Lowest
โดยค่าเริ่มต้นถ้าเราไม่กำหนด Priority ก็จะเป็น Normal
ตัวอย่าง การใช้งาน Priority

Code:
using System;
using System.Threading;
public class TestBackgroundThread
{
    public static void Main()
    {
        Thread t1 = new Thread(MyThread);
        t1.Name = "one";
        t1.Priority = ThreadPriority.Lowest;
        Thread t2 = new Thread(MyThread);
        t2.Name = "two";
        t2.Priority = ThreadPriority.Highest;
        Thread t3 = new Thread(MyThread);
        t3.Name = "three";
        t3.Priority = ThreadPriority.Normal;
        t1.Start();//หลังจากเรียก Start() แล้วทางโปรแกรมจะแสดง ข้อความเป็นอันดับสุดท้ายเนื่องจากกำหนด Priority เป็น Lowest
        t2.Start();//หลังจากเรียก Start() แล้วทางโปรแกรมจะแสดง ข้อความเป็นอันดับแรกเนื่องจากกำหนด Priority เป็น Highest
        t3.Start();//หลังจากเรียก Start() แล้วทางโปรแกรมจะแสดง ข้อความเป็นอันดับตรงกลางเนื่องจากกำหนด Priority เป็น Normal
        Console.ReadLine();
    }
    public static void MyThread()
    {
        Console.WriteLine("Hello   "+Thread.CurrentThread.Name);
       
    }
}
ผลลัพธ์
Hello two
Hello three
Hello one

การใช้งาน Joinเมธอด Join() เป็นการบอกว่าให้ Thread ที่เรียกใช้งานเมธอดนี้หยุดรอก่อนแล้วเข้าสู่สถานะ WaitSleepJoin แล้วให้ Thread อื่นทำงานให้เสร็จก่อนแล้วถึงทำงานต่อ

Code:
using System;
using System.Threading;
class MyThread
{
    private string name;
    public Thread t;
    public MyThread(string name)
    {
        this.name = name;
         t = new Thread(TestJoin);
        t.Name = name;
        t.Start();
    }
    public void TestJoin()
    {
        for (int i = 0; i < 15; i++)
        {
     Console.WriteLine("Thread name is  {0} , {1}", Thread.CurrentThread.Name, i);
        }
    }
}
public class TestJoinThread
{
    public static void Main()
    {
        MyThread t1 = new MyThread("one");
        MyThread t2 = new MyThread("two");
        t1.t.Join();
        Console.WriteLine("t1 joined");
        t2.t.Join();
        Console.WriteLine("t2 joined");
        Console.ReadLine();
    }
}
ตัวอย่าง

Code:
using System;
using System.Threading;
public class TestThread
{
    public static void Main()
    {
        Thread t = new Thread(StartingThread);
        Console.WriteLine("{0} : StartingThread ", DateTime.Now.ToString("HH:mm:ss"));
        t.Start();
   
        if (!t.Join(2000))
        {
            Console.WriteLine("Joined Timeout at {0}", DateTime.Now.ToString("HH:mm:ss"));
        }
        t.Join();
        Console.ReadLine();
    }
    public static void StartingThread()
    {
        for (int i = 1; i < 10; i++)
        {
            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
            Thread.Sleep(1200);
        }
    }
}

Synchronizationในกรณีที่เราต้องการใช้ข้อมูลระหว่าง Thread ในกรณีที่มี Thread ตั้งแต่ สอง Thread ขึ้นไป เราจะต้องใช้ Synchronization เพื่อที่จะให้ Thread บางเธรดในช่วงเวลานั้นสามารถใช้ข้อมูลและเปลื่ยนสถานะได้โดยไม่เกี่ยวข้องกับThread อื่น
สิ่งที่เกี่ยวกับกับ Synchronization ได้แก่
Monitor,lock,Interlocked สามารถทำ Synchronization ได้ภายใน process นั้นๆ
Events,Mutex,Semaphore ใช้ทำ Synchronization ระหว่าง Thread หลายๆ process

ตัวอย่าง

Code:
using System;
using System.Threading;
class StateClass
{
    private int state = 1;
    public int State
    {
        get
        {
            return state;
        }
        set
        {
            state = value;
        }
    }
}
class Work{
     StateClass sc;
     public Work(StateClass sc)
    {
        this.sc = sc;
    }
    public void LoopMethod()
    {
        for (int i = 0; i < 10000; i++)
        {
           sc.State += 1;
        }
    }
}
public class TestThread
{
    public static void Main()
    {
        int n = 10;
        StateClass s = new StateClass();
        Thread[] t = new Thread[n];//สร้าง Array ของ Thread มีทั้งหมด 10 Thread
        for (int i = 0; i < n; i++)
        {
            t[i] = new Thread(new Work(s).LoopMethod);//สร้าง Thread โดยเรียกใช้งาน LoopMethod ของคลาส Work
            t[i].Start();
        }
        for (int i = 0; i < n; i++)
        {
            t[i].Join();//เรียกใช้ Join() เพื่อให้เธรดอื่นๆทำงาน
        }
        Console.WriteLine(s.State);
        Console.ReadLine();
    }
}

จากนั้นให้รันหลายๆครั้งสังเกตุว่าผลลัพธ์จะได้ตัวเลขต่างๆออกมาซึ่งแต่ละครั้งไม่เท่ากันเช่นเช่น
87238,90001,ฯซึ่งตัวอย่างนี้ยังไม่ได้ทำ Synchronize ดังนั้นเพื่อให้ค่าที่ออกมามีค่าที่เท่ากันทุกครั้งที่รันเราจะต้องใช้ Synchronize โดย
เราจะใช้ lock เพื่อ ล็อค สถานะเพื่อให้แสดงค่าเท่ากันรูปแบบ ของ lock มีดังนี้
lock(obj){
//คำสั่ง
}
ให้ใส่ lock ตรงสถานะทีเปลื่ยนแปลง ดังนี้
Code:
public void LoopMethod()
    {
        for (int i = 0; i < 10000; i++)
        {
            lock (sc)
            {
                sc.State += 1;
            }
        }
    }
แล้วทดลองรันดูผลลัพธ์จะได้ค่าที่เท่ากันในแต่ละครั้งออกมาเนื่องจากว่าเราได้ทำ Synchronize แล้วทำให้ช่วงเวลาหนึ่งๆ เธรดบางเธรดจะเข้าถึงข้อมูลได้เท่านั้น

อีกตัวอย่างเกี่ยวกับ Synchronize

Code:
using System;
using System.Threading;

class TestThread
{
  private int n = 0;

  public void Starts()
  {
        while (n < 5)
          {
              int tmp = n;
              tmp++;
              Console.WriteLine("Thread name is " + Thread.CurrentThread.Name + " " + tmp);
              Thread.Sleep(1000);
              n = tmp;
          }
}
  public static void Main()
  {
      TestThread t = new TestThread();
      Thread t1 = new Thread(new ThreadStart(t.Starts));
      Thread t2 = new Thread(new ThreadStart(t.Starts));
      Thread t3 = new Thread(new ThreadStart(t.Starts));
      t1.Name = "one";
      t2.Name = "two";
      t3.Name = "three";
      t1.Start();
      t2.Start();
      t3.Start();
      Console.ReadLine();
  }
}




ผลลัพธ์จะได้
Thread name is one 1
Thread name is two 1
Thread name is three 1
Thread name is one 2
Thread name is two 2
Thread name is three 2
... ไปเรื่อยๆ ถึง 5
ในตัวอย่างนี้ยังไม่ได้ทำการ Synchronize ดังนั้นสังเกตผลลัพธ์ว่า มี 3 Thread ด้วยกัน คือ (one,two,three) ในการเข้าถึงข้อมูลเดียวกันพร้อมกัน คือเธรด one,two,three สามารถเข้าถึงข้อมูล เลข 1 ได้พร้อมกันในเวลาเดียวกัน
ดังนั้นถ้าต้องการให้มีเธรดเดียวเข้าถึงข้อมูลได้ในเวลานั้นๆก็ใช้ lock ดังนี้
ในเมธอด Starts() ให้ใส่ lock เข้าไปดังนี้
Code:
public void Starts()
  {
      lock (this)
      {
          while (n < 5)
          {
              int tmp = n;
              tmp++;
              Console.WriteLine("Thread name is " + Thread.CurrentThread.Name + " " + tmp);
              Thread.Sleep(1000);
              n = tmp;
          }
      }
}
ผลลัพธ์จะได้
Thread name is one 1
Thread name is one 2
Thread name is one 3
Thread name is one 4
Thread name is one 5
สังเกตว่าหลังจากใส่ lock แล้วจะทำให้มีแค่เพียงเธรดเดียวในการเข้าถึงข้อมูล

การใช้งาน Interlocked
ปกติแล้วการเพิ่มค่าอย่างเช่น i++ จะไม่ใช้ Thread-Safe เนื่องจากว่า i++ เป็นการเพิ่มค่าที่มาจากหน่วยความจำ(memory) คือเพิ่มค่าที่ละหนึ่งเข้าไปแล้วเก็บค่าไว้ใน
หน่วยความจำซึ่งกระบวนการนี้ทำให้เกิดการขัดจังหวะหรือ interrupted โดย thread scheduler ได้ดังนั้นในการเพิ่มค่าหรือลดค่าต่างๆจะใช้ Interlocked เพื่อป้องกันไม่
ให้เกิดปัญหาในกรณีที่จัดการเกี่ยวกับ Thread
เมธอดต่างๆได้แก่
Add() , CompareExchange(),Decrement(),Exchange(),Increment(),Read()
ตัวอย่าง การใช้งาน Interlocked

Code:
using System;
using System.Threading;
public class TestThread
{
    private int n = 0;
    public void Starts()
    {
        while (n < 5)
        {
            Interlocked.Increment(ref n);
            Console.WriteLine("Thread name is " + Thread.CurrentThread.Name + "   " + n);
            Thread.Sleep(1000);
        }
    }
    public static void Main()
    {
        TestThread t =new TestThread();
        Thread t1 = new Thread(new ThreadStart(t.Starts));
        Thread t2 = new Thread(new ThreadStart(t.Starts));
        Thread t3 = new Thread(new ThreadStart(t.Starts));
        t1.Name = "one";
        t2.Name = "two";
        t3.Name = "three";
        t1.Start();
        t2.Start();
        t3.Start();
        Console.ReadLine();
    }
}
ผลลัพธ์จะคล้ายๆกับ การใช้งาน lock แต่ต่างกันที่ว่า ในตัวอย่างก่อนหน้านี้ใช้ tmp++ เพื่อเพิ่มค่าแล้วเก็บในหน่วยความจำแต่ในตัวอย่างนี้จะใช้
Interlocked.Increment(ref n); เพิ่อเพิ่มค่า ผลลัพธ์จะได้(แต่ละเครื่องอาจจะไม่เหมือนกัน)
Thread name is one 1
Thread name is two 2
Thread name is three 3
Thread name is one 4
Thread name is two 5

การใช้งาน Monitor

Monitor จะคล้ายๆกับ lock แต่สามารถเพิ่ม ค่าของเวลาในการ lock ได้ รูปแบบ
Monitor.Enter(obj,<time>);
try{
//คำสั่ง
}
finally{
Monitor.Exit(obj);
}
ตัวอย่างการใช้งาน Monitor

Code:
using System;
using System.Threading;
public class TestThread
{
    private int n = 0;
    public void Starts()
    {
        Monitor.Enter(this);
        try
        {
            while (n < 5)
            {
                Interlocked.Increment(ref n);
                Console.WriteLine("Thread name is " + Thread.CurrentThread.Name + "   " + n);
                Thread.Sleep(1000);
            }
        }
        finally
        {
            Monitor.Exit(this);
        }
    }
    public static void Main()
    {
        TestThread t =new TestThread();
        Thread t1 = new Thread(new ThreadStart(t.Starts));
        Thread t2 = new Thread(new ThreadStart(t.Starts));
        Thread t3 = new Thread(new ThreadStart(t.Starts));
        t1.Name = "one";
        t2.Name = "two";
        t3.Name = "three";
        t1.Start();
        t2.Start();
        t3.Start();
        Console.ReadLine();
    }
}
ผลลัพธ์จะได้
Thread name is one 1
Thread name is one 2
Thread name is one 3
Thread name is one 4
Thread name is one 5

รังสีออร่าในตัวคุณ

หลายคนคงจะเคยได้ยินคำว่า "รังสีออร่า" แต่รู้กันไหมล่ะว่ามันคืออะไร และสามารถบอกถึงอะไรในตัวเราได้บ้าง

โดยรังสีออร่า คือสีของความคิดและอารมณ์จะมีลักษณะเป็นหมอกไหลปรากฏเป็นหย่อมๆ เห็นได้ชัดเจนบริเวณรอบศีรษะและเหนือบ่า

วิธีคิดหารังสีออร่าของตัวคุณ เพียงคำนวณตามสูตร นำวัน เดือน ปี ค.ศ. ที่เกิด มาบวกกัน สมมุติว่า เกิดวันที่ 5 เดือนพฤษภาคม ค.ศ. 1960 ก็นำเลขทั้งหมดมาบวกกันคือ 5 + 5 + 1960 = 1970

จากนั้นก็แยกตัวเลขออกมาบวกกันอีกครั้ง จะได้เป็น 1 + 9 + 7 + 0 = 17 ก็นำมาแยกบวกอีกจนกว่าจะได้เลขตัวเดียว ซึ่งก็คือ 1 + 7 = 8

เมื่อได้ ผลลัพธ์เป็นเลขตัวเดียว แล้วขอให้ดูว่าตัวเลขที่ได้ตรงกับสีพื้นฐานสีอะไร มีความหมายว่าอย่างไร แต่ถ้าเลขบวกกันแล้วได้ผลเป็น 11 และ 22 ไม่ต้องแยกบวกอีก เพราะเป็นพวกพิเศษกว่าพวกอื่น

1. สีแดง : ผู้นำ
พวกมีสีแดงเป็นสีพื้นฐาน จะมีความกระตือรือร้น เป็นผู้นำ
ทะเยอ ทะยาน เต็มไปด้วยพลังงาน มีความกระฉับกระเฉงและพลังทางเพศ มีเสน่ห์ พูดจาโน้มน้าวจิตใจผู้อื่นได้ดี เป็นคนสนุกสนาน โอบอ้อมอารี กล้าหาญ

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

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

2. สีส้ม/ แสด : มนุษยสัมพันธ์ดี
คุณเป็นคนอบอุ่น น่าคบ เข้ากับคนง่าย กระฉับกระเฉงว่องไว มีความสุข เป็นสีที่คอบควบคุมกล้ามเนื้อ แต่มีมากไปจะเย่อหยิ่ง ชอบเป็นที่ปรึกษาปัญหาให้ใครต่อใคร ชอบช่วยเหลือ และทำตัวให้เป็นประโยชน์อยู่เสมอ จิตใจสมถะ ชอบปิดทองหลังพระ คุณควรคบกับคนที่มีนิสัยคล้ายคลึงกัน ไม่งั้นคนอื่นจะเอาเปรียบคุณ

ข้อเสีย ขี้เกียจ ใจน้อย มักถูกคนอื่นเอาเปรียบ

3. สีเหลือง : มีความคิดสร้างสรรค์ ฉลาด
คุณเป็นคนคิดอะไรรวดเร็ว มีความกระตือรือร้นอยู่เสมอ เข้าสังคมง่ายปรับตัวเก่ง ชอบคุยถกเถียงปัญหา ชอบเรียนรู้ และทำอะไรหลายๆ อย่างในเวลาเดียวกัน เป็นคนฉลาด หลักแหลม และเรียนรู้อะไรได้รวดเร็ว มีเมตตา รักเพื่อนมนุษย์ เป็นสีคุ้มกันโรคภัย มีพรสวรรค์ด้านการพูด งานที่ทำควรเกี่ยวกับการพูดเป็นสื่อ เช่น ครู เซลล์แมน นักการทูต ที่ปรึกษา ฯลฯ หรืองานอาชีพที่ต้องใช้คำพูดเป็นหลัก

ข้อเสีย จับจด ขี้อาย โกหกเก่ง

4. สีเขียว : รักษาโรค
คุณเป็นคนรักสงบ ละเอียดอ่อน ชอบช่วยเหลือผู้อื่น จิตใจดี มีพลังจิต ไว้วางใจได้ คุณอาจมีลักษณะภายนอกหงิมๆ หรือเรียบง่าย แต่ส่วนลึกแล้วดื้อน่าดู คุณเป็นพวกสู้งาน หนักเอาเบาสู้ มีความสามารถในการใช้มือ เป็นสีแห่งความสมดุลและปรับตัว

ข้อเสีย ดื้นรั้น ไม่รับฟังความคิดเห็นของผู้อื่น

5. สีน้ำเงิน : เป็นได้ทุกอย่าง
คุณเป็นพวกมองโลกในแง่ดี แม้ชีวิตจะลุ่มๆ ดอนๆ ไปบ้างแต่ยังยิ้มสู้เสมอ เชื่อมั่นในตนเอง ซื่อตรง พยายามยืนหยัดด้วยตัวเอง แสงออร่าของคุณจึงกว้างและสว่างไสวเสมอ ทำให้กระชุ่มกระชวยดูอ่อนกว่าวัย
คุณมีความจริงใจ ซื่อสัตย์ ปากกับใจตรงกัน รักการผจญภัย มีความคิดสร้างสรรค์และมีจินตนาการ ชอบพบปะผู้คน และสนใจการแลกเปลี่ยนวัฒนธรรม มีพรสวรรค์หลายๆ ด้าน

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

6. สีคราม : มีความรับผิดชอบสูง
คุณชอบงานด้านสังคมสงเคราะห์ ช่วยเหลือผู้อื่น ชอบรับผิดชอบงาน จิตใจโอบอ้อมอารี เป็นที่พึ่งของผู้อื่นได้ ไม่เห็นแก่ตัว เป็นสีของพลังจิต สัมผัสที่ 6 โทรจิตต่างๆ มีความคิดฉลาดล้ำลึกและสร้างสรรค์ นิยมความเป็นหนึ่งเดียวกับธรรมชาติ มีความจริงใจ ชอบค้นหาสัจจะความจริงของชีวิต

ข้อเสีย ปฏิเสธใครไม่เป็น ควรหาเวลาเป็นตัวของตัวเองบ้าง มีมาตรฐานการทำงานสูง จึงมักหงุดหงิดกับอะไรๆ ที่ไม่ได้ตามมาตรฐานของตนเอง

7. สีม่วง : ฉลาดล้ำลึก และสันโดษ
คุณมีจิตใจละเอียดอ่อน สนใจในศาสตร์ลึกลับจนบางครั้งดูเหมือนเป็นคนลึกลับ คุณมีประสาทสัมผัสที่ 6 สูง รักสันโดษจนดูเหมือนคุณจะเข้ากับใครไม่ได้ มักมีปัญหาบริเวณท้อง

ข้อเสีย มักดูถูกความคิดผู้อื่น และเก็บความรู้สึกมากเกินไป

8. สีชมพู : นักบริหาร นักธุรกิจ
คุณเป็นคนมีความตั้งใจจริง แต่ค่อนข้างดื้อรั้น วางมาตรฐานตัวเองไว้สูง มุ่งมั่นที่จะให้บรรลุเป้าหมายและความสำเร็จ ถ้าคุณรู้ว่าเป็นฝ่ายถูก คุณจะยืนหยัดต่อสู้อย่างไม่ยอมถอย มีพลังที่แจ่มใส รักสงบ เต็มไปด้วยความรัก โรแมนติก อารมณ์ขัน ถ่อมตน ปลอบประโลมคนเก่ง

ข้อเสีย มักจะใจคอโลเล อาชีพของคุณจึงต้องเกี่ยวกับการบริหารและความรับผิดชอบ

9. สีทองเหลือง : นักสังคมสงเคราะห์
คุณเป็นคนอ่อนโยน ชอบช่วยเหลือผู้อื่น เป็นทั้งนักปราชญ์และเป็นคนมีคุณธรรมเต็มเปี่ยม มีความสุขมากที่สุดเมื่อได้ ช่วยเหลือผู้อื่นโดยไม่หวังผลตอบแทน เป็นคนมีความสุขและมองโลกในแง่ดี

ข้อเสีย ปฏิเสธใครไม่เป็น จึงถูกเอาเปรียบบ่อยๆ ควรรู้จักปฏิเสธบ้าง

11. สีเงิน : นักอุดมคติ
คุณมีประสาทสัมผัสที่ 6 มีศักยภาพสูงในหลายๆ ด้าน
เต็ม ไปด้วยความคิดแปลกๆ ใหม่ๆ ชอบฝันหวาน แต่คุณมักจะฝันมากกว่าลงมือทำจริงๆ เป็นคนซื่อสัตย์ มีความเชื่อมั่นในตัวเอง มองโลกในแง่ดี ถ้ามุมานะสร้างความฝันให้เป็นความจริงคุณจะไปได้ไกลมากทีเดียว

ข้อเสีย ขี้เกียจ และบางครั้งจะเครียดจนใครๆ ไม่กล้าเข้าใกล้
ควรหาเวลาพักผ่อน ฝึกสมาธิ หรือโยคะ

22. สีทอง : ไม่มีขอบเขตจำกัด
คุณสามารถทำเรื่องใหญ่ให้กลายเป็นเรื่องเล็ก หรือทำงานใหญ่ให้กลายเป็นเรื่องปอกกล้วยเข้าปาก คุณจะประสบความสำเร็จไปแทบทุกเรื่อง เป็นคนมีเสน่ห์จูงใจ ทำงานหนักเอาเบาสู้ มีเป้าหมาย ในการทำงานที่แน่นอน มีอุดมคติและความสามารถสูง เป็นผู้นำสามารถโน้มน้าวจิตใจผู้อื่นได้

ที่มา Forward Mail

11 กุมภาพันธ์ 2552

เสน่ผ้าขี้ริ้ว

http://images.torrentmove.com/it/200882622391711.jpg
ผ้าขี้ริ้วยอมสกปรกเพื่อให้สิ่งอื่นสะอาด


          เสน่ห์ของคนอยู่ที่ยอมลำบากเพื่อให้ผู้อื่นเป็นสุข พ่อแม่ยอมเหนื่อยเพื่อให้ลูกหลานอยู่สุขสบาย ความสุขแท้ของคนคือการได้ยืนแอบยิ้ม อยู่เบื้องหลังความสำเร็จของผู้อื่น

ผ้าขี้ริ้วดูดซับความสกปรกได้ แต่ก็สลัดความสกปรกออกจากตัวได้ตลอดเวลา


          เสน่ห์ของคนอยู่ที่รู้ตัวเองว่าสกปรก ถึงเวลาต้องชำระล้างแล้ว มิใช่อมความสกปรกไว้แล้ว แกล้งบอกว่าตนเองสะอาด
ผ้าขี้ริ้วเป็นผ้าที่สะอาดที่สุด ในขณะที่คนมองว่าสกปรกที่สุด 

          เหมือนคนที่ฝึกหัดขัดเกลาตนเอง รู้จักถ่อมตนและอ่อนโยน ไม่โอหังอวดดีให้เป็นที่รังเกียจหมั่นไส้ของคนอื่น เขาจะเป็นคนที่มีคุณค่า ไม่ว่าจะมาจากสกุลใด การศึกษามากหรือน้อยก็ตาม เป็นผู้ใฝ่รู้แต่ไม่อวดดี เหมือนผ้าขี้ริ้วห่อทอง

ผ้าขี้ริ้วถึงจะเป็นผ้าไม่มีราคา แต่มีคุณค่ายิ่งใหญ่ได้
 

          เหมือนคนที่พยายามทำตนให้มีคุณค่า ด้วยการทำงานมิใช่ด้วยการประจบ ทำตนให้มีประโยชน์ ให้มีค่า ไม่ใช่งอมืองอเท้า น้อยเนื้อต่ำใจในวาสนาชะตาชีวิต ต้องสร้างกำลังใจให้ตนเองอย่ารอคอยจากคนอื่น

ผ้าขี้ริ้วไม่เกี่ยงงอนว่าจะถูกใช้เช็ดถูอะไร
 

          เหมือนคนที่ยอมตัวอาสาทำงานที่ได้รับมอบหมาย โดยไม่ปริปากบ่น รู้จักอาสาคน อาสาทำงาน ต้องตั้งใจทำงานโดยไม่เกี่ยงงอน ไม่ว่าจะเป็นงานใดๆ ก็ตาม คนที่ตกงานเพราะไม่ยอมทำงาน

ผ้าขี้ริ้วยอมให้ถูกใช้งานในที่สกปรกที่สุด
 

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

ผ้าขี้ริ้วพอใจที่ได้อยู่เบื้องหลังความสะอาด
 

          เหมือนคนควรพอใจที่ได้อยู่เบื้องหลัง ความสำเร็จของคนอื่น ต้องมีความพอใจที่จะทำงานปิดทองหลังพระ เป็นนายอินหรือนางอิน ผู้ปิดทองหลังพระ มีความสุขและภูมิใจที่ได้มอบความสำเร็จให้คนอื่น มีมากที่ผู้น้อยบางคน ทำงานแล้วทำให้ผู้ใหญ่เล็กลง ขณะที่ตัวเองโตขึ้น

ผ้าขี้ริ้วทนทานต่อการขัดถูซักล้างไม่เปราะบาง
 

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

ผ้าขี้ริ้วแม้จะถูกมองว่าเป็นผ้าขี้ริ้ว แต่ไม่ทำตัวให้ขี้เหร่
 

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

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

แต่ละราศีมีลักษณะคล้ายดอกไม้ชนิดไหน

ดอกไม้ประจำราศี***

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

http://images.torrentmove.com/tz/yello20chrysanthemum.jpg
ดอกเบญจมาศ เป็นดอกไม้ประจำราศีมังกร ผู้ที่เกิดระหว่าง 22 ธ.ค.-19 ม.ค. เป็นดอกไม้ตัวแทนชนชั้นสูง ราชวงศ์ หรือกษัตริย์ ทนนานและมีพลังฉลาดแฝงอยู่มากเป็นพิเศษ คนราศีมังกรจึงเต็มไปด้วยความฉลาด มีความคิดวางแผนเป็นขั้นเป็นตอน เป็นดอกไม้แห่งความสำเร็จจึงมักจะมีผู้ให้การช่วยเหลือหรืออุปถัมภ์ตลอดอย่างที่บอกแล้วว่าเป็นนักวางแผนที่ดี มีการวางแผนด้านการเงินเป็นเลิศ จึงเหมาะกับการลงทุนด้านอสังหาริมทรัพย์ อาชีพที่เหมาะคือ วิศวกร สถาปนิก ผู้ผลิตรายการสื่อต่าง ๆ งานเกี่ยวกับการเงิน ด้านความรักเป็นคนที่จริงใจและซื่อสัตย์ เพราะคนราศีมังกรจะเป็นพวกหัวอนุรักษนิยมเกี่ยวกับประเพณีและความเชื่อมาก

http://images.torrentmove.com/tr/a2e0b984e0b8a1e0b989e0b8aae0b8b5e0b8a1e0b988e0b8a7e0b887e0b899e0b989e0b8b3e0b980e0b887e0b8b4e0b899.jpg
ดอกกล้วยไม้ เป็นดอกไม้ประจำราศีกุมภ์ ผู้ที่เกิดระหว่าง 20 ม.ค.-18 ก.พ. กล้วยไม้เป็นไม้ที่ต้องการการดูแลอย่างดี เป็นตัวแทนของการเอาใจใส่ดูแลอย่างลึกซึ้ง กล้วยไม้มักจะถูกจัดไว้ในที่ที่โดดเด่นโดยมี ดอกไม้อื่นแวดล้อม ชาวราศีกุมภ์จึงเต็มไปด้วยการเอื้ออาทรผู้คนรอบข้าง มีความฉลาดในตัวเอง รักธรรมชาติ ใจกว้างชาวราศีกุมภ์จะชอบสิ่งของไฮเทค จึงเหมาะกับงานที่เกี่ยวข้องกับเทคโนโลยี โทรทัศน์ นักเขียน ศิลปิน อีกด้านก็สนใจเรื่องศาสนา ประวัติศาสตร์ และของโบราณ เขาสามารถผสมผสานศาสตร์เก่าและใหม่เข้ากันได้อย่างดี ด้านความรักจะชอบยึดมั่นในคำสัญญา ซื่อสัตย์และจงรักภักดีมาก

http://images.torrentmove.com/tj/spd_20051110134223_b.jpg

ดอกคาร์เนชั่นแดง เป็นดอกไม้ประจำราศีมีน
ผู้ที่เกิดระหว่าง 19 ก.พ.-20 มี.ค. เป็นตัวแทนของศิลปิน เป็นดอกไม้แห่งความฝันอันลึกลับ มีความคิดจินตนาการสูง อาชีพที่เหมาะสมจะเป็นพวกนักแสดง นักเขียน จิตกร นักแต่งเพลง นักวิจารณ์อาหาร นักสังคมสงเคราะห์คนราศีมีนมีอารมณ์ปรวนแปรง่าย ด้านความรักก็มักจะอ่อนไหว อารมณ์รักปรวนแปรแต่ก็เขาก็เป็นคนมีเส่นห์เร้าใจใช่เล่น มีความชอบส่วนตัวในเรื่องศาสนา และมีสัมผัสพิเศษด้านจิตวิญญาณ หรือ มีสัมผัสที่ 6
http://images.torrentmove.com/tw/616504.jpg

ดอกลิลลี่ เป็นดอกไม้ประจำราศีเมษ ผู้ที่เกิดระหว่างวันที่ 21 มี.ค.-19 เม.ย. ลิลลี่เป็นดอกไม้แห่งความโดดเด่นและการเป็นผู้นำ นับเป็นดอกไม้อีกชนิดหนึ่งที่มักจะถูกวางไว้ในจุดที่สูงส่ง แต่ถึงแม้จะอยู่ในจุดที่ไม่สูงนักแต่ความเด่นของดอกลิลลี่ก็มักจะเป็นจุดสนใจเสมอ เหมือนกับคนราศีเมษที่จะมีความโดดเด่นกว่าคนอื่นนักบริหารธุรกิจ นักแสดง นายทหารชั้นผู้ใหญ่ หรือนักประดิษฐ์คิดค้นต่าง ๆ เป็นอาชีพที่เหมาะสมกับคนราศีเมษ ด้านความรักเป็นคนโรแมนติก ชอบการครอบครองและเป็นเจ้าเข้าเจ้าของ
http://images.torrentmove.com/te/1214495460.jpg

ดอกลีลาวดี เป็นดอกไม้ประจำราศีพฤษภ ผู้ที่เกิดระหว่างวันที่ 20 เม.ย.-20 พ.ค. บุคลิกของดอกลีลาวดีคือการรอคอยสิ่งที่ดีที่สุดสำหรับตัวเอง มีการคิดและวางแผนระยะยาวอย่างรอบคอบและสุขุม รักสงบและมองโลกในแง่บวก จึงเป็นคนโกรธยากและมีความจำเป็นเลิศคนราศีพฤษภจะใช้จ่ายอย่างมีเหตุผลและเป็นนักลงทุนที่ดี เหมาะที่จะทำอาชีพแพทย์ สถาปนิก วิศวกร โบรกเกอร์หุ้น มัณฑนากร เขาเป็นพวกชอบความงามตามธรรมชาติและมีสัมผัสพิเศษในเรื่องปรากฏการณ์ทางธรรมชาติ ส่วนเรื่องความรักจะเป็นคนรักษาสัญญา เห็นอกเห็นใจและปกป้องคู่รักดี
http://images.torrentmove.com/tq/512204499_41b68e2af7.jpg

ดอกเล็บมือนาง เป็นดอกไม้ประจำราศีเมถุน ผู้ที่เกิดระหว่างวันที่ 21 พ.ค.-20 มิ.ย. เล็บมือนางเป็นดอกไม้ที่มีความงามเฉพาะตัว มีเสน่ห์แบบง่าย ๆ คนราศีนี้จึงมีความคิดเปิดกว้างและยืดหยุ่นสูง อาชีพที่เด่นและเหมาะที่สุดคือการเป็นนักหนังสือพิมพ์ นักดนตรี ศัลยแพทย์ ช่างภาพ นักกวีและงานที่เกี่ยวกับศิลปะทุกชนิดแต่คนราศีเมถุนเป็นพวกรสนิยมสูงรายได้ต่ำ จึงมักจะสร้างหนี้สินล้นพ้นตัวอยู่บ่อยครั้ง ด้านความรักเป็นคนอ่อนไหวง่าย ชอบหว่านเสน่ห์และเจ้าชู้ เนื่องจากชอบความรักแบบตื่นเต้นอยู่ตลอดเวลา

http://images.torrentmove.com/tb/e0b894e0b8ade0b881e0b89ae0b8b1e0b8a7e0b8abe0b8a5e0b8b2e0b8a2e0b894e0b8ade0b881.jpg
ดอกบัว เป็นดอกไม้ประจำราศีกรกฎ ผู้ที่เกิดระหว่างวันที่ 21 มิ.ย.-22 ก.ค. จัด เป็นดอกไม้แสนสวย อ่อนหวานและสงบ เรียบร้อย เป็นระเบียบ แต่ก็มักจะจมปลักอยู่กับความฝันอันสวยงามที่วาดขึ้นโดยไม่ยอมตื่น ขึ้นมาพบกับความจริงของชีวิต และมักจะคาดหวังสูง ให้ความใส่ใจในศักดิ์ศรีแห่งความเป็นมนุษย์ เป็นคนไม่ชอบความฟุ่มเฟือยนัก แต่หากเป็นเรื่องของการตกแต่งบ้านชาวดอกบัวจะยอมทุ่มไม่อั้น อาชีพที่เหมาะสมคือ นักจิตวิทยา นักลงทุนในตลาดหุ้น หรืองานที่ช่วยประสานงานโครงการต่าง ๆ ด้านความรักเป็นคนโรแมนติก รักคนยาก แต่ถ้าลองได้รักแล้วก็จะซื่อสัตย์มาก ชอบความรักแบบไม่หวือหวาโลดโผน
http://images.torrentmove.com/ty/2730_untitled1_1.jpg

ดอกทานตะวัน เป็นดอกไม้ประจำราศีสิงห์ ผู้ที่เกิดระหว่างวันที่ 23 ก.ค.–22 ส.ค. ดอกทานตะวันจะเต็มไปด้วยความเป็นมิตร ร่าเริง สนุกสนาน ชาวราศีสิงห์ยังเป็นคนไม่เรื่องมาก ไม่ชอบเรียกร้องความสนใจจากใคร เพราะเขาต้องการแสวงหาความสุขใส่ตัวมากกว่าการต้องระวังตัวท่ามกลางคนหมู่มากเป็นคนรักและชื่นชอบธรรมชาติ แต่ดันชอบของฟุ่มเฟือย อาชีพที่เหมาะสมคือการเป็นนักเขียน ทนายความ นักพูด ส่วนความรักมักจะไม่ชอบการผูกมัด แต่ชอบแสดงออกเรื่องรักและเป็นคนโรแมนติก เรียกว่าเป็นคนเจ้าชู้เล็ก ๆ ก็ว่าได้

http://images.torrentmove.com/ta/rflower7.jpg
ดอกทิวลิป เป็นดอกไม้ประจำราศีกันย์ ผู้ที่เกิดระหว่างวันที่ 23 ส.ค.-22 ก.ย. ดอกทิวลิปเป็นตัวแทนของความนิ่มนวล และการถูกขัดเกลาอย่างดี ชาวราศีกันย์จึงเป็นคนที่แคร์ความรู้สึกของคนอื่นมากกว่าคนในราศีใด ๆ ชอบเห็นใจผู้อื่น และฉลาดหลักแหลม นอกจากนี้ยังเจ้าระเบียบ และตรงต่อเวลาอย่างมากจุดเด่นอีกอย่างที่เป็นที่อิจฉาของใคร ๆ ก็คือเป็นคนที่เก็บเงินเก่ง อาชีพที่เหมาะ คือ แพทย์ บรรณารักษ์ นักวิจารณ์ละครและงานศิลปะ สำหรับเรื่องความรักนั้นจะเต็มไปด้วยความอ่อนหวาน เห็นอกเห็นใจซึ่งกันและกัน

http://images.torrentmove.com/tg/27440.jpg
ดอกกุหลาบ เป็นดอกไม้ประจำราศี ตุล ผู้ที่เกิดระหว่างวันที่ 23 ก.ย.–22 ต.ค. กุหลาบเป็นดอกไม้ที่ประณีต สวยงาม โดดเด่น คนราศีตุลจึงมีเสน่ห์ในวงสนทนาเป็นพิเศษ แต่เขาไม่ใช่คนมีระเบียบมากนัก อาจจะรกรุงรังมากกว่าคนอื่นด้วยซ้ำนักดนตรีระดับสูง ผู้เชี่ยวชาญด้านคอมพิวเตอร์กราฟิก มัณฑนากร ผู้เชี่ยวชาญด้านความงาม ที่ปรึกษาด้านภาพลักษณ์ เป็นอาชีพที่เหมาะสมกับคนราศีนี้ที่สุด เขายังเป็นคนมีความเชื่อด้านความรักอย่างลึกซึ้ง ความรักของเขาจึงเต็มไปด้วยความโรแมนติกและอ่อนหวาน แต่ก็ให้อิสระด้านความคิด
http://images.torrentmove.com/tv/29841.jpg

ดอกกระบองเพชร เป็นดอกไม้ประจำราศีพิจิก ผู้ที่เกิดระหว่างวันที่ 23 ต.ค.-21 พ.ย. ดอกกระบองเพชรมีความลึกลับทั้งด้านการเกิดและกลีบดอก ชาวดอกกระบองเพชรจึงมีความลับเยอะ และสิ่งนี้ที่ส่งให้เขามีเสน่ห์น่าค้นหาตลอดเวลา เป็นคนเงียบ ๆ เก็บงำเรื่องราวของตนเองไว้โดยไม่บอกให้ใครรู้ ไม่ชอบออกงานสังคมเขาเหมาะที่จะทำอาชีพนักโบราณคดี ทนายความ ที่ปรึกษาการลงทุน เภสัชกร ศัลยแพทย์ ด้านความรักจะเป็นคนเข้มงวดมาก เจ้าอารมณ์ แต่ก็มีความอ่อนไหวและลึกซึ้ง เขายังมีเสน่ห์ดึงดูดใจเรื่องบนเตียงเป็นอย่างมาก แถมยังเป็นคู่รักที่เต็มไปด้วยอารมณ์และความปรารถนา

http://images.torrentmove.com/td/1159123327.jpg

ดอกเบิร์ด ออฟ พาราไดส์ เป็นดอกไม้ประจำราศีธนู
ผู้ที่เกิดระหว่างวันที่ 22 พ.ย.–21 ธ.ค. ผู้เกิดราศีนี้จะมีความสนุกสนานในชีวิต ชีวิตเต็มไปด้วยความพยายามและทะเยอทะยาน แต่ก็มีอารมณ์ผ่อนคลายและยืดหยุ่น จึงเป็นคนมองโลกในแง่ดีเขาจึงเหมาะที่จะเป็นนักเดินทาง นักวาดการ์ตูน นักแสดงตลก นักการเมือง สัตวแพทย์ และนักบิน ด้านความรักจะเป็นคนที่มีอารมณ์อ่อนไหว มีความซื่อสัตย์ในรัก และชอบการผจญภัย.