Most popular

วันอาทิตย์ที่ 30 ตุลาคม พ.ศ. 2554

คิงส์ตัน อัพเกรดแฟลชไดร์ฟด้วย urDrive

“คิงส์ตัน” แปลงโฉมไดรฟ์ USB ด้วย urDrive ที่เป็นซอฟต์แวร์ที่ช่วยให้การจัดการไฟล์บนไดรฟ์ USB พร้อมฟีเจอร์เพื่อความปลอดภัยสำหรับคอมพิวเตอร์ ช่วยให้ท่องเว็บอย่างปลอดภัย และยังมีเกมมากมาย...

บริษัท คิงส์ตัน เทคโนโลยี ประเทศไทย ผู้ผลิตและพัฒนาหน่วยความจำรายใหญ่ของโลก เปิดตัว urDrive แอพลิเคชันที่แถมมากับไดรฟ์ USB DataTraveler ของคิงส์ตันที่จะแปลงโฉมไดรฟ์ USB จากอุปกรณ์จัดเก็บธรรมดาให้เป็นอุปกรณ์ที่ให้ผู้ใช้สามารถเข้าถึงและจัดการไฟล์ ภาพถ่าย เพลง เกมและวิดีโอส่วนตัวได้อย่างง่ายดาย พร้อมโปรแกรมชมภาพถ่ายและเครื่องเล่น MP3 ในตัวที่ให้การชมอัลบั้มภาพและการฟังเพลงเป็นเรื่องง่าย

นายนาธาน ซู ผู้อำนวยการฝ่ายขายผลิตภัณฑ์หน่วยความจำแฟลชประจำภูมิภาคเอเชียแปซิฟิค บริษัทคิงส์ตัน กล่าวว่า ไดรฟ์ USB ถูกมองว่าเป็นอุปกรณ์สื่อสารดิจิตอล ที่ใช้ในการเคลื่อนย้ายข้อมูลระหว่างอุปกรณ์มาโดยตลอด คิงส์ตันเป็นผู้ผลิตรายแรกที่ปฏิวัติรูปแบบการมีปฏิสัมพันธ์ระหว่างผู้ใช้กับไดรฟ์ USB ด้วย urDrive ที่ให้ผู้ใช้ทุกเพศทุกวัยสัมผัสได้ถึงประสบการณ์ใหม่แห่งไดรฟ์ USB ที่เป็นมากกว่าอุปกรณ์จัดเก็บและถ่ายโอนข้อมูล ทั้งนี้ urDrive มาพร้อม Norton PC Checkup ซอฟต์แวร์เพื่อความปลอดภัยสำหรับคอมพิวเตอร์ โดดเด่นด้วยเครื่องมือตรวจสอบที่จะสแกนหาไวรัส สปายแวร์ เวิร์มและแอดแวร์ รวมถึงตรวจสอบความล่าช้าในการทำงานและความเสี่ยงที่อาจเกิดขึ้นกับข้อมูล 

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

ด้าน นายเควิน แชปแมน ผู้จัดการทั่วไปและรองประธานฝ่ายบริการลูกค้าของ Norton กล่าวว่า “ในปัจจุบันผู้ใช้มีการพัฒนาพฤติกรรมการใช้คอมพิวเตอร์มากยิ่งขึ้น ซึ่ง urDrive พร้อมเปิดมิติใหม่แห่งอุปกรณ์จัดเก็บข้อมูลแบบพกพาที่ทั้งแปลกใหม่ แตกต่างและใช้งานได้จริง ซอฟต์แวร์ Norton PC Checkup ช่วยให้ผู้ใช้ urDrive สามารถเข้าถึงเนื้อหาต่างๆ ได้มากยิ่งขึ้นด้วยการวิเคราะห์ประสิทธิภาพและความปลอดภัยอย่างเหนือระดับ เราภูมิใจที่ได้เป็นส่วนหนึ่งของนวัตกรรมใหม่แห่งไดรฟ์ USB ในครั้งนี้ ซึ่ง Norton PC Checkup จะช่วยให้ผู้ใช้อุ่นใจในความปลอดภัยได้ทุกที่และทุกเวลาอย่างแน่นอน

ส่วน นายคาร์ล แมตต์สัน ผู้จัดการทั่วไปและหัวหน้าฝ่ายผลิตภัณฑ์ของ Maxthon International LTD กล่าวว่า Maxthon 3 ให้ผู้ใช้ urDrive สัมผัสได้ถึงประสบการณ์แห่งการท่องเว็บแบบเคลื่อนที่อย่างปลอดภัย พร้อมทั้งให้ผู้ใช้นำประวัติการท่องเว็บ การคั่นหน้าเว็บและการตั้งค่าต่าง ๆ ไปใช้ได้ทุกที่ตามต้องการด้วย urDrive

urDrive เหมาะกับผู้ใช้ทุกเพศทุกวัยและการใช้งานทุกรูปแบบไม่ว่าจะเป็นที่ทำงาน ที่บ้านหรือขณะเดินทาง โดยนักธุรกิจสามารถเข้าถึงเนื้อหาต่าง ๆ ได้จากทั้งที่ทำงานและที่บ้าน รวมถึงสามารถขยายขอบเขตในการจัดเก็บด้วยบริการสำรองข้อมูลออนไลน์จากไดรฟ์ USB ลงในระบบคลาวด์ฟรี สำหรับครอบครัว urDrive ให้บริการเกมใหม่ล่าสุดจาก EA Games และ PopCap ทั้งนี้ผู้ปกครองที่มีธุระรอบตัวสามารถวางใจได้ว่าบุตรหลานจะท่องโลกออนไลน์ได้อย่างปลอดภัยด้วย Fooz Kids เว็บบราวเซอร์สำหรับเด็ก และ urDrive ยังให้นักเดินทางสามารถเรียกดู จัดการและแบ่งปันอัลบั้มภาพถ่ายและวิดีโอรวมถึงนำสำเนาเอกสารสำคัญอย่างหนังสือเดินทางติดตัวได้ในขณะเดินทางอีกด้วย

ทั้งนี้ิ urDrive จะมีแถมให้ฟรีในไดรฟ์ USB รุ่น DataTraveler 101G2, 108 และ 109 ของคิงส์ตัน รวมถึงรุ่น DTIG3ในอนาคต สามารถเลือกดีไซน์และความจุได้ตามใจชอบตั้งแต่ขนาด 4GB ถึง 32GB




ที่มา : ไทยรัฐ http://www.thairath.co.th/content/tech/212854


วันเสาร์ที่ 29 ตุลาคม พ.ศ. 2554

ย้ายภาพไปที่อัลบั้มอื่นใน facebook เรื่องง่ายที่มองข้าม

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

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




วันพฤหัสบดีที่ 6 ตุลาคม พ.ศ. 2554

Steve Jobs ด้วยอาลัยรักจากใจ Gates, Zuckerberg, Obama และบุคคลสำคัญมากมาย!

แม้ว่า Steve Jobs จะจากพวกเราไปอย่างไม่มีวันกลับด้วยวัยเพียง 56 ปีทว่าเขาจะยังอยู่ในความทรงจำของสาวก Apple ตลอดไป โดยล่าสุดในเวลานี้เหล่าบรรดาบุคคลสำคัญจากทั่วโลกต่างก็เริ่มออกมากล่าวถ้อยแถลงแสดงความเสียใจต่อการเสียชีวิตก่อนวัยอันควรกันแล้ว TechXcite ขอพาทุกท่านไปรับทราบกันดีกว่าครับว่าผู้ทรงอิทธิพลต่อโลกเหล่านี้รำลึกถึง Steve Jobs กันในแง่ไหนบ้าง


Bill Gates ผู้ร่วมก่อตั้งบริษัท Microsoft
- ผมรู้สึกเสียใจเป็นอย่างยิ่งต่อการจากไปของ Steve Jobs ซึ่งทั้งผมและ Melinda ภรรยาของผมขอแสดงความเสียใจต่อครอบครัว, เพื่อนฝูงรวมถึงสมัครพรรคพวกที่ได้เคยร่วมงานกับเขาทั้งหมดด้วย Steve กับผมพบกันเมื่อ 30 ปีก่อน เราเป็นทั้งเพื่อนร่วมวงการ, คู่แข่งรวมถึงเพื่อนสนิทมากว่าครึ่งชีวิตของพวกเราแล้ว ทั้งนี้โลกเราแทบจะไม่เคยเจอใครที่ส่งผลกระทบอย่างสุดซึ้งเท่า Steve มาก่อนซึ่งคนรุ่นหลังจะได้ตระหนักถึงความสำคัญของเขาต่อไปด้วย สำหรับใครก็ตามที่โชคดีได้มีโอกาสทำงานกับเขาต้องถือว่าเป็นเกียรติอย่างสูง สุดแล้ว ผมจะคิดถึง Steve ตลอดไปครับ



Bob Iger ประธานบริษัท Disney


- Steve Jobs เป็นเพื่อนที่ดีที่สุดแถมยังเป็นที่ปรึกษาที่ดีด้วย เรื่องราวของเขายิ่งใหญ่เกินกว่าผลิตภัณฑ์ทุกอย่างที่เขาได้สร้างสรรค์เอา ไว้ให้กับวงการเสียอีก ถือได้ว่าเขาไดสร้างแรงบันดาลใจให้คนนับล้าน หลายชีวิตที่ต้องเปลี่ยนไป รวมถึงวัฒนธรรมใหม่ที่เขาได้สร้างขึ้นด้วยมือของตัวเองอีกด้วย Steve ถือได้ว่าเป็นบุคคลที่มีความคิดสร้างสรรและจินตนาการไม่ซ้ำใคร Disney ขอแสดงความเสียใจอย่างยิ่งที่ต้องสมาชิกคนสำคัญในครอบครัวไป ในขณะที่ผมเองต้องเสียเพื่อนรักที่สุดในชีวิตไปด้วยเช่นกัน




Barack Obama ประธานาธิบดีของประเทศสหรัฐอเมริกา
- Michelle และผมรู้สีกเสียใจเป็นอย่างยิ่งต่อการจากไปของ Steve Jobs เพราะ Steve ถือได้ว่าเป็นนักประดิษฐ์ผู้ยิ่งใหญ่ที่สุดคนหนึ่งของอเมริกาที่กล้าจะคิด ต่าง, มั่นใจว่าตัวเองสามารถจะเปลี่ยนแปลงโลกใบนี้ด้วย รวมถึงมีความสามารถเพียงพอที่จะไปถึงจุดมุ่งหมายนั้นด้วย โลกได้สูญเสียบุคลากรที่มีวิสัยทัศน์ยิ่งใหญ่ซึ่งความสำเร็จสูงสุดของเขาก็ คงไม่มีอะไรจะพูดมากเกินไปกว่าการที่ทุกคนบนโลกต่างรับทราบข่าวคราวการเสีย ชีวิตของ Steve ผ่านทางอุปกรณ์ที่เขาสรรค์สร้างขึ้นมานั่นเอง




Warrenn Buffett นักธุรกิจและนักลงทุนชื่อดังของอเมริกา
- Steve Jobs คือหนึ่งในนักธุรกิจและนักประดิษฐ์ที่ยิ่งใหญ่ที่สุดคนหนึ่งในประวัติศาสตร์ของอเมริกา




Eric Schmidt ประธานกรรมการบริษัท Google
- Steve Jobs คือ CEO ที่ประสบความสำเร็จมากที่สุดในประวัติศาสตร์ของประเทศสหรัฐอเมริกาในช่วง 25 ปีหลังสุด เขาได้ผสมผสานความชื่นชอบในศิลปะเข้ากับวิสัยทัศน์ของนักประดิษฐ์ในการก่อ ตั้งบริษัทที่มีความพิเศษกว่าใคร Steve คือหนึ่งในนักประดิษฐ์




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




Mark Zuckerberg ผู้ก่อตั้งและ CEO ของบริษัท Facebook
- Steve ขอบคุณมากที่เป็นอาจารย์และเพื่อนที่ดีของผมมาโดยตลอด ขอบคุณที่แสดงให้ผมเห็นว่าสิ่งที่คุณสร้างขึ้นมาสามารถเปลี่ยนแปลงโลกใบนี้ ผมจะคิดถึงคุณมากๆเลย




Carol Bartz อดีต CEO ของบริษัท Yahoo
- ถือได้ว่าการสูญเสีย Steve Jobs ไปคือความเศร้าเสียใจอย่างสุดซึ่ง เขาเป็นบุคคลที่มีคาแรกเตอร์แข็งกร้าว บางทีก็ออกจะโหดเหี้ยมด้วยซ้ำ แต่เชื่อฉันเถอะว่าทุกคนต่างหวังให้เขาขึ้นกล่าวคีย์โน้ตในงานเปิดตัว iPhone 4S เมื่อวานนี้เสียด้วยซ้ำ แม้ว่าจะเป็นเรื่องง่ายที่จะพยายามทำตัวให้ถูกใจทุกคนทว่าเขาก็ยังคงยึดมั่น กับหลักการของตัวเองอย่างเคร่งครัดเสมอมา






ที่มา : http://technology.impaqmsn.com/article.aspx?path=spec&rid=0&id=13935



วันพฤหัสบดีที่ 29 กันยายน พ.ศ. 2554

การรันคำสั่งด้วย Parallel ใน .net 4


ซึ่งใน .net 4 จะมี library ที่ชื่อ System.Threading.Tasks ให้เราใช้ในการจัดการกับ Task หรือคำสั่งต่างๆ เช่นเราต้องการจัดการกับเมธอดหลายๆ
 เมธอดเพื่อให้ทำงานพร้อมกัน(Concurrency) เช่นมีเมธอด

 A,B,C เราก็ใช้
Parallel.Invoke(A,B,C);
 หรือ
 Parallel.Invoke(()=>A(),
 ()=>B(),
 ()=>C()
 );

 ตัวอย่างการใช้งาน Parallel.Invoke เริ่มแรกให้เราทำการ using System.Threading.Tasks ก่อนแล้วเขียนคำสั่งต่างๆดังนี้

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication22
{
    class Program
    {
        static void Main(string[] args)
        {
            Parallel.Invoke(
                () => A(),
                () => B(),
                () => C()
                    );
            Console.ReadLine();
        }
        static void A()
        {
            Console.WriteLine("A");
        }
        static void B()
        {
            Console.WriteLine("B");
        }
        static void C()
        {
            Console.WriteLine("C");
        }
    }
}


 ซึ่งผลลัพธ์เราจะได้
 A
 B
 C
 ในตัวอย่างนี้จะเป็นการสั่งให้โปรแกรมทำการเรียกใช้เมธอดทั้งสามพร้อมๆกัน ซึ่งถ้าเรามีเมธอดมากกว่านี้เราก็สามารถเรียกใช้ได้เหมือนกับการเรียกเมธอดในตัวอย่างนี้

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Threading;
namespace ConsoleApplication22
{
    class Program
    {
        static void Main(string[] args)
        {
            Parallel.Invoke(
                () => A(),
                () => B(),
                () => C()
                    );
            Console.ReadLine();
        }
        static void A()
        {
            var watch = Stopwatch.StartNew();
            Console.WriteLine("A");
            Console.WriteLine("elapsed time of A is " + watch.Elapsed.TotalSeconds);
        }
        static void B()
        {
            var watch = Stopwatch.StartNew();
            Console.WriteLine("B");
            Console.WriteLine("elapsed time of B is " + watch.Elapsed.TotalSeconds);
        }
        static void C()
        {
            var watch = Stopwatch.StartNew();
            Console.WriteLine("C");
            Console.WriteLine("elapsed time of C is " + watch.Elapsed.TotalSeconds);
        }
    }
}

ซึ่งผลลัพธ์เราจะได้ดังรูป



จากรูปที่ 1 ถ้าเราเพิ่ม Thread.Sleep เข้าไปที่เมธอด B โดยให้ทำการ sleep เป็นเวลา 4 วิ ผลลัพธ์ที่ได้เราจะเห็นเวลาที่เมธอด B ทำงานตั้งแต่เริ่มต้น
 ถึงสิ้นสุดนานกว่าเมธอดอื่นที่ไม่ได้ใช้ Thread.Sleep และจะทำงานเสร็จสิ้นเป็นเมธอดสุดท้ายด้วยดังนี้

         static void B()
         {
             var watch = Stopwatch.StartNew();
             Thread.Sleep(4000);
             Console.WriteLine("B");
             Console.WriteLine("elapsed time of B is " + watch.Elapsed.TotalSeconds);
         }

 ผลลัพธ์เราจะได้ดังรูป




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

การใช้ Task
  ก่อนหน้านี้เราได้ใช้ Parallel.Invokeในการเรียกเมธอดทำงานพร้อมๆกัน ซึ่งในส่วนนี้จะมีอีกวิธีที่สามารถสั่งให้โปรแกรมทำงานพร้อมๆกันด้วยคลาสที่ชื่อ Task
 ซึ่งในการใช้ Task นั้นไม่ยุ่งยากโดยถ้าเรามีหลายๆเมธอดแล้วต้องการให้เมธอดเหล่านี้เริ่มทำงานพร้อมๆกัน เราสามารถแบ่งการทำงานของเมธอดออกเป็น Task แต่ละ Task
 ไปได้ เช่นมี 3 เมธอดคือ A,B,C ถ้าต้องการแบ่งเป็น Task เราก็เขียนได้ดังนี้

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Threading;
namespace ConsoleApplication22
{
    class Program
    {
        static void Main(string[] args)
        {
            var t1 = new Task(()=>A());
            var t2 = new Task(() => B());
            var t3 = new Task(() => C());
            t1.Start();
            t2.Start();
            t3.Start();
            Task.WaitAll(t1, t2, t3);
            Console.WriteLine("Finished all Tasks");
            Console.ReadLine();
           
        }
        static void A()
        {
            var watch = Stopwatch.StartNew();
            Console.WriteLine("A");
            Console.WriteLine("elapsed time of A is " + watch.Elapsed.TotalSeconds);
        }
        static void B()
        {
            var watch = Stopwatch.StartNew();
            Console.WriteLine("B");
            Console.WriteLine("elapsed time of B is " + watch.Elapsed.TotalSeconds);
        }
        static void C()
        {
            var watch = Stopwatch.StartNew();
            Console.WriteLine("C");
            Console.WriteLine("elapsed time of C is " + watch.Elapsed.TotalSeconds);
        }
    }
}

ในตัวอย่างนี้เริ่มแรกให้เราสร้าง Task ขึ้นมาก่อนโดยภายใน Task ก็จะมีการกำหนดเมธอดที่ต้องการใช้งาน Task จากนั้นเรียกคำสั่ง Start เพื่อทำการสั่งให้เริ่มทำงาน Task
 จากนั้นจะมีคำสั่ง WaitAll เพื่อรอให้ทุก Task ทำงานเสร็จก่อนแล้วถึงจะทำการแสดงค่า Finished  all Tasks
 ซึ่งตรง WaitAll นี้เราสามารถกำหนดเวลาเพื่อให้โปรแกรมทำการรอได้เช่นถ้าการทำงานของ Task ทุก Task เกินเวลาที่กำหนดไว้ก็อาจจะให้แจ้งเตือนขึ้นมาว่า
 Task ที่ทำงานนั้นใช้เวลาเกินกว่าทีกำหนด ซึ่งให้เขียนดังนี้
        static void Main(string[] args)
        {
            var t1 = new Task(()=>A());
            var t2 = new Task(() => B());
            var t3 = new Task(() => C());
            t1.Start();
            t2.Start();
            t3.Start();
            if (!Task.WaitAll(new Task[] { t1, t2, t3 }, 4000))
            {
                Console.WriteLine("elapsed time > 4000 ms");
            }
            Console.WriteLine("Finished all Tasks");
            Console.ReadLine();
           
        }

ซึ่งในตัวอย่างนี้ถ้าเรารันโปรแกรมเราจะยังไม่เป็นคำสั่งในส่วนของ Console.WriteLine("elapsed time > 4000 ms");
 เนื่องจากว่าทุก Task ใช้เวลาน้อยกว่า 4000 ms  แต่ถ้าเราเพิ่ม Thread.Sleep ในเมธอดใดเมธอดหนึ่งให้ทำการ Sleep เป็นเวลา 5000 ms เช่นเพิ่ม
 ตรงเมธอด A ดังนี้
 
        static void A()
        {
            var watch = Stopwatch.StartNew();
            Thread.Sleep(5000);
            Console.WriteLine("A");
            Console.WriteLine("elapsed time of A is " + watch.Elapsed.TotalSeconds);
        }

ผลลัพธ์ที่ได้เราจะได้ดังรูป






ที่มา : คุณ paedotnet http://www.codetoday.net/default.aspx?g=posts&t=2945

วันอังคารที่ 27 กันยายน พ.ศ. 2554

ปัญหาการใช้ inserted,deleted ในการสร้าง Trigger (SQL Server 2000)

ปัญหานี้จะเกิดกับ Query ที่อยู่ใน Trigger ที่ไม่รู้จักกับ inserted หรือ deleted
Key Word 2 ตัวนี้มีความหมายคือ
  • INSERTED ก็คือข้อมูลปัจจุบันที่เพิ่งนำเข้ามาใน Table
  • DELETED ก็คือข้อมูลที่เพิ่งจะลบออกไป หรือเมื่อมีความต้องการที่จะลบ
ตัวอย่าง Query เจ้าปัญหา
DELETE FROM TABLE WHERE (TABLE_ID = deleted.ID

เมื่อต้องการจะ Execute จะเกิดปัญหาคือ การมองว่า inserted หรือ deleted เป็น Table หนึ่ง ที่ไม่มีอยู่จริง
"The column prefix 'deleted' does not match with a table name or alias name used in the query." 

การแก้ไขคือประกาศตัวแปรมารับค่าของข้อมูลที่ต้องการใช้งานจาก inserted หรือ deleted ก่อน เช่น

//ประกาศตัวแปรมารับค่าจาก Field
DECLARE @number char(4) , @open_id char(11)
//เอาตัวแปรไปรับค่าเก็บไว้ เพื่อใช้งานใน Query หลังจากนี้
SELECT @number=NUMBER,@open_id=OPEN_ID FROM deleted 

Code ด้านล่างนี้เป็นตัวอย่างการสร้าง trigger ให้ VIEW สามารถลบข้อมูลได้

CREATE TRIGGER delFormNum
ON dbo.VIEW_TKRNUMBERSTK
INSTEAD OF DELETE
AS
BEGIN
      DECLARE @number char(4) , @open_id char(11)

      SELECT @number=NUMBER,@open_id=OPEN_ID FROM deleted

      DELETE FROM TKR_OPENRECEIPTDTL
      WHERE (NUMBER = 
@number) AND (RECEIPT_CODE IS NULL);

      DELETE FROM TKR_OPENRECEIPT
      WHERE (OPEN_ID = @open_Id);

      COMMIT

END
GO 

วันจันทร์ที่ 26 กันยายน พ.ศ. 2554

GPU (Graphics Processing unit) ตัวประมวลผลของการ์ดจอ

Display Adapter ที่เรียกกันติดปากว่าการ์ดจอ หรือการ์แสดงผล
Graphics Processing unit (GPU) สามารถเรียกอีกชื่อหนึ่งได้คือ visual processing unit (VPU) ซึ่ง GPU มีได้ทั้งที่เป็น การ์ด หรือเป็นส่วนหนึ่งของแผงเมนบอร์ดก็ได้แต่ในปัจจุบันการ์ดแสดงผลส่วนใหญ่อยู่ในรูปของการ์ด หน้าที่หลักของ GPU ก็คือช่วยในการประมวลการทำงานในด้านภาพกราฟฟิกบนหน้าจอคอมพิวเตอร์ให้มีประสิทธิภาพมากยิ่งขึ้นหลักการทำงานก็คล้ายกับ CPU แต่จะแตกต่างกันตรงที่ การ์ดแสดงผลสมัยเก่า ทำหน้าที่แปลงข้อมูลดิจิตอลเป็นสัญญาณเท่านั้น แต่จากกระแสความนิยมของการ์ดเร่งความเร็วสามมิติ ในช่วงครึ่งหลังของทศวรรษที่ 90 โดยบริษัท 3dfx และ nVidia ทำให้เทคโนโลยีด้านสามมิติพัฒนาไปมาก ปัจจุบันการ์ดแสดงผลสมัยใหม่ได้รวมความสามารถในการแสดงผลภาพสามมิติมาไว้เป็นมาตรฐาน และได้เรียกชื่อใหม่ว่า GRAPHICS PROCESSING UNIT โดยสามารถลดงานด้านการแสดงผลของของหน่วยประมวลผลกลาง (CPU) ได้มาก
GPU ATI

อย่างไรก็ตามวงจรแสดงผลเหล่านี้มักมีความสามารถด้านสามมิติค่อนข้างจำกัด แต่ก็เหมาะสมกับงานในสำนักงาน, workstation(สถานีงานเป็นคำที่ใช้อธิบายสมรรถนะอันยิ่งใหญ่ของไมโครคอมพิวเตอร์ ที่สามารถทำงานพร้อมกันได้หลายงาน (multitasking) ส่วนมากจะใช้ในเรื่องของการออกแบบ (CAD) นั่นก็หมายถึงว่า สถานีงานนี้จะต้องมีหน่วยความจำขนาดใหญ่ มีหน่วยเก็บข้อมูลขนาดพิเศษ มีตัวปรับภาพชั้นยอด มีจอภาพชั้นหนึ่ง และที่สำคัญคือมีตัวประมวลผลที่ทำงานได้เร็วมาก ๆ เช่น RISC ส่วนใหญ่ สถานีงานจะใช้ระบบปฏิบัติการยูนิกซ์ (UNIX) และ โอเอส/ทู (OS/2) มีบางแห่งที่ใช้เครื่องแมคอินทอชชนิดที่มีประสิทธิภาพในการทำงานสูง ๆ อย่างไรก็ตาม ในอีกความหมายหนึ่ง สถานีงานอาจหมายถึงเพียงไมโครคอมพิวเตอร์แต่ละตัวในระบบเครือข่าย), GAME CONSOLE เป็นต้น
GPU NVIDIA


สำหรับผู้ที่ต้องการความสามารถด้านภาพสามมิติประสิทธิภาพสูง เช่น ใช้เพื่อเล่นเกมคอมพิวเตอร์ ฮาร์ดแวร์ยังอยู่ในรูปของการ์ดที่ต้องเสียบเพิ่มเพื่อให้ได้ภาพเคลื่อนไหวที่เป็นสามมิติที่สมจริง ในทางกลับกัน การใช้งานบางประเภท เช่น งานทางการแพทย์ กลับต้องการความสามารถการแสดงภาพสองมิติที่สูงแทนที่จะเป็นแบบสามมิติ เดิมการ์ดแสดงผลแบบสามมิติอยู่แยกกันคนละการ์ดกับการ์ดแบบสองมิติและต้องมีการต่อสายเชื่อมถึงกัน เช่น การ์ด Voodoo ของบริษัท 3dfx ซึ่งปัจจุบันไม่มีแล้ว

ตำแหน่งของ GPU On board




ที่มา : http://forum.dekitclub.com/index.php/topic,1623.0.html 

วันศุกร์ที่ 16 กันยายน พ.ศ. 2554

ทำให้ Windows 32 bit เห็น Ram มากกว่า 4 GB

ปัญหาของวินโดว์ส 32 บิตที่มองเห็นหน่วยความจำ 4GB (หรือมากกว่า) ไม่เต็มความจุ
กำลังจะหมดไปด้วยเทคนิค PAE และวิธีย้ายตำแหน่งอ้างอิง

เหตุใด? ระบบปฏิบัติการ 32 บิต ถึงมองเห็นหน่วยความจำได้ไม่เต็มความจุ
หน่วยความจำ ประกอบด้วยหน่วยเก็บข้อมูลย่อยๆ แต่ละหน่วยเก็บข้อมูลจะถูกอ้างถึงได้โดยแอดเดรส ซึ่งเป็นเลขฐาน 2 แอดเดรสนี้จะร้องขอโดยซีพียูไปยังหน่วยความจำหลัก เพื่ออ่านค่าหน่วยความจำที่แอดเดรสนั้น


ตัวอย่างเช่น หากซีพียูทำงานในระบบ 3 บิต ก็จะอ้างถึงหน่วยความจำได้ 23 = 8 ช่อง หรือ 8 bytes เมื่อติดตั้งหน่วยความจำเกินกว่าซีพียูจะอ้างถึง เช่น 64 byte ลงไป ซีพียูที่ทำงานในระบบ 3 บิต ก็จะมองเห็นได้เท่าที่ตัวเองจะอ้างอิงนั่นคือ 8 byte เท่านั้น อีก 56 byte จึงกลายเป็นพื้นที่ลึกลับและเปล่าประโยชน์ที่ซีพียูไม่สามารถอ้างถึงได้นั่น เอง

ในระบบ 32 บิต การอ้างอิงหน่วยความจำหลักจะทำได้ 232 หรือเท่ากับ 4,294,967,296 byte หรือประมาณ 4GB ไม่เกินจากนี้ แต่น่าเสียดายที่อุปกรณ์ต่างๆ ที่ติดตั้งอยู่ในระบบ ตั้งแต่ ตัวคอนโทรลเลอร์ USB การ์ดแสดงผลหรือการ์ดทีวีจูนเนอร์ต่างก็ต้องอ้างถึงพื้นที่หน่วยความจำใน ระบบด้วยเช่นกัน ทำให้ระบบปฏิบัติการต้องกันพื้นที่ของหน่วยความจำประมาณ 300 – 1024MB สำหรับอุปกรณ์นั้นๆ ไว้ ไม่ว่าจะถูกใช้หรือไม่ก็ตาม

ล้วงลึกหน่วยความจำระบบด้วย Physical Address Extension (PAE)
เมื่อไม่นานมานี้ มีผู้คิดค้นเทคโนโลยี Physical Address Extension (PAE) ที่ช่วยดึงหน่วยความจำหลักของระบบในส่วนที่ถูกกักเก็บไว้กลับมาใช้ได้อีกครั้ง ใครที่ใช้ซีพียูอินเทลตระกูลเพนเทียมหรือเก่ากว่าซึ่งอ้างถึงพื้นที่หน่วยความจำได้ 32 Line จะไม่สามารถใช้ประโยชน์จากเทคโนโลยี PAE ได้ แต่ถ้าคุณใช้ซีพียูตั้งแต่เพนเทียมโปรเรื่อยมาจนถึง Core 2 ที่อ้างถึงหน่วยความจำได้มากกว่า 36 line จะรองรับความจุของหน่วยความจำได้สูงสุดถึง 64GB เลยทีเดียว เทคโนโลยี PAE นี้จะสามารถเปิดใช้งานได้ตั้งแต่วินโดว์สเอ็กซ์พี SP2 ขึ้นไป ส่วนจะทำงานได้สมบูรณ์มากน้อยแค่ไหนก็ขึ้นอยู่กับฮาร์ดแวร์ในเครื่องเป็นสำคัญด้วย

เปิดประตู PAE : Windows XP
ในวินโดว์สเอ็กซ์พีคุณสามารถเปิดใช้งาน PAE ได้ด้วยการแก้ไขไฟล์ “Boot.ini” การเข้าไปยังไฟล์นี้ ทำได้โดย


1. กดคีย์ลัด [Windows] + [E] เพื่อเข้ามาที่หน้า My Computer ดับเบิลคลิกเข้าไปที่ไดร์ฟหลักที่ติดตั้งระบบปฏิบัติการไว้

2. คลิกที่เมนู Tools > Folder Options แล้วเอาเครื่องหมายถูกที่หัวข้อ Hide protected operating system files (Recommended) ออก ติ๊กถูกที่หัวข้อ Show hidden files and folders กด OK ก็จะเห็นไฟล์ Boot.ini โชว์ขึ้นมา

3. คลิกขวาเลือก Properties แล้วเอาเครื่องหมายหน้า Read-only ออก เท่านี้คุณก็แก้ไขไฟล์ Boot.ini ได้แล้ว


4. ให้คุณเพิ่มคำสั่ง /PAE ต่อท้ายบรรทัดที่ระบุตำแหน่งระบบปฏิบัติการ จากนั้นกด Save และรีสตาร์ทเครื่อง ถ้าฮาร์ดแวร์รองรับคำสั่ง PAE เมื่อเข้ามาที่ Control panel > System คุณก็จะเห็นรายละเอียดหน่วยความจำที่มากขึ้นพร้อมๆ กับคำว่า Physical address enhancement


เปิดประตู PAE : Windows Vista / 7 32bit

1. ให้คุณกดปุ่ม [Windows] แล้วพิมพ์ cmd ลงในช่อง Search Field

2. จากนั้นคลิกขวาที่ไฟล์ cmd.exe เลือก Run as administrator พิมพ์คำสั่ง “BCDedit/set PAE forceenble” กด Enter แล้วรีสตาร์ทเครื่อง ประสิทธิภาพของคอมพิวเตอร์จะสูงขึ้น ถ้าอุปกรณ์รองรับคำสั่งดังกล่าว


 

หมายเหตุ : หากระบบไม่สามารถทำงานได้ ให้เข้าไปที่ Safe mode และลบคำสั่ง /PAE ในไฟล์ Boot.ini (วินโดว์สเอ็กซ์พี) หรือพิมพ์ “BCDedit/set PAE forcedisable” (วินโดว์สวิสต้า/วินโดว์สเซเว่น)

หน่วยความจำที่ระบบมองเห็น เพิ่มขึ้นนั้น จะไม่ได้ถูกนำมาใช้กับระบบโดยตรง แต่จะถูกแปลงให้เป็น RAM-Disk เพื่อใช้ความเร็วของมันให้เป็นประโยชน์ต่อได้ CHIP ขอแนะนำ Gavotte ramdisk สุดยอดโปรแกรมสร้าง RAM-Disk ที่ทำงานได้ดี ใช้งานง่าย และมีให้ดาวน์โหลดจากเว็บไซต์ของเราด้วยเช่นกัน

แทนที่ฮาร์ดดิสก์อืดๆ ด้วย RAM-Disk




การติดตั้ง RAM-Disk ทำได้ง่ายและใช้เวลาไม่นานขั้นตอนแรก ต้องแก้ไขการตั้งค่าของ Registry เก่าก่อน โดยดับเบิลคลิกที่ไฟล์ “ram4g.reg” ในโฟลเดอร์ gavotte เพื่อเปิดระบบ จากนั้นคลิกขวาที่โปรแกรม ramdisk เลือก Run as administrator แล้วกดยืนยันการติดตั้งไดรเวอร์ รอสักครู่เพื่อให้ RAM-Disk เข้าสู่ระบบ ขั้นตอนสุดท้ายคือการเลือกขนาดพื้นที่ RAM-Disk ที่ต้องการแล้วกด OK

คุณสามารถจัดการกับ RAM-Disk และใช้ประโยชน์จากพื้นที่ 500 หรือ 600MB ที่เพิ่มขึ้นมาได้ทันที หลังจากสร้างไดร์ฟแล้ว ระบบจะสร้าง โฟลเดอร์เก็บ Temp File ด้วย ซึ่งจะถูกลบทุกๆ ครั้งที่ชัตดาวน์หรือรีสตาร์ทเครื่อง อย่างไรก็ตาม พื้นที่จะไม่ได้เพิ่มขึ้นอย่างมีนัยสำคัญ ถ้าคุณตระหนักดีว่า PAE และ Gavotte ทำงานได้อย่างถูกต้องในระบบ

คุณสามารถขยายขนาดของ RAM-Disk ได้ด้วยการใส่หน่วยความจำเพิ่มลงไป และปรับเปลี่ยนการตั้งค่าพื้นฐานของเครื่องมือ Gavotte เสียใหม่ RAM-Disk ก็จะขยายขนาดเป็น 4GB ได้เองอัตโนมัติ RAM-Disk ที่ได้สามารถนำไปใช้ประโยชน์ได้หลายแบบ โดยเฉพาะอย่างยิ่ง การเซ็ตให้พื้นที่ของ RAM-Disk ทำงานเป็น Swap File ซึ่งจะช่วยให้ระบบและแอพพลิเคชันทำงานได้เร็วขึ้น

คุณสามารถตั้งค่านี้ในวินโดว์สวิสต้าได้โดยไปที่ Control Panel > System Maintenance> System เลือกหัวข้อ advanced system settings > Performance > Settings ค่ากำหนดของ Swap File จะอยู่ในแท็บ Extended

สำหรับวินโดว์สเอ็กซ์พี การตั้งค่า Swap File ต้องเข้าไปตั้งค่าที่ Control Panel > System > Advanced > คลิก Setting ในหัวข้อ Performance > Advanced > คลิก Change ในหัวข้อ Virtual Memory จากนั้นให้ยกเลิกการตั้งค่า Swap File อันเดิมซึ่งจะเป็นไดร์ฟ C: ออกก่อน แล้วค่อยมาเปิดใช้งานที่ไดร์ฟ R: หรือไดร์ฟที่สร้างไว้



ที่มา : http://www.gggcomputer.com/index.php?topic=9651.0;wap2

วันอาทิตย์ที่ 11 กันยายน พ.ศ. 2554

เครื่องของคุณห่วย หรือเทพ ตัดสินโดย Windows 7

บางท่านอาจจะยังไม่เคยเข้าไปดูการวัด Rate ของ Windows 7
ตัววัด Rate นี้จะวัด Hardware เช่น Processor , Ram , HDD  และ Graphic เป็นสำคัญ ซึ่งจะจัด Rate ไว้ตั้งแต่
1.0 ถึง 7.9 แน่นอนว่า 1.0 คงจะเป็นเครื่องที่พอใช้ได้เท่านั้น  Rate ยิ่งสูงก็ยิ่งแสดงว่าเครื่องเจ๋งขนาดไหน
Rate นี้จะทำการวัดเมื่อท่านติดตั้ง Windows 7 และใช้งานไปสักระยะหนึ่ง ระบบก็จะเริ่มเก็บข้อมูลการทำงานและจัด Rate

การเข้าไปดู Rate นั้นก็ไม่ยาก

คลิ๊กเมาส์ปุ่มขวาที่ My Computer แล้วเลือก Properties
พบหน้าต่างรายละเอียดเกี่ยวกับระบบ ดูที่หัวข้อ Rating กดที่ Windows Experience Index
จะเปิดหน้าต่างรายละเอียดในการวัด Rating (Rate and improve your computer's performance)
ในภาพด้านบนเครื่องของผู้เขียนวัดได้คะแนนเฉลี่ย 5.4
จากรายละเอียดของการวัด Rating ของ Microsoft เครื่องที่มีค่าเฉลี่ย 2.0 ขึ้นไปถือว่าเพียงพอ เป็นเครื่องที่เหมาะกับการใช้งานทั่วไป เช่นพิมพ์งาน หรืออินเตอร์เน็ต หากมีค่าเฉลี่ย 3.0 ขึ้นไป ถือว่าเครื่องนั้นอยู่ในระดับค่อนข้างดี ใช้ทำงานเกี่ยวกับ Graphic หรือเล่นเกมได้

วันจันทร์ที่ 22 สิงหาคม พ.ศ. 2554

Object กับ Instance ต่างกันอย่างไร

ในการเขียนโปรแกรมแบบ OOP นั้น แน่นอนว่าจะต้องเจอคำว่า Object กันจนแทบจะเบื่อไปเลย บางทีอาจจะติดปากเรียกโน่น นี่ นั่นว่า Object ในชีวิตประจำวัน

Object นั้นก็คือวัตถุชิ้นหนึ่งๆ ที่เราจับต้องได้ในชีวิตประจำวัน แต่ถ้าในทาง Programming แล้ว มันก็คือวัตถุเสมือน ที่สร้างขึ้นมาจาก Class ซึ่งมีคุณสมบัติและความสามารถ จะมากหรือจะน้อยก็ขึ้นอยู่กับ Class ที่สร้างมันขึ้นมา
การเรียกใช้ Object โดยตรงอย่างใน C# หรือ Java ก็เป็นอีกสิ่งหนึ่งที่เห็นได้อย่างชัดเจน

คำสั่ง new เป็นการสร้าง Object ขึ้นมาใช้งานในหน่วยความจำ
ส่วน Instance นั้นเปรียบเสมือนตัวแทนของ Object แต่เราก็สามารถนำ Instance ไปใช้เพื่อเป็นตัวแทนอ้างอิงถึง Class ได้เช่นเดียวกัน ฉนั้นเมื่อประกาศ Instance ก็คือ Type หนึ่งนั่นเอง

frm1 ก็คือ Instance ที่สร้างขึ้นมาใช้แทน Object 
ใน Delphi ตัวแปรที่ทำหน้าที่เป็น Instance ของฟอร์ม ถูกประกาศขึ้นอัตโนมัติเมื่อสร้างฟอร์ม
เพื่อใช้แทน Class และทรัพยากรภายใน Class โดยที่ไม่ต้องสร้างเป็น Object
สรุปคือ
Object ก็คือต้นแบบ ส่วน Instance นั้นก็เป็นเหมือนตัวแทนที่นำมาเรียกใช้ เช่น
ถ้า Object เป็น Windows 5.1 Instance ก็คือ Windows XP
ถ้า Object เป็น Windows 6.0 Instance ก็คือ Windows Vista
ถ้า Object เป็น Windows 6.1 Instance ก็คือ Windows 7

วันจันทร์ที่ 8 สิงหาคม พ.ศ. 2554

สร้าง QR Code ด้วย ASP.NET

ส่วนที่จำเป็นคือไฟล์ .dll ที่เป็นตัว Generate QR Code อยู่ในโปรแกรม Messaging Toolkit barcode
ดาวน์โหลดได้ที่  http://twit88.com/platform/attachments/download/158/setup-qrcode.exe 
เมื่อดาวน์โหลดมา ติดตั้งให้เรียบร้อยแล้วเข้าไปตรวจสอบที่ Path 
C:\Program Files\MessagingToolkit\MessagingToolkit-QRCode\QRCode\
หาไฟล์ MessagingToolkit.QRCode.dll และให้คัดลอกไปไว้ที่ Directory bin ของ Project
จากนั้น Add Referencไฟล์ MessagingToolkit.QRCode.dll ที่อยู่ใน  Directory bin  เข้ามาใน Project

Add Reference
ตอนนี้เรามีไฟล์ .dll ที่จะทำการ Generate QR Code ได้แล้ว ขั้นตอนต่อไปคือการใช้ Generic Handler สร้างรูปภาพ QR Code ขึ้นมา

เพิ่มไฟล์ Generic Handler .ashx เข้ามาใน Project ในที่นี้ผู้เขียนตั้งชื่อเป็น QRcode.ashx
ในไฟล์ QRcode.ashx มีคำสั่งการทำงานดังนี้


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


namespace aspNetQRCODE
{
    public class QRcode : IHttpHandler
    {


        public void ProcessRequest(HttpContext context)
        {
            string myText= context.Request.QueryString.Get("code");
            context.Response.ContentType = "image/gif";
            if (myText.Length > 0)
            {
                MessagingToolkit.QRCode.Codec.QRCodeEncoder qe = new MessagingToolkit.QRCode.Codec.QRCodeEncoder();
                System.Drawing.Bitmap bm = qe.Encode(myText);
                bm.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
            }   
        }


        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

ในหน้าเพจที่ต้องการให้แสดงเป็นรูปภาพ ให้ใส่ Tag img เรียกไปที่ไฟล์ QRcode.ashx พร้อมส่งข้อความที่ต้องการจะสร้าง QR Code

<img src="QRcode.ashx?code=i love you" alt="the code" />

ลองทดสอบเปิดหน้าเพจขึ้นมา

Tag img จะทำการเรียกใช้งานผ่าน QRcode.ashx ที่เป็น Generic handler คืนค่ากลับมาเป็นภาพ .gif
ทดสอบอ่าน QR Code ด้วยการบันทึกไฟล์รูปภาพ QR Code จากหน้าเพจ
และเปิดโปรแกรม Messaging Toolkit ที่เราได้ติดตั้งไปในตอนแรก
(โดยปกติจะอยู่ที่ C:\Program Files\MessagingToolkit\MessagingToolkit-QRCode\MessagingToolkit.Barcode.Demo.exe)

เมื่อเปิดไฟล์ภาพและกด Decode จะได้ผลเป็นข้อความตามที่เราได้สร้างขึ้น





ที่มา : http://www.jphellemons.nl/post/Generate-QR-Codes-with-AspNet-C.aspx

ดาวน์โหลด
เครื่องมือสำหรับใช้งาน QR Code http://www.4shared.com/file/wNgx_Pnv/setup-qrcode.html
ตัวอย่างในเนื้อหา http://www.4shared.com/file/vkhFdPpg/aspNetQRCODE.html

QR Code คืออะไร

ผมว่าทุกท่านคงรู้จักกับ Bar Code กันแล้ว เพราะทุกสินค้า และห้างร้านบ้านเรา ก็มักจะใช้ตัว Bar Code เพื่อกำกับสินค้า ว่าสินค้าตัวนั้น มีชื่อว่าอะไร ราคาเท่าไหร่ เป็นต้น เพื่อให้คอมพิวเตอร์ได้อ่าน และประมวลได้อย่างรวดเร็ว แต่คุณ Bar Code ครับ คุณยังดีไม่พอสำหรับเกมอัจฉริยะข้ามคืน !! เอ่อ ไม่ใช่สิ คือมีมนุษย์เรา พยายามคิดสิ่งที่จะสามารถอ่านค่า ได้เร็วกว่า Bar Code ขึ้นมาอีก สิ่งนั้นคือ QR Code ครับ
ลักษณะของ QR Code
โดย QR Code ก็คือรหัสชนิดหนึ่ง หรือที่เรียกกันว่า two-dimensional bar code หรือใครจะเรียกว่า 2D bar code ก็แล้วแต่ โดยหลายชื่อนี้ ก็คือ QR Code เหมือนกันครับ ซึ่ง QR Code นี้ถูกคิดค้นขึ้นในปี 1994 โดยบริษัทสัญชาติญี่ปุ่น ที่ชื่อ Denso-Wave และได้จดทะเบียนลิขสิทธิ์ชื่อ QR Code ไปแล้วทั้งในญี่ปุ่น และทั่วโลก ทำให้เรามักจะเรียกว่า 2D Bar Code กันแทนเพื่อเลี่ยงปัญหาลิขสิทธิ์ แต่อย่างไรก็ตาม คำว่า QR Code นั้น ได้ถูกนิยามความหมายว่าเป็น Quick Response หรือการตอบสนองที่รวดเร็ว ซึ่งมาจากความตั้งใจของผู้คิดค้น ที่จะให้ QR Code นี้สามารถถูกอ่านได้อย่างรวดเร็วนั่นเอง ซึ่งตัวสัญลักษณ์ QR Code นี้ได้รับความนิยม จนกลายเป็นของธรรมดาในญี่ปุ่นไปแล้ว

ทุกวันนี้ QR Code นอกจากจะเอาไว้ใช้ในวงการค้าขายสินค้า หรือขนส่งแล้ว ยังเป็นที่นิยมนำเอามาใช้ในการตลาดด้วย เราจะเป็น QR Code ไปโผล่อยู่ตามโฆษณา ในแมกกาซีน หรือป้ายโฆษณา Bill Board เป็นต้น ซึ่งเราสามารถให้ QR Code นี้ เก็บข้อมูล url ของเราได้ และด้วยเทคโนโลยีที่ทันสมัย เราสามารถติดตั้งซอฟต์แวร์สำหรับอ่าน QR Code หรือ 2D Bar Code นี้ไว้ในโทรศัพท์มือถือได้ง่าย ๆ แล้ว เมื่อพบ QR Code ในแมกกาซีน หรือป้ายโฆษณา Bill Board ก็สามารถเอามือถือไป scan เพื่อรับข้อมูลนั้นมาได้ โดยสะดวกง่ายดายครับ สำหรับ QR Code ตัวอย่างที่เห็นอยู่นี้ มีความหมายว่าเป็น http://keng.com หรือเป็น url ของเว็บไซต์ของผมนั่นเองครับ ซึ่งตัว QR Code นี้สามารถเก็บข้อมูลได้หลายรูปแบบ ตั้งแต่ wap url , web url หรือไฟล์ข้อมูลต่าง ๆ เป็นต้น





ที่มา : http://keng.com/2008/09/06/what-is-qr-code/

วันจันทร์ที่ 1 สิงหาคม พ.ศ. 2554

C# ทำยังไง อยากใช้ Constructor ของแม่

เมื่อเขียนโปรแกรมเชิงวัตถุ (OOP) แน่นอนว่าจะต้องเจอการทำ Inheritance หรือการสืบทอด และบางทีก็สืบทอดกันจนเป็นนิสัย โดยเฉพาะ Project ใหญ่ๆ ที่มักจะมีการสร้าง Pattern ให้ทีมงานใช้ บางครั้งก็จะเป็น Form Pattern ทั้งหมดเลย คราวนี้ก็อยู่ที่ตัวผู้ Inherit ไปที่ต้องไปต่อยอด ไป Implement ให้ตรงตามเป้าหมายของงาน
การ Inherit หรือการสืบทอดไป ความสามารถ รูปลักษณ์เกือบทั้งหมดก็จะได้มรดกไปจากแม่ (base class) ทั้งสิ้น แต่มีบางสิ่งที่สำคัญที่ไม่ได้เป็นของแม่ นั่นก็คือ "หัวใจ" 
หัวใจของคลาสที่จะขาดเสียไม่ได้นั่นก็คือ Constructor ทุกคลาสจะต้องมี Constructor ขึ้นอยู่ว่าจะใช้ Constructor ที่ Compiler สร้างให้ หรือจะสร้างเอง
จะทำ Override ก็ไม่ได้ การใช้ Constructor ของคลาสแม่นั้นไม่ยาก แต่จะไม่ได้ใช้โดยตรง คลาสลูกยังมี Constructor ของตัวเองอยู่ แต่ให้ Reference ไปที่คลาสแม่ของตัวเองก่อนที่จะทำงาน

ในตัวอย่าง ผู้เขียนจะสร้างฟอร์ม 2 ฟอร์ม
  1. Form1 เป็นฟอร์มหลัก
  2. frmChild เป็นฟอร์มต้นแบบ ใช้เป็น Pattern เท่านั้น
ไฟล์ใน project
หน้าตาของ frmChild
หน้าตาของ Form1
ผู้เขียนจะทำการ Overload Constructor ใน frmChild เพื่อที่จะให้ใส่ Parameter เข้ามา Set title bar ได้ในตอนสร้าง

*ในการ Overload Constructor  ของฟอร์มนั้นจะแตกต่างกันใน .Net 3.5 และ .Net 4.0
เพราะว่า .Net 4.0 นั้นสามารถตัด Constructor ที่เป็น Default ออกได้เลย
ต่างจาก .Net 3.5 ที่ต้องยังคงตัวเดิมไว้ มิฉนั้นจะ error
จากนั้น Add Form เข้ามาใน Project โดยเลือก Inherited Form
จะพบหน้าต่างให้เลือกว่าจะ Inherit จากฟอร์มไหน ในที่นี้ผู้เขียนเลือก Inherit จาก frmChild
ทำการแก้ไข Constructor ของฟอร์มที่ Inherit มา(ในที่นี้คือ Form2)
แก้ไขให้ Constructor ของ Form2 สามารถรับ parameter ได้ คือ title
และเมื่อรับค่าจาก parameter มาแล้ว ก็ให้ส่งค่า parameter ไปทำงานกับ Constructor ของคลาสแม่
ในปุ่ม Show ของ Form1 เป็นคำสั่งให้สร้าง และแสดงฟอร์ม

   new Form2("สืบทอด 1").Show();
   new Form2("สืบทอด 2").Show();

เมื่อรันทดสอบ หลังจากกดปุ่ม Show จะมีการสร้าง Form2 มา 2 ฟอร์ม โดยมีการเปลี่ยนข้อความบนTitle bar
ตามคำสั่งของ Constructor ที่ Overload อยู่ใน frmChild

C# Generic Method เพิ่มความยืดหยุ่น แทนการทำ Overload

การเขียน Code แบบใหม่ๆที่นำเสนอในการเขียน C# หรือ Java นั้น จะเน้นไปที่ความยืดหยุ่นเพื่อให้รองรับงานใหญ่ๆระดับ Enterprise ซึ่งอาจจะมีการพัฒนาที่ยาวนาน และมีการเขียน Base class ไว้เพื่อใช้งานมากมาย มี method ในการทำงานจำนวนมาก ในระดับ method ยังไม่นับรวมพวกที่ทำการ Overload เพื่อให้รองรับการพัฒนาในแบบต่อยอด ซึ่งจะทำให้มีจำนวน method มหาศาล

การสร้าง Generic Method เป็นอีกทางเลื่อกนึงที่ถูกนำเสนอออกมา เพราะเป็นการทำให้ method ยืดหยุ่นมากกว่าที่เคยเป็นมา และไม่ต้องทำการ Overload เพิ่มมากมาย ในเวลาที่ต้องการเปลี่ยนชนิดของค่า เหมือนในภาษาสมัยก่อน จึงมีความยืดหยุ่นและลดความซ้ำซ้อนได้มาก

Generic method สร้างขึ้นไม่ยาก ผู้เขียนจะสร้าง method ง่ายๆเพื่อดูการทำงาน
ผู้เขียนสร้าง Generic method ง่ายๆเพื่อให้แสดงค่าเป็นข้อความออกมา แต่ให้สังเกตุที่ค่า Parameter ที่ส่งเข้ามาใน method

        //สร้าง Generic method ที่มีการ return ค่าเป็น string
        //การระบุ Type ของ Parameter จะขึ้นอยู่กับการกำหนดค่า T และ X
        private string showMess<T,X>(T age,X display)
        {
            string res = null;

            //เก็บค่า Type ของ X
            Type X_is = typeof(X);
            //ตรวจสอบ Type ของ X ว่าเป็น string หรือไม่
            if (X_is == typeof(string))
                //ถ้าเป็น string ให้คืนค่าเป็นข้อความ
                res= Convert.ToString(display+age.ToString());
            else 
                //หากเเป็น Type อื่นๆ ให้แปลงเป็น int แล้วนำมาบวกกัน
                res= Convert.ToString(Convert.ToInt32(display)+Convert.ToInt32(age));

            return res;
        }

การทดสอบนั้น ผู้เขียนได้ใช้ Generic method "showMess" ให้แสดง MessageBox ขึ้นมาเพื่อดูผลของค่าที่ return ออกมา

        public Form1()
        {
            InitializeComponent();
            MessageBox.Show(showMess<int, string>(22,"ข้าพเจ้ามีอายุ : "));
            MessageBox.Show(showMess<double, string>(.357, "คุณพ่อมีปืนขนาด : "));
            MessageBox.Show(showMess<int, int>(2011, 543));
            MessageBox.Show(showMess<int, double>(2011, 1.00));
        }

ผลการทำงาน

  

วันอังคารที่ 26 กรกฎาคม พ.ศ. 2554

C# Generic กำหนดเงื่อนไขให้รับ Type ที่ Implement มาจาก Interface

Generic Type นอกจาก Type ทั่วๆไปอย่าง string , int , double และอื่นๆที่เป็นของ C# แล้ว เรายังสามารถกำหนด Type ให้เป็น Class ที่ Implement มาจาก Interface ที่ระบุใน Generic ด้วย

ภาพรวมของคำสั่งทั้งหมด จะประกอบด้วยคลาส Generic และ Interface และ Class ที่ Implement มาจาก Interface

ภายใน Interface IPerson เป็นเพียงการประกาศ method printTpListBox เพื่อให้ Class อื่นๆนำไป Implement ต่อ


    interface IPerson
    {
        void printToListBox(ListBox listbox);
    }


Class ที่นำ IPerson ไป Implement ต่อคือ Class Person ที่การทำงานคือการเก็บค่าของบุคคล โดยมี Property Fname (string) , Lname (string) , Age (int) และ Position (string) และได้ Implement method printToListBox จาก IPerson


    public class Person : IPerson
    {
        string fname;


        public string Fname
        {
            get { return fname; }
            set { fname = value; }
        }
        string lName;


        public string LName
        {
            get { return lName; }
            set { lName = value; }
        }
        int age;


        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        string position;


        public string Position
        {
            get { return position; }
            set { position = value; }
        }


        //Constructor ที่ผ่านค่า Parameter มาให้ Property
        public Person(string firstName, string lastName, int age, string position)
        {
            this.fname = firstName;
            this.lName = lastName;
            this.age = age;
            this.position = position;
        }


        //แสดงข้อมูลบุคคลใน ListBox
        public void printToListBox(ListBox listbox)
        {
            listbox.Items.Add(this.fname + "  " + this.lName + " อายุ " + this.age + " ตำแหน่ง " + this.position);
        }
    }


ต่อมาคือ Class Generic ที่กำหนดเงื่อนไขให้รับ Type เป็น Instance ใดๆที่มาจาก Class ที่ Implement มาจาก IPerson โดยที่กำหนด Key word "where" ต่อท้าย Class


    class personCollection<T> where T : IPerson
    {
        //สร้าง Collection Queue ที่ทำงานแบบ FIFO
        Queue<T> personCol = new Queue<T>();


        //method เพิ่มข้อมูล
        public void Add(T item)
        {
            personCol.Enqueue(item);
        }

        //แสดงข้อมูลผ่าน ListBox
        public void print(ListBox listbox)
        {
            while (personCol.Count > 0)
            {
                T ps = personCol.Dequeue();
                ps.printToListBox(listbox);
            }
        }
    }


การเรียกใช้งานก็เหมือนกับการใช้ Generic Type แต่เปลี่ยนจากการกำหนดชนิดข้อมูลเดิมเป็น Class ที่ Implement มาจาก Interface


    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();


            //สร้าง Instance จาก Class Person
            Person p1 = new Person("Keattipoom", "Yamyim", 23, "Sale Manager");
            Person p2 = new Person("Keatkamon", "Kunsopit", 29, "Senior Programmer");


            //สร้าง Generic plist ขึ้นใช้งาน โดยกำหนด Type เป็น Person
            personCollection<Person> plist = new personCollection<Person>();
            //เพิ่ม Instance ของ Class Person ที่มีข้อมูลอยู่แล้ว
            plist.Add(p1);
            plist.Add(p2);
            //ให้ Generic plist แสดงค่าที่ได้รับออกมาทาง ListBox
            plist.print(this.listBox1);
        }
    }


เมื่อรันโปรแกรม ข้อมูลจะถูกแสดงใน ListBox