protect
ถ้าเอาบทความไปเผยแพร่แล้วไม่ให้เครดิต ดำเนินคดีด้วย พรบ. คอมพิวเตอร์ฉบับใหม่ ขั้นสูงสุดและไม่ยอมความครับ
วันอังคารที่ 15 กันยายน พ.ศ. 2558
รู้จักกับ CLS ตอนที่ 2
บทความนี้มีการ reference มาจาก CLS Compliance ของ MSDN
เนื่องจาก CLS ของ Microsoft เป็นมาตรฐานสำหรับการพัฒนา software หรือ library เพื่อให้นักพัฒนาท่านอื่นสามารถนำไปใช้งานได้ ระหว่างที่เรากำลังพัฒนา library เราสามารถให้ compiler ตรวจสอบ code ที่เราเขียนขึ้นว่ารอบรับ CLS-compliant หรือไม่ ด้วยการระบุใน assembly ตามตัวอย่าง code ข้างล่าง
using System;
[assembly:CLSCompliant(true)]
namespace CLS
{
public class Person
{
public Person()
{
}
public Int32 Age
{
get { return 0; }
}
}
}
ถ้าเราเขียนโปรแกรมด้วย Visual Studio เราควรนำ [assembly:CLSCompliant(true)] ไปไว้ใน file AssemblyInfo.cs ภายใต้ folder Properties แต่ต้องจำไว้ว่า CLSCompliant เป็น member ของ namespace System จึงต้องมั่นใจว่าที่ file AssemblyInfo.cs มีการ using System; น่ะครับ
สำหรับตัวอย่าง code ข้างบนผมนำเอา [assembly:CLSCompliant(true)] มาไว้ที่ main code
จาก code เมื่อทำการ compile เราจะไม่ได้ warning message แต่ถ้าเปลี่ยน return type ของ property Age จาก Int32 เป็น UInt 16 ดัง code ข้างล่าง
public UInt16 Age
{
get { return 0; }
}
compiler สามารถ compile code และสร้าง manage file สำเร็จแต่ compiler จะ report warning message "Type of 'CLS-Person.Age' is not CLS-compliant" ตัวอย่างรูปข้างล่างน่ะครับ
สำหรับตัวอย่างนี้สาเหตุที่ไม่เป็น CLS-compliant เป็นเพราะว่าไม่ใช่ทุกภาษาที่จะรองรับ type UInt16 โดยเฉพาะภาษา VB.Net ดังนั้นถ้า class นี้ถูกนำไปใช้กับภาษา VB.Net ตัว property Age อาจจะใช้งานได้ไม่ถูกต้อง
แต่ถ้าเรามั่นใจว่า property Age สามารถใช้ได้กับทุกภาษาและต้องการ by pass การเช็ค CLS-compliant เฉพาะ property Age เราสามารถเขียน code ได้ดังนี้
[CLSCompliant(false)]
public UInt16 Age
{
get { return 0; }
}
แค่นี้เราก็สามารถ compile code โดยที่ไม่มี warning messageแล้วครับ แต่ไม่ควรทำน่ะ
พบกันใหม่ตอนหน้าตอนที่ 3 ครับ
TuChay
วันเสาร์ที่ 12 กันยายน พ.ศ. 2558
รู้จักกับ CLS ตอนที่ 1
บทความนี้มีการ reference มาจาก CLS Compliance ของ MSDN
จนมาถึงตอนนี้เราก็รู้จักกับ .Net Framework และภาษา IL กันมากขึ้น จากบทความ Common Type System ที่ผ่านมาผมได้อธิบายไปแล้วว่าเราสามารถที่จะเขียนภาษาเป็นของตัวเองได้ ในบทความชุดนี้จะเป็นการกล่าวถึงกฏการพัฒนา component software ที่เราต้องปฏิบัติตามอย่างเคร่งครัด
component software คือการพัฒนา software ชนิด library เพื่อให้นักพัฒนา software หรือ programmer ทีมอื่นเป็นคนเรียกใช้ ตัวอย่างของ component software เช่น driver library ของ hardware ที่เราพัฒนา hardware ชุดนั้นขึ้นมาเอง หรือ library สำหรับให้คนอื่นติดต่อกับ software system ด้วย Web Service เป็นต้น
จะเห็นว่า component software ที่เราพัฒนาขึ้น เราไม่สามารถระบุเจาะจงภาษาของนักพัฒนา software ที่เรียกใช้ library ของเราได้ ดังนั้นจึงเป็นไปได้ว่าคนที่เรียกใช้ library ที่เราพัฒนาจะพัฒนาด้วยภาษาที่หลายหลายและด้วยข้อกำหนดหรือรูปแบบของการเขียน code ของแต่ล่ะภาษาก็จะไม่เหมือนกัน เพื่อให้ component software หรือ library ของเราใช้ได้กับทุกๆ ภาษาของตะกูล .Net Framework ดังนั้น Microsoft จึงเขียนข้อกำหนด เกี่ยวกับการพัฒนา library ใส่ลงไปใน ECMA-335 หัวข้อ Stand Common Language Infrastructure โดยข้อกำหนดนี้ถูกกำหนดภายใต้ชื่อ CLS - Common Language Specification.
ในบทความชุดนี้จะเป็นการพูดถีงข้อปฏิบัติตามกฏของ CLS ซึ่งจะเป็นอะไรบ้างนั้น .... พบกันใหม่บทความหน้าครับ
TuChay
วันพฤหัสบดีที่ 10 กันยายน พ.ศ. 2558
Indexer ใน C# ตอนที่ 2
เรามาต่อจากตอนที่ 1 กันเลย
ในตอนที่แล้วผมได้เขียน code ที่ indexer มี signuature เป็น int อย่างเดียว ที่นี้เราลองเพิ่ม Indexer อีกหนึ่งตัวน่ะครับที่มี signature เป็น string.
public int this[string name]
{
get
{
for (int i = 0; i < 7; i++)
{
if (nameOfDay[i] == name)
return i;
}
return 99;
}
}
ใน IL code เราก็จะได้ method ที่ชื่อ get_Item อีกหนึ่งตัวแต่ signature ตัวใหม่จะเป็น get_Item : int32(string) คือรับ parameter เป็น string และ return int กลับไปให้ caller.
นอกจากนั้นเรายังจะได้ property อีกหนึ่งตัวที่ชื่อ Item : instance int32(string)
ต่อไปเราลองมาเพิ่ม C# code จาก read only มาเป็น property ที่สามารถ update ได้ ตาม code ข้างล่างครับ
public string this[int index]
{
get
{
if (index > nameOfDay.Length)
return "";
else
return nameOfDay[index];
}
set
{
if (index > nameOfDay.Length)
throw new Exception("The day should have only 7 day");
else
nameOfDay[index] = value;
}
}
จาก นั้นลอง compile code แล้วมาดู IL code กันครับจะเห็น method ที่เพิ่มเข้ามาอีก 1 method คือ set_Item : void(int 32, string) จะเห็นว่า signature จะเปลี่ยนมาเป็นรับค่า 2 parameter คือ int กับ string
โดยที่ parameter ชนิด int คือ ตำแน่งของ index และ string ก็คือ value ที่ assign ให้กับ index ตัวนั้น
จบแล้วครับสำหรับ Indexer ในภาษา C# และภาษา IL พบกันใหม่บทความหน้าครับ
TuChay
วันพุธที่ 9 กันยายน พ.ศ. 2558
Indexer ใน C# ตอนที่ 1
จาก code ของบทความ Common Type System ตอนที่ 2 ผมได้ยกตัวอย่าง method ชนิด indexer แต่ยังไม่ได้อธิบายอย่างละเอียด ผมขออธิบายรายละเอียดในบทความนี้น่ะครับ
Indexer คือ การดึงข้อมูลหรือ update ข้อมูลผ่าน instance object โดยใช้ index เป็น paremeter เรามาดูตัวอย่าง code กันครับ
class Program
{
static void Main(string[] args)
{
Weekly week = new Weekly();
for(int i=0;i<7;i++)
Console.WriteLine(week[i]);
Console.ReadLine();
}
}
public class Weekly
{
private string[] nameOfDay = new string[7] {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
public Weekly()
{
}
public string this[int index]
{
get
{
if (index > nameOfDay.Length)
return "";
else
return nameOfDay[index];
}
}
}
Indexer ของ class Weekly คือ public string this[int index] เราสามารถเรียกใช้ indexer ผ่าน object ได้เลยด้วย week[i] โดยที่ i ถือเป็น parameter ของ indexer นี้ครับ
เมื่อเรามาดู IL code จะได้ดังรูปข้างล่าง
C# compiler ได้สร้าง method ที่ชื่อ get_Item : string(int32)
string(int32) จะหมายถึง method นี้จะรับ parameter เป็น int32 และ method จะ return string กลับไปให้ caller
code ของ method สามารถเข้าไปดูได้โดยการ dobule click ที่บรรทัดนี้ ชื่อของ method C# compiler ตั้งชื่อตามหลักของ method คือนำ "get_" นำหน้า "Item" เพราะว่าเป็น method ชนิด indexer
เมื่อ เทียบกับภาษา C# method get_Item ก็คือ code นี้ครับ
public string this[int index]
{
get
{
if (index > nameOfDay.Length)
return "";
else
return nameOfDay[index];
}
}
นอกจากนั้น C# Compiler ยังได้สร้าง property ที่ชื่อ Item ใน บรรทัด Item : instance string(int32) เพื่อเป็นการสร้าง indexer สำหรับให้ caller เรียกใช้ เมื่อ double click ที่บรรทัดนี้ จะได้ดังรูป
เนื่องจาก Indexer Weekly ใน C# code ข้างบน เป็นการอ่านแบบ read only คือ ไม่มี คำสั่ง set มีแต่คำสั่ง get ใน IL code ของ property Item จึงมีแค่ .get เท่านั้น
พบกันใหม่ตอนที่ 2 ตอนหน้าครับ
TuChay
วันจันทร์ที่ 7 กันยายน พ.ศ. 2558
รู้จักกับ Shell บน Linux ตอนที่ 2
เรามาต่อจากตอนที่ 1 เลยน่ะครับ
ในช่วงนั้นระบบปฏิบัติการ Unix เป็น Open source แต่เรื่องของ license ยังเป็นสิ่งที่คลุมครือ และมีบางบริษัทนำระบบปฏิบัติการ Unix ที่เป็น Open source มาพัฒนาต่อเพื่อให้เป็น commercial version ของตัวเองและทำการออกจำหน่าย โดย commercial version ที่จำหน่ายก็ไม่เป็น open source อีกต่อไปซึ่งผิดวัตุประสงค์ของ Open source จึงทำให้เกิด project ที่ชื่อว่า GNU (Genernal public license) โดยผู้ก่อตั้งที่ชื่อ Richard Stallman
หนึ่งใน GNU project คือ Unix-compatible operating system ภายใต้ open sourcee และ free license จุดประสงค์หลักก็เพื่อเอามาแทนที่ Unix ที่มี license เป็นเชิงพาณิชย์ ใน project นี้ มีผู้ดูแลรับผิดชอบเกี่ยวกับ shell คือ Chet Ramey โดย shell ที่เขานำมาใช้ในระบบปฏิบัติการมีชื่อว่า Bourne Again Shell หรือ bash
bash version แรกถูกเขียนขึ้นโดย Brain Fox และถูก release ออกมาเมื่อวันที่ 10 มกราคม 1988 โดยการรวมเอาข้อดีหลักๆ ของ C shell และ Korn shell มาไว้รวมกันโดยพัฒนามาจาก code พื้นฐานของ Bourne shell และในปี 1989 Chet Ramey ได้ดึง Brain Fox เข้ามารวมทีมเพื่อที่จะนำ bash เป็น shell พื้นฐานของ Unix open source ที่เขาดูแลอยู่และในปัจจุปัน Chet Ramery เป็นผู้รับผิดชอบอย่างเป็นทางการในเรื่องของการแก้ bug และ improve feature ต่างๆ ของ bash เนื่องจาก bash เป็น shell แบบ free license จึงเป็นที่นิยมนำมาใช้เป็น shell มาตรฐานใน Linux หลายสายพันธุ์ รวมถึง Mac OS X ของ apple ด้วย
ในวันที่ 23 ธันวาคม 1996 Chet Ramey ได้ release bash version 2.0 (version ก่อนหน้านี้เป็น version 1.14.7) และ release version 3.0 ในวันที่ 27 กรกฏาคม 2004 จนกระทั่ง version ปัจจุปัน version 4 ที่ Chet Ramey ได้ release เมื่อวันที่ 20 กุมภาพันธ์ 2009
บทความต่อจากนี้ของผมจะพูดเกี่ยวกับการเขียน shell script บน bash เท่านั้นน่ะครับ
แล้วพบกันบทความหน้าครับ
TuChay
วันพฤหัสบดีที่ 3 กันยายน พ.ศ. 2558
รู้จักกับ Shell บน Linux ตอนที่ 1
ในยุคประมาณปี 1960 เป็นยุคเริ่มต้นของระบบ Unix และเป็นที่นิยมอย่างแพร่หลายในปี 1970 ในตอนนั้นเราแบ่งการทำงานของระบบ Unix เป็น 3 ส่วน คือ ส่วนที่เป็น input ส่วนที่ประมวลผล และส่วนที่เป็น output
ส่วนที่เป็น input กับส่วนที่เป็น output เป็นส่วนตรงกลางระหว่าง user หรือผู้ใช้กับหน่วยประมวลผล โดย input จะทำหน้าที่รับคำสั่งผ่านทาง keyboard แล้วแปลงคำสั่งนั้นส่งไปให้ ระบบปฏิบัติการ Unix เพื่อให้ CPU ประมวลผลและเมื่อได้ผลลัพท์ที่ได้จึงนำมาแสดงในส่วนที่ เป็น output นั้นคือ monitor นั้นเอง
ส่วนที่รับคำสั่งผ่านทาง keyboard แล้วแปลงคำสั่งเพื่อส่งไปให้ Unix ประมวลผลแล้วแสดงผลที่ได้ออกทาง monitor นี้แหละครับ เราเรียกว่า shell
ในสมัยนั้น Shell ที่ได้รับความนิยมมากที่สุดคือ Bourne shell version 7.0 สร้างและพัฒนาโดย Steven Bourne โดยเริ่มใช้ตั้งแต่ปี 1979 Bourne shell เราจะเขียนสั้นๆ ว่า sh
เนื่องจากโครงสร้างหรือรูปแบบคำสั่งของ sh เป็นคำสั่งง่ายและยังไม่สนับสนุนคำสั่งที่มีความซับซ้อน Bill Joy แห่งมหาวิทยาลัย Berkeley จึงได้พัฒนา Shell ใหม่ขึ้นเรียก C shell มีชื่อย่อว่า csh โดยรูปแบบคำสั่งของ shell จะมีลักษณะคล้ายกับภาษา C ทำให้นักพัฒนาที่มีความรู้ภาษา C สามารถสร้างสรรค์คำสั่งที่ซับซ้อนได้ดีขึ้นแต่ข้อเสียของ C Shell คือไม่ backward complitable กับ Bourne shell นั้นคือคำสั่งบางคำสั่งที่เคยใช้ได้ใน Bourne shell กับใช้ไม่ได้ใน C Shell.
หลังจากนั้นก็มี Shell เกิดขึ้นมาใหม่มากมายและเป็นที่นิยมใช้เช่น Korn Shell หรือตัวย่อ ksh โดย David Korn จาก AT&T โดยการรวมข้อดีของ C Shell และ Bourne shell เข้าด้วยกัน Korn shell สามารถ download ได้ฟรีแต่ผู้ download จะต้องจ่ายค่า license สำหรับบางสถาณการณ์
พบกันใหม่ตอนหน้าครับ
TuChay
วันพุธที่ 2 กันยายน พ.ศ. 2558
Common Type System (CTS) ตอนที่ 4 (ตอบจบ)
จาก code ตัวอย่างของ ตอนที่ 2 ในส่วนของตัวแปรชนิด event ของ C# code
public event EventHandler thisIsEvent;
code ข้างบนเมื่อถูก compile ด้วย C# compiler ตัว compiler จะสร้าง member ขึ้นมาทั้งหมด 4 ตัวในภาษา IL ดังรูปข้างล่าง
ตัวแรก คือ field ที่ชื่อ thisIsField (หมายเลข 1 ในรูป) โดย C# compiler จะสร้างเป็น member ชนิด private โดยมี type เป็นชนิด EventHandler ซึ่งเป็น type ที่อยู่ใน namespace System ของ MSCorLib.DLL
ตัวที่สองและสามคือ method ที่ชื่อ add_thisIsEvent (หมายเลข 2 ในรูป) กับ remove_thisIsEvent (หมายเลข 3 ในรูป) โดย C# compiler สร้าง method name โดยใส่ "add_" และ "remove_" รวมกับชื่อ field (หมายเลข 1 ในรูป)
ตัวที่สี่ คือสมาชิกชนิด event (หมายเลข 4 ของรูป) มี modifyer เป็นชนิด public สำหรับให้ caller เรียกใช้ ถ้าเรา double click ที่บรรทัดหมายเลข 4 ก็จะได้ ภาษา IL code ดังรูป
เมื่อ caller ทำการ subscribe event thisIsEvent ด้วย operator "+=" ตัว runtime ก็จะใช้คำสั่ง .addon เพื่อที่จะไปเรียก method add_thisIsEvent
และเมื่อ caller unsubscribe event thisIsEvent ด้วย operator "-=" ตัว runtime ก็จะใช้คำสั่ง .removeon เพื่อที่จะไปเรียก method remove_thisIsEvent
ลองดูตัวอย่าง code ที่ caller เรียกใช้ event thisIsEvent
static void Main(string[] args)
{
Program pg = new Program();
pg.thisIsEvent += new EventHandler(pg_thisIsEvent);
pg.thisIsEvent -= new EventHandler(pg_thisIsEvent);
}
static void pg_thisIsEvent(object sender, EventArgs e)
{
}
code pg.thisIsEvent += new EventHandler(pg_thisIsEvent); ณ ตอน runtime JITCompiler จะไปเรียกใช้คำสั่ง .addon ของ event thisIsEvent ซึ่งก็คือไปเรียกใช้ method add_thisIsField
สำหรับ code pg.thisIsEvent -= new EventHandler(pg_thisIsEvent); ณ ตอน runtime JITCompiler จะไปเรียกใช้คำสั่ง .removeon ของ event thisIsEvent ซึ่งก็คือไปเรียกใช้ method remove_thisIsField
จบแล้วครับสำหรับการแนะนำ type ทั้ง 4 ชนิดของภาษา IL พร้อมทั้งตัวอย่าง code ของ C# ถ้ามาถึงตอนนี้เราก็พอจะมีความรู้มากขึ้นในภาษา IL น่ะครับ จากตัวอย่าง code ของตอนที่ 2 ผมติดคำอธิบายเรื่องของ Indexer ซึ่งผมจะไปอธิบายพร้อมทั้งแสดงวิธีใช้ในอีกตอน
พบกันใหม่ตอนหน้าครับ
TuChay
สมัครสมาชิก:
บทความ (Atom)






