BoN 的个人资料(~^_^)~ SusiE888 \(๏^,^๏...照片日志列表 工具 帮助

(~^_^)~ SusiE888 \(๏^,^๏\)

http://susielol.hi5.com
第 1 张,共 35 张

视频

 
Video: Jazzie 1-10
正在加载...

Buckingham BoN

职业
地点
兴趣
http://susielol.hi5.com
8月15日

Common Statements

.First(), .Last() เลือก element ขึ้นมาอันนึง อันแรก หรือ อันสุดท้าย
 
.Single() เลือก element ขึ้นมาอันเดียว ตาม condition
 
.Count() นับ element ทั้งหมด หรือตาม condition IEquityComparer
 
.Select() ** อันนี้ ไม่เหืมอน sleect ใน SQL มันไม่ได้ select element แต่มันจะเลือกลูกของ element เช่น ถ้าเป็น Enumerable DataRow ลูกที่เลือกมา จะได้เป็น Field ที่กำหนด
เช่น table.AsEnumerable().Select( record => record.Field<int>("ID")) ผลลัพ จะได้ IEnumerable<int>
 
.GroupBy() จะเริ่มงงละ ก็คือ เป็นการ group element เข้าด้วยกัน ไม่เหมือน Group By ใน SQL ที่เอาไว้รวม record ที่ซ้ำกัน .GroupBy() มีไว้เพื่อ รวมกลุ่มของ record เข้าด้วยกัน เช่น ผลลัพ ได้มา 100Rows เราก็ GroupBy() ด้วย Col DateTime เพื่อแยกกลุ่ม record ตาม เดือน จะได้คร่าวๆว่า
table.AsEnumerable().GroupBy( record => record.Field<int>("Month") ); 
.GroupBy() ผลลัพที่ได้ จะเป็น IGroupping<DataTypeของKey, DataTypeของผลลัพ>()
ข้างบน จะได้ DataType ว่า
IGroupping<int, DataRow>
 
หรือ IGrouppping<int, DataRow> groupped = table.AsEnumerable().GroupBy( record => record.Field<DateTime>("CreaeDate").Month );
groupped.Key จะได้เป็น เลขเดือนต่างๆที่ group ได้
ข้อมูลที่เหมือนกัน จะถูกรวมกลุ่มไว้ด้วยกัน เช่นว่า เดือนเดียวกัน จะถูกรวบไว้เป็นกลุ่มเดียวกัน
หากต้องการ Group ตามปีและเดือน จะได้
var CutomerHomeTown = from Customer in table.Copy().AsEnumerable() // ก๊อป เพื่อไม่ให้กระทบกับ data หลัก
group Customer by Customer.Field<string>("Village") into custVillage
group custVillage by CustVillage.First().Field<string>("Town") into CustTown
select CustTown;
ก็จะได้ Cuntomer แบ่งตามหมู่บ้าน และแบ่งตามเมือง
 
.OrderBy() เป็นการเรียงตาม field ที่กำหนด เหมือน .Select() ที่ใส่field ลงไป
 
.Where() เป็นการเลือก elements ขึ้นมาโดยใช้ IEquityComparer
เช่น ถ้าต้องการหาข้อมูลในเดือน 7
var Month7 = table.AsEnumerable().Where( record => record.Field<DateTime>("CreateDate").Month = 7 );
ก็จะได้ทุกรายการในเดือน 7 ผลลัพเป็น IEnumerable
 
.ToList() เป็นการแปลง IEnumerable<T> ให้เป็น List<T> ความแตกต่างคือ เมื่อมีการใช้ LINQ ตัว IEnumerable จะยังไม่ทำงาน จนกว่า data ชุดนั้นจะมีการนำไปใช้ การแปลงให้เป็น .ToList จะเป็นการบังคับให้ statement ที่ถูกสั่งไปแล้ว ทำงาน
โดยปกติ IEnumerable จะยังไม่เริ่มการทำงาน ลอง debug ดูทีละ step ต่อให้มัน debug ผ่าน LINQ ไปแล้ว มันก็จะยังไม่ทำงาน จนกว่า data ในตัวมันจะมีการเรียกใช้ ซึ่งตรงนี้ เป็นการ ิoost performance ได้ในกรณีที่ อาจจะมี หรือไม่มีการใช้ LINQ
 
.ToList().ForEach(delegate()
{
 // statements
});
อันนี้ มันก็คือ foreach( in ) ดีๆนี่เอง หลังจากที่อ่านาหลายเวป เค้าสรุปว่า มัน performance ดีกว่า foreach ธรรมดา เนื่องจาก เป็น delegate ซึ่ง ก้ไม่เข้าใจ ว่ามันต่างกันตรงไหน
table.AsEnumerable().ToList.ForEach(delgate(DataRow row)
{
     row.SetFeild<int>("num") = 888;
});
ก็จะเป้นการ set feild num ให้มีค่าเท่ากับ 888
6月21日

LINQ.select( tutorial => tutorial.Part[1] );

LINQ หรือชื่อเต็มๆ คือ Language Intigrated Query เป็นการนำเอา การ query database เข้ามา intgrate ไว้ใน .net เพื่อจะได้ทำการ query จาก source ได้หลากหลายมากขึ้น(มากๆ) ข้อดีคือ สามารถ query ได้เลยใน ภาษา .net ไม่ว่าจะเป็นการ query จาก db, stored procedure, entity, list, array และอีกมากมาย
 
Requirement: คือ มันต้องการ .net 3.5 ขึ้นไป
หลักการทำงานของ LINQ คือ มันสามารถทำการ query ทุกอย่าง ที่ implement iEnumerable interface
iEnumerable คือ?
แปลเป็นไทยได้ว่าอะไรไม่รู้ แต่ว่า interface มัน แปลคร่าวๆว่า "เลื่อนได้" นั่นก็ไม่สน ว่าจะมีความยาวข้อมูลเท่าไหร่ รู้แต่ว่า มันถัดข้อมูลถัดไปได้ และจะหยุด เมื่อสิ้นสุด เปรียบเทียบคร่าวๆ คล้ายกับ class System.IO.Stream คือ สามารถ ReadLine ได้เรื่อยๆ โดยที่เราไม่สนใจ ว่าอยู่ Line ไหน สนใจแค่ว่า มันอ่านต่อได้อีกหรือไม่
 
foreach(... in ...) ต่างกับ for( ; ; ; )?
ต่างกันตรงที่ foreach เราไม่สน ว่ามันจะมีความยาวเท่าไหร่ ให้ความสำคัญที่ข้อมูลแต่ละรายการ ใน foreach เราไม่สามารถไปแก้ value มันได้ หรือหาก assign object ใหม่ไป ก็"อาจจะ"เกิด error ส่วน for loop ธรรมดา เราต้องรู้ก่อน ว่า เราจะวน iteration ไปกี่รอบ วนรอบละอะไรยังไง ซึ่งต่างจาก foreach ที่เราจะวนไปที่รายการถัดไปเท่านั้น
 
query db ง่ายขึ้น?
ปกติ ในการ query db เราต้องประกาศ db connectionstring object, data adapter และอีกมากมาย เวลาใช้ ยังต้องโยนค่าลงไปให้มันเรียก เยอะแยะยาว แต่ว่า ถ้าเป็น Linq เวลาใช้ ให้กด create LINQ to sql มาได้เลย จากนั้น จะใช้ table ไหน ก็ลากลงไป เหมือนตอนสร้าง entity ต่างกันตรงที่ entity จะได้ค่าออกมาเป็น DataSet หรือ DataTable แต่ Linq จะได้ค่าออกมาเป็น Object เลย
 
Linq through Stored Procedure
สามารถทำได้ โดยการลาก stored procedure จาก server explorer ลงไปในหน้าต่างทางด้านซ้าย หาดูวิธีได้จาก youtube
 
การ query ใน linq มี 2 แบบ คือแบบ query statement เลย หรือว่า แบบ inline ย่อๆ
 
Query by using Linq
"ต้อง" ประกาศตัวแปรที่มารับค่า เป็น var เหมือน java เช่น
var query = from q in sp_Table1_Search select q;
สีน้ำเงิน คือ reserved words เห็นมั๊ยว่า ง่ายจิงๆ ต่างจาก query นิดหน่อย ตรงที่เอา select ไว้ท้ายสุด
อธิบาย
var query เป็นการประกาศตัวแปรชื่อ query เอาไว้รับผลการค้นหา เป็นประเภท var ซึ่งแปลว่า ไม่ใช่ตัวแปรธรรมดา var จะไปอ่านมาเอง ว่ามันควรจะเป็นตัวแปรประเภทอะไร
from q อันนี้ ง่าย ก็เป็นตัวแปร ที่ใช้ในการ query มีอายุแค่ใน ;
in sp_Table1_Search อันนี้ สมมุติให้เป็น stored procedure ที่ select * from Table1 ละกัน
select q บอกว่า เราจะเลือกอะไร
 
สมมุติว่า Tabel1 มี col ดังนี้ pk (int), Data(varchar) Value(varchar), CreateDate (datetime)
var query = from q in sp_Table1_Search select q;
StringBuilder result = new StringBuilder( string.Empty );
foreach(var row in query)
     s.Append( row.Data + row.Value + Environment.NewLine );
ก็จะได้ result เป็นค่าดังกล่าวด้านบน ไม่ยากๆ
หรือ ถ้าไม่อยากประกาศ var ก็ทำได้ไม่ยาก
List<T> query = (from q in sp_Table1_Search select q) as iEnumerable<T>
T จะเป็น class อะไรก็ใส่เลย ให้ match กับ result ที่ อ่านมาได้
 
=>
สัญลักษณ์ข้างบน แปลง่ายๆว่า "ที่" ใช้ใน function query
 
สมมุติว่า เรามี
ถ้าเราต้องการหาว่า อันนี้เป็นเวปอะไร ก็หาได้ง่ายๆด้วย LINQ !!
string webURL = myURL.Split("/".ToCharArray()).Single( s => s.ToLower().EndWith(".com") )
webURL จะได้เป็น susie.lol.spaces.live.com
แปลว่า Split my url ด้วย / จากนั้น ให้เลือก single มาอันนึงที่ลงท้ายด้วย "ที่ =>" .com
ข้างบนนี้ จะเป็นการ query แบบ inline สั้นๆ
 
single คือ เลือกมาอันนึง ถ้าresult ที่ได้ ไม่ใช่ 1 มันจะโยน exception ออกมา
 
ส่วนถ้าจะเลือก group by ก้ได้ แต่จะ advance ไปนิด ไว้ต่อ part[2]
ซึ่ง จะมี aggregate function เข้ามาด้วย เช่น max, group by
3月24日

วิธีใช้ 32bit Ex Layer บน Windows

ถ้าเป็นบน Windows XP ทั่วไป การจะนำภาพ 32bit มาใช้ทำได้ยากชิบ แต่ถ้าเป็นใน vista ตัวนี้ถูกพัฒนาขึ้นแล้ว สามารถยัดภาพ 32bit ใช้ได้สบายๆ แต่ถ้าเป็น xp ยังต้องมานั่งเหนื่อยเหมือนเดิม
วิธีการสร้าง windows 32 bit เริ่มได้จาก
 
1 สร้าง memDC
- ขั้นแรก สร้าง object Bitmap ขึ้นมาก่อน แล้วกำหนดให้เป็น Bitmap color แบบ 32bit argb
System.Drawing.Bitmap bmpTemp= new System.Drawing.Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
โดย object ที่ใช้นั้น จะต้องไม่โดน garbage collector เก็บไประหว่างที่ยังใช้งานอยู่
- สร้าง Graphics object ธรรมดาขึ้นมา
System.Drawing.Graphics gPrototype = System.Drawing.Graphics.FromImage(bmpTemp as System.Drawing.Image));
ตัว Prototype สร้างเป็น object ชั่วคราว
- สร้าง MemDC ขึ้นมา จาก DC เดิมที่มีอยู่ จากตัว graphics ชั่วคราว
System.Drawing.Graphics gMain = System.Drawing.Graphics.FromHdc(gPrototype.GetHdc());
gPrototype.ReleaseHdc();
gPrototype.Dispose();
gMain คือ ตัวที่เราจะเอาไปใช้ ส่วน Hdc นั้น ตัว H เป็นตัวบอกว่า obj นั้น เป็น int pointer ของ DC ตรงนี้ เปรียบกับการใช้ VC++ ได้ด้วยการสั่งสร้าง memDC จาก DC เพราะปิ๊งไอเดียได้ขึ้นมาจาก สร้าง DC จาก DC เนี่ยนะ ไม่เข้าใจว่า ทำไปเพื่ออะไร ก็เลยคิดว่า หรือว่า มันจะเป็นการจับยัดเข้า mem ซึ่ง ก็ใช้
Hdc เมื่อถูกเรียกใช้ จะต้องทำการ release ก่อนที่จะแก้ไขครั้งต่อไป GetHdc จะทำการ lock DC ไว้ไม่ให้เกิดการเปลี่ยนแปลง
ทีนี้ ก็ได้ gMain ซึ่งเป็น Graphics Device Context แบบ 32bit มาซักที สามารถเอาไปวาดด้วย GDI ของ .Net ได้
 
2 สร้าง Params ที่บอกว่า windowsนี้ จะอยู่ใน Ex Layer
- protected override System.Windows.Forms.CreateParams CreateParams
- ใน Get ใส่ base.CreateParams.ExStyle |= 0x00080000;
ทั้งนี้ เพื่อบอกว่า หน้าต่างโปรแกรมนี้ อยู่ใน Ex Layer ซึ่ง เป็น layer เดียวที่สามารถแสดงสีแบบ 32bit ได้
 
3 ในการแก้ไขใดๆที่ทำให้หน้าต่างมี visual property เปลี่ยนไป เราจะต้องจัดการสั่งงานเองทั้งหมด ขั้นตอนนี้จะเป็นต้องเรียกใช้ MFC เป็น class ของ user32.dll
- [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
public static extern Bool UpdateLayeredWindow
ต้อง import dll ขึ้นมาใช้
 
วิธีการทำด้วย .Net ทำให้ง่ายกว่ามาก เวลาวาดด้วย GDI แต่กว่าจะทำได้ เหนื่อยขี้แตก
3月23日

ระบบสี ของ Windows

ระบบสีของ Windows ที่ใช้ เป็นระบบสีแบบ 32 bit หรือ ใช้เลข 01 ทั้งหมด 32 ตัว เพื่อแสดงสี 1จุด แต่ในความจิงแล้ว สีที่แสดงที่หน้าจอนั้น ไม่ใช้ 32 bit แต่เป็น 24 bit ต่างหาก ทำให้ หน้าจอ1จุด สามารถแสดงสีได้ 2^4 x 2^20 ก็คือ 16 ล้านสี
32bit ที่ว่า แล่งเป็น 4 channel ด้วยกัน เป็น ARGB คือ Alpha, Red, Green และ Blue แต่ละแม่สี ใช้8 bit เพื่อนแสดงสีของแม่สีนั้นๆ เพื่อนำมาผสมสี ถ้า argb มีค่าเป็น0หมดนั่นแสดงว่า เป็นสีดำสนิท
Alpha เป็นchannel พิเศษ มันไม่ใช่แม่สี เป็นเป็น channel ของเงา ในกรณีที่ Alpha ไม่ใช่ 0 นั่นหมายความว่า มันเป็นสีโปร่งใส เช่นว่า เหมือนแก้วที่มีสีปน ความยุ่งยากจะเกิดตรงที่ ถ้า alpha ไม่ใช่0 แล้วมีobjectซ้อนทับกันอยู่ จะต้องเกิดการผสมสีขึ้น ซึ่ง ทำให้การแสดงผลช้าลง เหมือนกับว่า มองผนังสีเหลือง ผ่านแก้วใสสีน้ำตาล
ถ้า alpha ไม่ใช่ 0 การผสมสีที่เกิด จะทำให้คอมประมวลผลได้ช้าลง เลยทำให้ หน้าต่างโปรแกรมปกติ จะใช้สีแค่ 24 bit ส่วน Alpha channel จะมีใช้ก็เฉพาะในหน้าต่างที่กำหนดลงไปเท่านั้น ว่า จะใช้ alpha channel ซึ่ง จะทำให้เรากำหนดความโปร่งใสได้ ซึ่ง จะต่างกับ Opacity ตรงที่ opac เป็น alpha channel เหมือนกัน แต่ทุกส่วนของหน้าต่างโปรแกรมที่ใช้ opac จะมี alpha เท่ากันหมด
ทางเดียวที่จะกำหนดเงาในแต่ละจุดเอง หรือ กำหนดสีแบบ 32bit ด้วยตัวเองนั้น เราต้องสั่งให้ หน้าต่างนั้น อยู่ใน layer พิเศษ เรียกว่า Windows Ex Layer ทำได้โดย over ride method ของการสร้างหน้าต่าง และใส่ message flag ลงไป ว่าให้มันไปอยู่ใน ex layer
แต่ มันไม่ง่ายขนาดนั้น หน้าต่างโปรแกรมที่ไปอยู่ใน ex layer นั้น เราจะต้องสั่งวาดด้วยตัวเอง เพราะ default painting method จะไม่ทำงานเลย ถ้าหน้าต่างไม่ได้อยู่ใน layer ปกติ ข้อจำกัดจะมากขึ้น เช่นว่า จะทำ MDI ไม่ได้ มีหน้าต่างลูก หรือเป็นหน้าต่างลูกไม่ได้ และการสั่งวาดด้วยตัวเองนั้น เหนื่อยขี้แตก ในเมื่อ OnPaint นั้น ไม่ทำงานเลย เราจึงต้องสร้าง graphic ด้วยมือล้วนๆ เริ่มตั้งแต่การสร้าง Device context ศึ่งเป็นเหมือนผืนผ้าใบ สำหรับวาดเอง ซึ่ง สร้างด้วยวิธีปกติไม่ได้  และจากนั้น เมื่อได้ GDC(Graphics Device Context) มาแล้ว การวาดปกติ ต้องใช่้ Microsoft Foundation Class ด้วย ใครที่ไม่ถนัด VC++ ก็ตายกันไปเลย
ต่อให้ใช้ VC++ ก็เสียเวลามากอยู่ดี และการสร้าง GDC นั้น จะต้องไม่ใช่ DC ธรรมดา จะต้องเป็น GDC ซึ่ง จิงๆก็คือ pointer ที่ pointไปที่ตัวเก็บข้อมูลของมัน จะต้อง point ไปใน address ที่ fix อยู่ใน ram เท่านั้น DC แบบนี้ เรียกว่า MemDC
แต่ มันมีเทคนิค ที่ทำให้สามารถสร้าง 32bit GDC ที่สามารถใช้ System.Graphic ของ .Net เป็นตัววาด ซึ่ง ทำให้งานง่ายขึ้นหน่อย
3月5日

Singularity - C# operating system

โปรเจคใหม่ ของ Microsoft ที่กะลังซุ่มพัฒนาอยู่ ไม่รู้จะออกมาในอีกกี่ปี ชื่อโปรเจคนึงคือ Windows7 คือ ได้ยินว่า เป็น Windows ตัวใหม่ ที่จะวางระบบ Kernel(ภายใน) ใหม่หมด ก็ไม่ได้คิดอะไร คิดว่า เด๋วมันก็คงสวยขึ้น เร็วขึ้น กินแรมมากขึ้น เล่นเกมมันขึ้น แต่ที่ไหนได้ Research Project ตัวนี้ จะสร้าง Operating System ใหม่ยกระบบชนิดที่ว่า เป็นการพลิกวงการเลยก็ว่าได้ ตัว Operating System ตัวใหม่ มีชื่อว่า Singularity ความพิเศษ ไม่ได้อยู่ที่ความสวยงาม หรือความปลอดภัย แต่อยู่ที่ Kernal มันเป็นภาษา C#
OS(Operating System) คือ โปรแกรมที่จะทำการควบคุมการปฏิบัติการของคอมทั้งหมด เช่น WindowsXP หรือ Vista ซึ่ง ที่ผ่านๆมา เขียนด้วยภาษา C++ ข้อดีคือ เร็ว แต่ข้อเสียคือ ยุ่งยาก และซับซ้อน ทำให้ช้าต่อการพัฒนา C# ดีกว่า ตรงที่ มันทำงานบน .net แล้ว .net จะไปสั่งงาน OS อีกที ข้อดีคือ พัฒนาง่าย เพราะ .net เป็นเหมือนตัวกลาง ที่ช่วยในการเขียนโปรแกรม ข้อเสียน้อยมาก เพราะการทำงานผ่านตัวกลางอย่าง .net ไม่ได้ทำให้ช้าลงเท่าไหร่
โปรเจค Singularity น่าสนใจตรงที่ เค้าพัฒนา OS โดยใช้โครงจาก .net มาเป็น OS ตัวใหม่ ใช้ C# ลึกถึงระดับ Kernel และ Driver แต่ในระดับ Assembly ยังใช้ C กับ C++ เหมือนเดิม ข้อดีคือ ทำให้การเขียนโปรแกรม หรือแม้แต่การพัฒนาตัว OS เอง ทำได้เร็วขึ้น และตัว OS จะปลอดภัยขึ้น ข้อเสียที่เห็นได้ชัด คือ แดกแรมมหาศาลแหงๆ แล้วก็ ถ้า cpu ไม่เร็วจิง คงใช้ Singularity ไม่ได้
ข้อดีอย่างยิ่งยวดคือ ป๋มคล่อง C# 55 นั่นหมายความว่า จากนี้ อาจจะสามารถ mod driver ต่างๆ หรือแม้แต่ระดับ kernel ได้ด้วยตัวเอง งานนี้ C# นำขาด Java แน่นอน